把assert 单独放一篇文章,可见是多么的重要。Raw os 提供了RAW_ASSERT 的接口。强烈建议在产品研发阶段打开assert 功能
/*enable assert for raw os*/
#define CONFIG_RAW_ASSERT 1
RAW_ASSERT 是一个宏,移植的时候放在raw_cpu.h 里面,比如VC 上的移植如下。
#define RAW_ASSERT(CON) if (!(CON)) {printf("file is %s\nLine is %d\n", __FILE__, __LINE__); \
printf("aborted task name is %s\n", raw_task_active->task_name); \
while (1); }
需要打开串口的功能,但是有的时候串口打开比较麻烦,怎么办呢。最简单的移植是:
#define RAW_ASSERT(CON) if (!(CON)) {volatile RAW_U8 dummy = 0; while (dummy==0);}
但是这样的话就看不到有效debug信息,资源紧缺的话建议这样的移植
#define RAW_ASSERT(CON) if (!(CON)) {volatile RAW_U8 dummy = 0; led1_on();while (dummy==0);}
led1_on() 操作寄存器使能一个小灯,用来告诉用户系统出错了。
RAW_ASSERT 的时候可以串口打印任何全局变量,最常用的是打印raw_task_active 的信息 告诉你是哪个任务跑的有问题,告诉你哪一行,哪一个文件,甚至哪一个函数有问题。
raw_idle_task 里面assert的话说明哪个任务栈空间不够了,那个时候不够栈空间的任务被保存到raw_task_active 然后assert
raw_task_active = task_ptr;
RAW_ASSERT(0);