assertEFM使用小结

本文详细介绍了EFM32中的EFM_ASSERT宏的作用及使用方法。解释了它如何帮助开发者在调试阶段发现并定位代码错误,同时提供了具体的实例演示其功能。此外,还讨论了在不同IDE中查看错误位置的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果使用过EFM32的CMSIS库,那么肯定也看到过EFM_ASSERT这个宏,几乎无处不在。

1. 这个宏定义在哪里,函数原型是什么?

这个通过goto 函数定义,应该很容易找到EFM_ASSERT是一个空函数或则是assertEFM()函数。由另外一个宏定义来决定。

2.assertEFM()函数中的const char *file, int line这两个参数是何作用?

通过这两个参数,可以让客户知道是哪个文件的,那一行的EFM_ASSERT造成的错误。

3. 为什么需要EFM_ASSERT?

它能够检查括号里面的表达式是否成立,如果为false,程序会报告错误,并且终止执行,防止造成错误的结果。如果为true,则继续执行。后续我们会举例说明。

4. 什么时候需要开启这样的功能?

ASSERT功能最大的好处是在前期进行软件调试的时候,帮助用户找出一些潜在的bug。但是在后期Release时,一定记得要关掉。

5. 如何开始ASSERT以及关闭ASSERT功能?

通过在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() 函数里面:

然后打开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,双击函数就跳过去了。。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值