sun4.0泰山众筹模式项目系统开发技术讲解放哪(Demo)

简介: sun4.0泰山众筹模式项目系统开发技术讲解放哪(Demo)

STM32 一种参数检查用法介绍
assert_param()是一个在代码中很常见的写法,这个函数的功能一般是对函数参数的合法性进行检查,这里以一个例子进行分析:

assert_param(IS_GPIO_ALL_PERIPH(GPIOx))
函数的参数是IS_GPIO_ALL_PERIPH(GPIOx),原型为:

define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \

                                ((PERIPH) == GPIOB) || \
                                ((PERIPH) == GPIOC) || \
                                ((PERIPH) == GPIOD) || \
                                ((PERIPH) == GPIOE) || \
                                ((PERIPH) == GPIOF) || \
                                ((PERIPH) == GPIOG) || \
                                ((PERIPH) == GPIOH) || \
                                ((PERIPH) == GPIOI) || \
                                ((PERIPH) == GPIOJ) || \
                                ((PERIPH) == GPIOK))

复制
这个宏定义的作用就是检查参数PERIPH,判断参数PERIPH是否为GPIOX(A...G)基址中的一个,只要有一个为真则其值为真,否则为假。由于这个是宏定义,因此并不是在编译的时候进行判断上的简化,而是将多行代码用宏定义代替了。

下面再看看assert_param:

assert_param
函数原型如下:

ifdef USE_FULL_ASSERT

/**

  • @brief The assert_param macro is used for function's parameters check.
  • @param expr: If expr is false, it calls assert_failed function
  • which reports the name of the source file and the source
  • line number of the call that failed.
  • If expr is true, it returns no value.
  • @retval None

*/

#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 /

复制
这里有一个判断,如果是FULL ASSERT,则宏定义被展开为:((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)),否则则被展开为((void)0)。

先看第二种:
如果被展开为((void)0),则相当于什么也没做,那么看第一种,如果expr为真,则跟第二种的处理一样,什么也不做,如果expr为假,则执行断言失败assert_failed((uint8_t *)__FILE__, __LINE__))

既然如果选择了FULL ASSERT,那么就有断言失败的可能,因此,这里把断言失败的函数声明写上,即可避免编译错误。

再看断言失败的处理:

相关文章
|
Web App开发 存储 移动开发
IRS应用发布之应用调试
Debug调试工具支持日志查询和前端页面调试:
IRS应用发布之应用调试
|
小程序 JavaScript 开发工具
Uniapp 对接抖音短剧播放器 video-player 坑点解决
Uniapp 对接抖音短剧播放器 video-player 坑点解决
632 1
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
283 10
【数据结构】链表从实现到应用,保姆级攻略
|
前端开发 JavaScript UED
深入理解与应用 CSS 伪类选择器
【10月更文挑战第23天】通过以上对 CSS 伪类选择器的深入探讨,我们可以更好地理解和应用它们,为网页设计和开发带来更丰富、更灵活的样式效果。同时,要注意在实际应用中根据具体情况合理选择和使用伪类选择器,以达到最佳的设计效果和用户体验。
326 2
|
JavaScript
Vue使用element中table组件实现单选一行
如何在Vue中使用Element UI的table组件实现单选一行的功能。
939 6
Vue使用element中table组件实现单选一行
|
存储 安全 大数据
2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组(样卷)
2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组(样卷)
探究Python中的函数与模块
在本篇文章中,我们深入探讨了Python中的函数与模块。从函数的定义、参数处理,到模块的导入、自定义模块和包的使用,您已经掌握了如何通过这些工具来编写结构化、模块化的代码。 在实际开发中,合理地使用函数和模块可以大大提高代码的可读性和可维护性,为您编写更复杂的程序奠定了基础。
在Linux中,如何查看磁盘详细使用情况?
在Linux中,如何查看磁盘详细使用情况?
|
监控 Linux 应用服务中间件
linux php-fpm优化 php-fpm.conf 重要参数详解
linux php-fpm优化 php-fpm.conf 重要参数详解
229 0
|
SQL 关系型数据库 MySQL
postgresql |数据库 |数据库的常用备份和恢复方法总结
postgresql |数据库 |数据库的常用备份和恢复方法总结
470 0