历史上的今天
今天是:2025年03月29日(星期六)
2019年03月29日 | assert_param函数的意义
2019-03-29 来源:eefocus
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。
所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。
这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。
它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。
当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。
在执行assert_param()的检验时,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误,在任何一个例程中的main.c中都有这个函数的模板,如下:
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{}
}
你可以按照自己使用的环境需求,添加适当的语句输出错误的信息提示,或修改这个函数做出适当的错误处理。
1、STM32F10xD.LIB是DEBUG模式的库库文件。
2、STM32F10xR.LIB是Release模式的库库文件。
3、要选择DEBUG和RELEASE模式,需要修改stm32f10x_conf.h的内容。
#define DEBUG 表示DEBUG模式,把该语句注释掉,则为RELEASE模式。
4、要选择DEBUG和RELEASE模式,也可以在Options,C/C++,Define里填入DEBUG的预定义。
这样,就不需要修改stm32f10x_conf.h的内容。
5、如果把库加入项目,则不需要将ST的库源文件加入项目,比较方便。
但是,库的选择要和DEBUG预定义对应。
上一篇:stm32 keil4建立工程
下一篇:嵌入式-stm32学习:按键检测
史海拾趣
|
原先的产品是通过51单片机 AD 后通过串口发送到上位机,上位机显示采样结果。 现在的打算用ARM来处理,移植CE5到FLASH中。 设计时,位机用EVC或者VS2005开发这个没问题; 但是: 1、下位机如果用ADS开发,ADS的输出是运行在目标机裸机上的,CE ...… 查看全部问答> |
|
如何在单片机里存储一个数据,在掉电以后我再开始运行程序,我能够把那个数据在从单片机里读出来呀,用于本次程序的执行呀! 非常感谢! 不外加芯片… 查看全部问答> |
|
请问wince5.0的usb function controller驱动是怎么被加载的?在Ufnmdd.cpp中的UFN_Init等接口函数怎么被调用执行?在source文件中利用Ufnmdd.cpp只生成了个usbmddbase.lib库而没有生成DLL,在最终的image中也没有打包进去,那怎么样才 ...… 查看全部问答> |
|
VS 2005新建一个C#智能设备工程。 我自己没有向里面添加代码。 然后调试编译部署到我的开发板。 选择的是我开发板sdk部署。 然后开始部署。奇怪,总是提示磁盘空间不足:错误 0x80070070: 磁盘空间不足 后来在wince开发板下,设置内存,还是不 ...… 查看全部问答> |
|
职位信息 · 工作性质:全职 · 工作地点:武汉 · 发布日期:2010/1/4 · 截止日期:2010/3/1 · 招聘人数:3 · 薪 水: · 工作经验:1-2 ...… 查看全部问答> |
|
很奇怪,当我把系统定制的比较小的时候,下载没有任何问题,当我的系统大概大于30M的时后,当我修改了config.bib的MEMORY中的ARM,ARMIMG的起始 地址以便可以容纳镜像大小,编译可以通过,可是通过网线下载快要结束的时候PB弹出报错对话框:Downloa ...… 查看全部问答> |
|
我的EK-LM3S811板子被锁住了,误用了JTAG口,有网友说解锁,我试了很多办法,都不行,难道真的需要换片了吗?可是换片哪有卖的啊?… 查看全部问答> |




