Macro assert là một công cụ rất hữu ích đối với các kỹ sư lập trình. Macro là một tập các phát biểu của hợp ngữ hay ngôn ngữ bậc cao mà có thể được gọi ra bằng các từ đơn hay các cụm từ trong mã nguồn, macro làm giảm các bước gõ lệnh và tăng tính dễ hiểu bởi ý tưởng thay các cụm từ phổ biến thường dùng bằng một phát biểu đơn [2]. Macro có thể tự động thực hiện thao tác và làm giảm các bước cũng như thời gian hoàn thành công việc.
Macro assert là một biểu thức đơn: nếu biểu thức trả lại giá trị true thì hàm
assert không làm gì cả; nếu biểu thức trả về giá trị false thì hàm assert làm cho chương trình bị ngừng lại và đưa ra một số thông báo hữu ích.
Chúng ta dùng hàm assert cho chương trình kiểm tra những thứ mà ta chắc chắn là phải đúng, hay nói cách khác là kiểm tra các lệnh trong chương trình của chúng ta có đúng không. Việc sử dụng assert một cách hợp lý sẽ làm cho chương trình dừng lại đúng cách, tránh cho chương trình phải dừng lại sau khoàng 100.000 lệnh.
Các macro assert giúp tìm kiếm các lỗi một cách sớm nhất có thể để chúng ta có cách giải quyết với chúng. Điều này rất có ích khi chúng ta kiểm thử trên máy chủ. Tuy nhiên, trên máy đích hầu hết các hệ thống nhúng không có một thiết bị hiển thị thích hợp để hiển thị các thông báo của hàm assert. Hơn nữa, trong các chương trình ứng dụng, hàm assert sẽ gọi ra các hàm exit hay abort để dừng chương trình lại, nhưng trong các hệ thống nhúng thì thường không tồn tại các hàm đó. [4]
Việc định nghĩa các marco có thể khác nhau giữa các trình biên dịch, nhưng thường chúng được viết trong tệp assert.h và có dạng như sau:
Bảng 3.1 Mã lệnh của hàm NDEBUG
#ifdef NDEBUG
#define assert(bool_expression) //Xác định assert #else
#define assert(bool_expression) if(bool_expression) ;
else
bad_assertion(_FILE_, _LINE_, #bool_expression);
#endif
Các hàm macro thường được biên dịch không có lệnh như NDEBUG, nó thường là các biểu thức logic trả về cho chương trình giá trị true hay false. Việc định nghĩa các hàm assert một cách chính xác rất quan trọng, vì nó sẽ làm ảnh hưởng đến hệ thống của chúng ta, có thể làm giảm hiệu suất của hệ thống.
Hàm bad_assertion sẽ giúp chúng ta phát hiện được các lỗi của chương trình sớm khi biên dịch. Các hàm bad_assertion được viết để thực hiện các công việc sau:
• Vô hiệu hóa các ngắt hay các vòng lặp vô hạn, giúp cho chương trình dừng lại đúng cách và ta có thể biết được chương trình của chúng ta đang làm gì.
• Bật một số đèn led hay các âm thanh đặc trưng để chúng ta biết được rằng hệ thống đang có vấn đề.
• Ghi ra giá trị của các biểu thức vào các vị trí nhớ đặc trưng, mà chúng ta có thể bắt được các kết xuất đó bằng bộ phân tích logic.
• Ghi ra vị trí các lệnh mà nó gọi từ các vị trí nhớ đặc trưng.
• Thực thi một lệnh không hợp lý hay làm bất kỳ điều gì cần thiết để dừng hệ thống mà không làm tổn hại đến chương trình.