历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2020年04月02日 | STM32库函数编程学习心得:assert_param的应用

2020-04-02 来源:eefocus

在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。        


所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。


这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。

它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。

当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。


摘抄于库函数stm32f0xx_conf.h中:

#ifdef  USE_FULL_ASSERT
 #define assert_param(expr)   ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
  void assert_failed(uint8_t* file, uint32_t line);
#else
          #define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT */

如果定义了USE_FULL_ASSERT,就把 assert_param(expr) 定义为((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 并申明一下assert_failed这个函数。否则把assert_param(expr)定义为空。 __FILE__和__LINE__是IAR定义的宏,指的是当前的编译的文件名和行数。     整个宏作用为:如果expr为真,则什么也不返回,如果expr为假,则调用assert_failed()这个出错程序。

举例:#define IS_GPIO_MODE(MODE)     (((MODE) == GPIO_Mode_IN) || ((MODE) ==GPIO_Mode_OUT) ||  ((MODE) == )
                                                          || ((MODE) == GPIO_Mode_AN))

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
            /* Check the parameters */
          assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
}

GPIO_InitStruct->GPIO_Mode是枚举类型,只能是GPIO_Mode_IN、GPIO_Mode_OUT、GPIO_Mode_AF、GPIO_Mode_AN中一个,因此宏定义IS_GPIO_MODE(MODE)能判断是其中一个为真,否则为假。因此达到调试的目的。


assert_failed()函数完成的具体操作,由用户自己定义。


我的补充:__FILE__,__LINE__是预处理符号,分别是表示进行编译的源文件名、文件当前行的行号

推荐阅读

史海拾趣

Device Engineering Incorporated公司的发展小趣事

在发展过程中,DEI公司也遇到了不少挑战。如市场竞争日益激烈、技术更新换代加快等。然而,DEI公司始终保持着冷静和清醒的头脑,积极应对各种挑战。他们通过加强内部管理、优化产品结构、拓展新的业务领域等方式,不断提高自身的适应能力和竞争力。这些努力使得DEI公司在电子行业中始终保持领先地位,实现了持续稳定的发展。

捷嘉电子(Chequers Electronic)公司的发展小趣事

随着公司规模的扩大,捷嘉电子开始着手整合产业链资源,以提升整体竞争力。公司通过与上游供应商建立长期稳定的合作关系,确保了原材料的质量和稳定供应;同时,通过加强与下游客户的沟通与协作,实现了产品的定制化服务和快速响应市场需求。这些举措不仅提高了捷嘉电子的运营效率,也进一步巩固了其在市场上的地位。

Anaren公司的发展小趣事

随着公司规模的扩大,捷嘉电子开始着手整合产业链资源,以提升整体竞争力。公司通过与上游供应商建立长期稳定的合作关系,确保了原材料的质量和稳定供应;同时,通过加强与下游客户的沟通与协作,实现了产品的定制化服务和快速响应市场需求。这些举措不仅提高了捷嘉电子的运营效率,也进一步巩固了其在市场上的地位。

Coiltronics公司的发展小趣事

随着市场的不断扩大,Coiltronics公司意识到单凭自身的力量难以满足日益增长的市场需求。于是,公司开始积极寻求与其他企业的战略合作。通过与知名电子设备制造商建立合作关系,Coiltronics成功将其线圈技术应用于更广泛的领域,进一步提升了市场份额。同时,这种合作也带来了双方在技术研发、市场推广等方面的深入交流,为公司的长远发展奠定了坚实基础。

Alpha Semiconductor公司的发展小趣事

1994年,Alpha Semiconductor迎来了另一个重要的里程碑——公司成功研发出了自己的电源管理产品。这一产品的推出标志着Alpha Semiconductor在半导体技术领域的自主创新能力得到了显著提升。电源管理产品的成功研发不仅为公司带来了可观的收益,也进一步巩固了Alpha Semiconductor在半导体行业中的地位。

Dymec公司的发展小趣事

Dymec公司成立的初期,正面临着电子市场快速变革的挑战。为了在市场上立足,公司创始人决定专注于研发高精度电子连接器。经过数月的努力,团队成功开发出了一款具有创新性的连接器产品,这款产品不仅提高了数据传输的效率,还大大增强了设备的稳定性。这一创新为Dymec公司赢得了第一批客户的认可,也为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

分辨率修改问题

原来我的机器的分辨率是800*480,这时那些窗口刚好满屏显示, 但是改成如横屏800*600的时候,高度就有120不能显示出来,在底下看不到,鼠标可以移到下面去 请问,是否还有什么地方的分辨率没有修改到么? 我怎么可以改呢?…

查看全部问答>

求助:CodeWarrior for ADS 1.2中编译出错

工程中,用ADS编译,出现了Errors: Could not find or load the file 襐IC.a?for target 褼ebugRel?for project 襱est1.mcp? Could not find or load the file 褻omm.a?for target 褼ebugRel?for project 襱est1.mcp? The following access p ...…

查看全部问答>

目前WM5.0上播放mp3音频主要用哪种方式?(主流的)

如题,想了解下目前PPC或者SmartPh上播放mp3格式的音频文件主要用哪种技术?windows media sdk? DirectShow? 或者其他的第三方控件? (当然需要免费的)…

查看全部问答>

请问下PCI PCIE在配置空间的区别

如何通过读取判断机器是PCIE为还是PCI呢???…

查看全部问答>

《匠人手记》之新手三忌

1.第一忌 自己不动脑筋,一遇到问题就问别人有句话说的好“吃别人咀嚼过的馍不香”。对于新手来说,做每一件事都是一次学习的好机会。有时候,探索的过程比最终的结果更重要。当你经过自己的努力,解决问题时,成就感和自信心会随之逐渐建立。如果 ...…

查看全部问答>

今早用altium designer6.9画原理图时突然出现了这么一个问题··不得其解啊

就是我放置导线时··本来把我想要连接上的两个引脚端连上就可以了··可是呢··导线的终点却与多个引脚连到一起了··自动产生了很多我不想要连接上的节点··这是怎么回事呢?之前放导线的时候貌似没出现这情况··…

查看全部问答>

实在

有些时日,发现自己终究活得不够真实,所以自己的存在总是时隐时现。但一直找不到有力的论据推翻“真实的世界是丑陋的”这么句不成文的定理。所以生活姑且只能是演义,而我们知道演义是虚实相嵌的,如《三国演义》。­ 竭力使自己的想法能够简 ...…

查看全部问答>

富士通工业控制DIY_开关电源制作之二

大家有没有仔细研究这个电源的EMI测试曲线(见图1)呢,这个曲线的首段在150-600KHz中,红线以下的EMI测试曲线峰值超越或者接近红线(所谓的红线:就是电源板PCBA的EMI测试曲线的电磁兼容的合格与否的界限),为了说明问题特意将低频段的EMI做的高 ...…

查看全部问答>