调试代码经常会有跑崩的时候,当整机调试是出问题特别让人崩溃,断言机制能很好的定位由于参数错误导致的系统异常的情况。
在代码重要的代码区,添加断言,相当于对出入参数做了预判操作,当参数不符合条件时,程序不再继续执行,同时打印错误信息。
#define ASSERT(message, 表达式) do { if(表达式) \
TEST_ASSERT(message); } while(0)
#define TEST_ASSERT(x)\
do {printf("\"%s\"failed at line %d in %s\r\n",x,__LINE__,__FILE__);\
}while(0)
断言方式:当参数满足"表达式"时,执行断言TEST_ASSERT,同时打印错误信息。错误信息格式可自定义输出格式,
使用方式:
void test(int a)
{
LWIP_ASSERT("Paramter Err",(a>255));
}
#define assert_param(表达式) ((表达式) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
void assert_failed(uint8_t* file, uint32_t line)
{
printf("Wrong parameters value: file %s on line %d\r\n", file, line);
while(1);
}
断言方式:如果表达式为ture,则执行(void)0,空操作。如果为false则执行assert_failed()
使用方式:(引用自STM32 串口配置文件)
assert_param(IS_USART_ALL_PERIPH(USARTx));
此为STM32库文件截取的断言,所达到的目的同上
断言可在项目开发阶段的初前期快速的定位一些编译器识别不到的错误,让我们在编程("掉头发")的路上事半功倍