网站去掉后缀html,网站建设构成,合肥网站建站报广告代理,甘肃手机网站建设还有没上车的吗 马上要开车了 不等了#xff0c;开始发车 老司机#xff0c;再稍我一个 车已经发动了 你等下一班车吧 车子运行中#xff0c;大伙儿坐稳啦#xff01; Ⅰ 库函数中的assert_param 在STM8、STM32标准外设库#xff0c;或者HAL库的stm8_conf.h、stm32_conf.h… 还有没上车的吗 马上要开车了 不等了开始发车 老司机再稍我一个 车已经发动了 你等下一班车吧 车子运行中大伙儿坐稳啦 Ⅰ 库函数中的assert_param 在STM8、STM32标准外设库或者HAL库的stm8_conf.h、stm32···_conf.h文件中会看见如下一段代码 /* #define USE_FULL_ASSERT 1 */ #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 大概意思就是如果定义了USE_FULL_ASSERT则会宏定义#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 相当于是一个条件语句。 此时还需要我们实现assert_failed函数如果不实现则会报错后面来讲具体如何实现。 而在其他地方调用情况如GPIO void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(GPIO_Pin)); GPIOx-BSRR GPIO_Pin; } 调用assert_param的主要作用就是检测参数正确与否即我们所说的断言。 Ⅱ assert_param详情 1.STM8S中的assert_param 细心的朋友会发现STM8标准外设库stm8s_conf.h中开启了USE_FULL_ASSERT这个宏 #define USE_FULL_ASSERT (1) 开启USE_FULL_ASSERT这个宏就意味着要实现assert_failed((uint8_t *)__FILE__, __LINE__))这个函数 那么我就在main.c文件下按照官方的例程实现了assert_failed函数 #ifdef USE_FULL_ASSERT //断言(参考官方) void assert_failed(u8* file, u32 line) { while (1) { } } #endif 2.STM32中的assert_param 在STM32标准外设库HAL库中的USE_FULL_ASSERT这个宏是被屏蔽了的。故程序运行#define assert_param(expr) ((void)0) 也就是没有做任何处理。 我之前提供的例程中为了不动官方代码assert_param这个函数都是没有使用的。 3.assert_failed((uint8_t *)__FILE__, __LINE__)) 看到这个函数就要说下__FILE__和__LINE__这两个标准定义。 __LINE__ 正在编译文件的行号 __FILE__ 正在编译文件的文件名 还不懂的同学建议参考之前的文章【ANSIC几种特殊的标准定义__FILE__、__LINE__、__STDC__···】。 而上面只是申明函数具体的实现还需要自己实现。理解了上面两个参数相信大家都会知道如何实现了。需要根据自己项目情况来实现。常规举例 void assert_failed(uint8_t* file, uint32_t line) { printf(Error code in file:%s,line:%u\r\n,file,line); } 这条语句在调及产品出厂之前测试是很有必要的方便分析问题所在。正式推出版本不定义USE_FULL_ASSERT这个宏既可以关闭了。 Ⅲ 最后 微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注在我的底部菜单查看更多精彩内容! 长按识别二维码 关注 不求赞赏 只求点赞、点广告给与支持