嵌入式知识点
一,嵌入式项目中do{...}while(OU)的作用和意义
1.1 概述
1.2 HAL库中do{...}while(OU)宏定义
1.3 do{...}while(OU)宏定义的作用和意义
二,嵌入式代码常见的命名规范
1.1 通用命名规则
1.2 文件命名, 类型命名
1.3 变量命名, 常量命名,函数命名
1.4枚举命名,宏命名
一,嵌入式项目中do{...}while(OU)的作用和意义
1.1 概述
相信使用过STM32Cube HAL库的朋友都知道,源码里面有许多do{...} while(0U)的宏定义语句,但是我们并不知道其中的作用和意义,只觉得这样写代码非常的复杂,其实我也不是特别知道这其中的奥妙,但是我看了一篇文章,那么我们就开始我们的探索之旅吧!
1.2 HAL库中do{...}while(OU)宏定义
在HAL库中,很多.h文件都有do{...} while(0U)这样的宏定义,比如:在stm32f1xx_hal_rcc.h中,使能GPIO时钟:
1.3 do{...}while(OU)宏定义的作用和意义
1,编译出错
//将无法编译,缺少大括号
#define foo(x) int a = x; int b = x;
int main]()
{
int i = 0;
if(i==0)
foo(2);
else
i=1;
return 0;
}
我们把大括号加上:
//将无法编译,加上大括号
#define foo(x) {int a = x; int b = x;}
int main]()
{
int i = 0;
if(i==0)
foo(2);
else
i=1;
return 0;
}
使用大括号后,有编译出现多一个分号,接下来我们使用do{...}while(OU):
//使用do{...}while(OU)
#define foo(x) do{int a = x; int b = x;}while(OU)
int main]()
{
int i = 0;
if(i==0)
foo(2);
else
i=1;
return 0;
}
编译正常!
二,嵌入式代码常见的命名规范
1.1 通用命名规则
尽可能使用描述性的命名,相比之下让代码易于新读者理解更重要. 不要用只有项目开发者能理解的缩写, 也不要通过去掉几个字母来缩写单词。少用缩写
1.2 文件命名, 类型命名
文件名:
- 文件名尽量全部小写, 可以包含下划线 (_) 或连字符 (-), 按照项目的约定. 如果没有约定, 那么 “_” 更好。
- 通常应尽量让文件名更加明确,bsp_i2c.h 就比 i2c.h 要好。
- 源文件和头文件最好成对出现,比如 bsp_i2c.c 和 bsp_i2c.h 。
类型名:
- 类型名称的每个单词首字母均大写, 不包含下划线
1.3 变量命名, 常量命名,函数命名
变量名:
- 变量 (包括函数参数) 和数据成员名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用
- 不管是静态的还是非静态的, 类数据成员都可以和普通变量一样, 但要接下划线。
- 结构体变量:不管是静态的还是非静态的, 结构体数据成员都可以和普通变量一样, 不用像类那样接下划线
常量命名:
- 声明为 constexpr 或 const 的变量, 或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合。
- 所有具有静态存储类型的变量 (例如静态变量或全局变量, 参见 存储类型) 都应当以此方式命名. 对于其他存储类型的变量, 如自动变量等, 这条规则是可选的. 如果不采用这条规则, 就按照一般的变量命名规则
函数命名:
- 常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配
- 一般来说, 函数名的每个单词首字母大写,没有下划线. 对于首字母缩写的单词, 更倾向于将它们视作一个单词进行首字母大写
- 取值和设值函数的命名与变量一致. 一般来说它们的名称与实际的成员变量对应
1.4枚举命名,宏命名
枚举命名:
- 枚举的命名应当和 常量 或 宏 一致
- 单独的枚举值应该优先采用 常量 的命名方式. 但 宏 方式的命名也可以接受所以要用大小写混合的方式
宏命名:
- 参考 预处理宏; 通常 不应该 使用宏. 如果不得不用, 其命名像枚举命名一样全部大写, 使用下划线: