assertEFM用法小结
来源:互联网 发布:安徽炎黄网络 编辑:程序博客网 时间:2024/05/16 05:32
如果使用过EFM32的CMSIS库,那么肯定也看到过EFM_ASSERT这个宏,几乎无处不在。
一:assertEFM函数
1. 这个宏定义在哪里,函数原型是什么?你可以右键 go definition of 也可工程中查找。
这是em_assert.c中的assertEFM函数。
这是em_asset.h中关于EFM_ASSET的宏定义。
下面来分析下这个函数
1、const char *file, int line这两个参数是何作用? 这是官方源码上的解释。
就是告诉我们是哪个源文件哪行出错了。
2、#define EFM_ASSERT(expr) ((expr) ? ((void)0) : assertEFM(__FILE__, __LINE__))
由这个宏定义可知,如果expr为真则((void)0即什么都没发生,如果为假就调用assertEFM()函数。
__FILE__指向正编译的源文件。
__LINE__指向正编译源文件的哪一行。
__LINE__, __FILE__都是IAR中预先定义好的symbol。
3、所以就是当调用EFM_ASSERT()时,如果expr为假,程序将停在发生错误的源文件的发生错误的哪一行(while(1))。
二:使用assert_EFM()
ASSERT功能最大的好处是在前期进行软件调试的时候,帮助用户找出一些潜在的bug。但是在后期Release时,一定记得要关掉。
通过在IDE中预定义DEBUG_EFM宏来开启ASSERT功能。取消预定义,则关闭该功能。
以下,举个具体的例子。目前有如下的一段代码,开启Assert功能之后,看看会发生什么事情:
int main(void)
{
CHIP_Init();
CMU_ClockEnable(cmuClock_GPIO,true);
CMU_HFRCOBandSet(cmuHFRCOBand_1MHz);
//EFM32的GPIO口没有第17pin,看能否检测的出来
GPIO_PinModeSet(gpioPortD,17,gpioModePushPull,0);
while(1)
{
unsigned long ulDelay=500000;
while(ulDelay--);
GPIO_PinOutToggle(gpioPortD,7);
}
}
这是一段很简单的LED闪烁的代码,但是在GPIO_PinModeSet()函数中送错了参数。下载这段代码之后,全速运行,发现程序卡在了assert_EFM() 函数里面:这个函数要自己写哦。assertEFM()里只给出了函数的声明。
然后打开IAR -> View -> Locals窗口,就可以看到是那个文件的第几行的EFM_ASSERT检测false造成的。这里是c:\Assert test\emlib\src\em_gpio.c,第200行。
从这里就知道是调用GPIO_PinModeSet()里面的参数有问题。EFM32的GPIO口没有第17pin的。问题就这样就找出来了。
使用EFM_ASSERT注意事项:
1. 如果要看到File以及Line的内容,必须要设置代码优化等级为None,否则这两个参数直接就被优化掉了。
2. 后期一定要关掉此功能。
3.如果路径名太长,则会显示不全。把工程换个短点的路径即可。后面都是...了,看不到啊。
最后还有一个小技巧:
其实还有一个更简单的方法找到,是哪里的EFM_ASSERT函数出错造成的。
当程序卡在assertEFM之后,IAR -> View -> Call Stack, 在Call Stack窗口,你可以看到整个函数的调用关系。而且你还可以试试双击那些个函数,怎么样,跳过去了吧。这样省事了了吧! 而且不怕优化等级,呵呵。
这个小技巧,算是给看完这篇文章的人一个小小的奖励吧。
在keil中,进入dedug状态之后,可以通过View -> Call Stack + locals来查询到底是哪里除了问题。通过如下窗口显示的信息,就能推断出是main函数里面,调用了GPIO_PinModeSet函数,如果main函数中调用了多次的GPIO_PinModeSet函数,则可以通过查询GPIO_PinModeSet函数的参数来判断具体的位置。这里可以看到port参数是gpioPortD,pin参数是0x12,即18等信息。
但是遗憾的是,不像IAR,双击函数就跳过去了。。
- assertEFM用法小结
- assertEFM使用小结
- assertEFM的使用
- [转载]Const用法小结
- Const用法小结
- Const用法小结
- Const用法小结[转载]
- static用法小结
- static用法小结
- static用法小结
- static用法小结
- typedef 用法小结
- Vector用法小结
- typedef用法小结
- Oracle JOB 用法小结
- static用法小结
- typedef用法小结
- Const用法小结
- java抽象类的概述
- C++生成二维码总结
- 一个简单的cookie
- 世界真美丽
- WindowAdapter
- assertEFM用法小结
- Eclipse背景颜色设置(设置成豆沙绿色保护眼睛,码农保护色)
- 对数据库取出的数据进行递归过滤
- 编程语言系列(六)--shell语言基础知识点总结
- Ubuntu 14.04 scim
- hdu 4717 The Moving Points(三分)
- 动态创建三种风格[WS_CHILD,WS_POPUP,WS_OVERLAPPED]的CDialog
- leetcode第一刷_Valid Parentheses
- 一个简单的冒泡排序算法