嵌入式 C 语言编程!

1.全局变量

在纯 C 语言(Pure C)开发的嵌入式程序中,需要在多处用到同一个变量,需要注意几点:

不要在头文件中对变量进行定义

头文件中变量的声明添加关键字 extern

在相应的 .c 文件中对变量进行定义

这样,其它地方需要用到该全局变量时,仅需要包含 .h 头文件即可,不必再用 extern 声明变量。

example 1.1

注意: 该例中定义的变量 value 为 const 类型,以防止在其它文件中对值进行修改,若需要其它文件能够修改值,则取消 const 关键字修饰(如 varValue)。

2.程序接口

在嵌入式开发中,经常需要选择与上位机进行通讯的协议(如 Uart,SPI 通讯协议),由于 C 语言里面并没有 CPP 中命名空间以及接口(纯虚函数)等的概念,

所以通常编写特定协议的代码时需要对不同协议中定义的函数接口进行区分,但在函数使用时,就需要用到特定协议的头文件中所声明的接口。

example 2.1

在实际使用中,肯定会对串口通讯进行封装,提供许多 API,那么在使用 UART 协议的时候就需要把之前所有用到与 SPI 协议相关的

函数全部替换成 UART 相关的函数。为了简化函数的使用,可以利用 宏定义,向主程序提供一个统一的接口。

为了定义统一的接口,引入新的头文件 com.h:

这里我们认为 UART 的优先级最高,在定义了 COM_UART 之后就会使用 uart 通讯协议,不论是否定义过 COM_SPI 。

在主程序 main.c 中,我们可以调用 comInit() 对串口进行初始化:

注释掉 com.h 中对 COM_UART 的定义,取消 COM_SPI 的注释,再运行程序,可以看到:

SPIInit

通过宏定义,就可以为整个项目提供统一的串口函数接口。

程序接口的优缺点

优点:

统一了函数接口,方便程序迭代。

便于项目管理。

缺点:

尽管通过宏定义,可以方便的对外提供统一的函数接口,但是每当添加一个新的协议时,都需要在

com.h 头文件中添加新的条件分支和额外的宏定义。

当串口协议出现了特殊的函数接口时,进行宏定义时需要考虑到这些特殊的情况

上述代码是假设 UART 协议和 SPI 协议是不会同时使用的(要么使用 UART 协议,要么使用 SPI 协议,考虑的情况较为简单)条件判断的复杂程度为 O(n);而实际上有些程序的接口中可能需要同时使用 A 实现,又要使用 B 实现,那么复杂程度将会变为 O(n^2)。

总而言之,具体项目需要具体分析,这里仅是给出一种简化代码使用的思路。

“我是一名从事了10年的老程序员,最近我花了一个月整理了一份最适合2020年学习的c/c++项目实战以及基础教程干货,送给每一位编程小伙伴,这里是小白聚集地,欢迎初学和进阶中的小伙伴。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我一起学习,技术大牛、学习资料助你早日成为一名优秀的程序员,想要学习更多知识可以关注我哦!
官方企鹅群:720168573

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值