历史上的今天
今天是:2025年04月11日(星期五)
2019年04月11日 | stm32的断言机制(assert)的理解
2019-04-11 来源:eefocus
在做stm32的库程序移植时出现错误“#error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"”,未选择STM32F4xx 设备导致多.h文件未被载入,发现是STM32F429_439xx的宏定义未定义,解决方法是在工具魔法棒 中的C/C++页的#define栏中添加相应的宏定义。
出现错误“.ObjectsSTM32F429IGT6_Demo.axf: Error: L6218E: Undefined symbol assert_param (referred from misc.o).”和警告“..LibrariesSTM32F4xx_StdPeriph_Driversrcstm32f4xx_wwdg.c(211): warning: #223-D: function "assert_param" declared implicitly”,断言assert未被定义,发现是USE_STDPERIPH_DRIVER的宏定义未定义,解决方法是在工具魔法棒 中的C/C++页的#define栏中添加相应的宏定义。
在文件stm32f4xx.h中,如果定义了USE_STDPERIPH_DRIVER,则#include “stm32f4xx_conf.h”文件,如下图

文件stm32f4xx_conf.h包含了stm32的所有库文件和断言的定义,所以只要包含stm32f10x.h文件就能很容易的包含所有的文件文件了,需要使用assert函数时只需要定义USE_FULL_ASSERT即可。

assert(表达式);如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。
如上图所示,如果USE_FULL_ASSERT未定义,则断言是assert_param(expr) ((void)0)函数, ((void)0)表示空语句的表达式,即无断言机制,对程序不产生影响,如果定义了USE_FULL_ASSERT,则assert_param(expr)函数定义为: ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)),如果表达式正确则((void)0),如果错误,则运行函数assert_failed();其中__FILE__,__LINE__是标准库函数中的宏定义,用来指示出错的行数和文件。函数assert_failed()可以自己在main.c中定义,如下:
void assert_failed(uint8_t* file, uint32_t line)
{
while(1);
}
以上,作为自己的学习记录。
下一篇:stm32之断言详细讲解
史海拾趣
|
前言 随着市场的发展,现在的MP3播放器品种越来越多,价钱也越来越实惠。也越来越多的MP3进入了用户的口袋。可以说是MP3随身听丰富了个人的世界,能随时随地随心所欲地欣赏美妙音乐。作为随身听,MP3的最终目的是还原真实的音乐。作为音响爱好者, ...… 查看全部问答> |
|
windows xp 与 windows ce 嵌入式系统的usb通信 现有一个条形码识别掌机, 掌机系统为 windows ce.net 6.0, 有usb接口。 将掌机usb接口直接与windows vista电脑相接,不需要任何操作就可以实现通信。 但将掌机与windows xp相接,用了很多方法都不行,比如安装一个activesync 4.5,在连接 ...… 查看全部问答> |
|
可用于主控制的接口有CH375,SL811,还有吗?用于从控制的就多了,如PDIUSBD12,还有MCU内置,如C8051F340就内置USB控制器. 这写USB从控制器能用作主控制器吗?谢谢!… 查看全部问答> |
|
库文件完全一样,示例代码能运行,但是即使把示例代码完全复制到自己的工程中都不能输出正确的结果。复制到自己的项目中后,完全相同的代码但是编译后的大小要比demo工程直接编译的大一点点。一直到不到哪里出了问题。有人遇到过吗?或者给点查错的 ...… 查看全部问答> |
|
美国Robei公司开发了一套全新的FPGA设计仿真工具,现在在教育界和工业界引起巨大的反响。 下面是这个软件的简单介绍: Robei FPGA仿真软件是一款世界上最小的FPGA仿真工具。该软件具备先进的图形化设计工具,代码修改,Verilog编译仿真和波形分析 ...… 查看全部问答> |




