当前位置: 首页 > article >正文

嵌入式知识点

一,嵌入式项目中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枚举命名,宏命名

枚举命名:

  • 枚举的命名应当和 常量 或 宏 一致
  • 单独的枚举值应该优先采用 常量 的命名方式. 但 宏 方式的命名也可以接受所以要用大小写混合的方式

宏命名:

  • 参考 预处理宏; 通常 不应该 使用宏. 如果不得不用, 其命名像枚举命名一样全部大写, 使用下划线:

http://www.kler.cn/a/282498.html

相关文章:

  • 丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
  • Mac终端字体高亮、提示插件
  • git撤销、回退某个commit的修改
  • @Autowired 和 @Resource思考(注入redisTemplate时发现一些奇怪的现象)
  • git如何开启SSH?
  • uview Collapse折叠面板无法动态设置展开问题(微信小程序)
  • 计算机毕业设计选题推荐-医院门诊预约-医院预约挂号微信小程序/安卓APP-项目实战
  • CTFHub SSRF靶场通关攻略(6-11)
  • LabVIEW如何适应航天系统的要求
  • Java 泛型与增强for
  • PMP–知识卡片--多标准决策分析
  • [000-01-001].第04节:Shell中的内置命令
  • 【软件测试】软件测试生命周期与Bug
  • MacOS通过Docker部署安装zookeeper、dubbo-admin,以及Docker Desktop进行管理
  • docker基本操作
  • 基于矢量光场的光学加工技术
  • <Rust>egui学习之小部件(六):如何在窗口中添加菜单栏部件?
  • 15.土堆说卷积操作(stride、padding)
  • buuctf [MRCTF2020]hello_world_go
  • 【最新】高效可用的Docker仓库源
  • 【力扣】验证回文串
  • Flask restful 前后端分离和 restful 定义
  • [BFS广度优先搜索] 迷宫
  • 如何用SpringBoot构建摇滚乐鉴赏网站?音乐分享+乐评社区,实现个性化推荐!
  • npm pack使用
  • 计算机基础知识复习8.29