在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;
在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。
这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。
当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。
#ifdef USE_FULL_ASSERT
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
...
在执行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 assert_param
引用地址:
STM32中assert_param的使用
推荐阅读最新更新时间:2024-03-16 14:28
STM32无传感器电机CPU占用率低于30%
意法半导体近日发布一套基于STM32闪存微控制器的三相电机控制开发套件,这套工具包含用户评估这个32位微控制器解决方案以及自行开发无传感器电机控制应用所需的全部硬件和固件。STM32微控制器以ARM® Cortex™-M3为内核,满足价格敏感的家用电器和工业设备对微控制器的高性能和低能耗的要求而开发。 STM微控制器在25毫秒内即可执行一整套无传感器三相无刷永磁同步电机(PMSM)矢量控制算法,大多数应用任务占用CPU资源比率小于30%,为CPU执行其它应用任务(如需要)预留了充足的处理能力。永磁电机同步电机控制解决方案的代码大小少于16千字节。 同一硬件平台可以用于永磁同步和交流感应两种电机,最高工作电压48V;
[焦点新闻]
9.TouchGFX界面应用之综合应用--打地鼠
上一节我们学习了自定义组件(容器),这一节我我们使用自定义组件(容器)做一个简易打地鼠的小游戏,再创建一个屏幕,在第三个屏幕上面先放置切换屏幕的按键。 然后百度找两张图片,一个作为土拨鼠,一个作为坑,坑和土拨鼠图片的像素点大小保证一致减少计算。 放置几个按钮表示土拨鼠的坑,用上面表示坑的图片表示背景,这样你按钮的大小就和图片的大小保持一致,每一个按钮设置好编号, 每一个按钮对应一个函数。我们在CustomContainer2.hpp中声明定义这些函数 我们写一个类似于滴答定时器的函数,来作为打地鼠的时钟。在组件(容器)中使用handleTickEvent是没有效果的,组件不会自己产生时钟需要外部提供,那
[单片机]
STM32串口DMA连续发送两帧,导致数据部分覆盖的问题
问题描述 使用STM32的串口进行DMA发送(Noraml模式),在某个任务中连续调用两次发送函数log_printf(),但是发回的数据在串口调试助手上显示与预期不符。第一次发送的数据有一部分被第二次发送的数据覆盖,如图所示: 任务代码如下: /* Log_Task function */void Log_Task(void const * argument) { /* USER CODE BEGIN Log_Task */ /* Infinite loop */ for(;;) { if(router_rx_flag == 1) { router_rx_flag = 0; log_pri
[单片机]
STM32—数组作为被调用函数的入口参数时定义成指针
STM32—数组作为被调用函数的入口参数时,要两个条件, 1:数组首地址 2:数组长度 在被调用函数中,比如把数据保存到数组pbuffer 中,那么在入口参数定义时要定义成指针u8 *pbuffer, 1 而在调用时,比如要保存到tab 中,要在入口参数处强制转换成(u8 *)tab,
[单片机]
基于STM32的队列与栈
使用ESP8266接收云端传输数据,云端下发数据可能为好几组数据同时下发,而下位机处理只能单个依次进行,因此需要建立一个缓冲数组,接收云端数据,然后一个个依次处理-- 队列。 队列: 顺序队列:建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置 数据结构之顺序队列(C实现) 循环队列: 基于stm32串口环形缓冲队列处理机制—入门级(单字节) 栈: https://jingyan.baidu.com/article/6c67b1d6a09f9a2786bb1e4a.html 这里
[单片机]
如何在STM32中得到最佳的ADC精度
STM32家族中的所有芯片都内置了逐次逼近寄存器型ADC模块.内部大致框架如下: 每次ADC转换先进行采样保持,然后分多步执行比较输出,步数等于ADC的位数,每个ADC时钟产生一个数据位。说到这里,用过STM32 ADC的人是不是想到了参考手册中关于12位ADC转换时间的公式: ST官方就如何保障或改善ADC精度写了一篇应用笔记AN2834。该应用笔记旨在帮助用户了解ADC误差的产生以及如何提高ADC的精度。主要介绍了与ADC设计的相关内容,比如外部硬件设计参数,不同类型的ADC误差来源分析等,并提出了一些如何减小误差的设计上建议。 当我们在做STM32的ADC应用遇到转换结果不如意时,常有人提醒或建议你对采样时间或
[单片机]
STM32笔记之八:来跟PC打个招呼,基本串口通讯
a) 目的:在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。 b) 初始化函数定义: void USART_Configuration(void); //定义串口初始化函数 c) 初始化函数调用: void UART_Configuration(void); //串口初始化函数调用 初始化代码: void USART_Configuration(void) //串口初始化函数 { //串口参数初始化
[单片机]
在单片机上实现动态加载功能
本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的一些宏定义 /common/dl_
[单片机]