没有合适的资源?快使用搜索试试~ 我知道了~
首页嵌入式C语言实战指南:模块化与安全编程
嵌入式C语言实战指南:模块化与安全编程
需积分: 31 18 下载量 51 浏览量
更新于2024-07-20
收藏 1.2MB PDF 举报
"嵌入式C语言进阶之道" 本文旨在帮助已经掌握基本C语言和嵌入式系统基础知识的读者进一步提升在嵌入式C语言领域的技能。作者从编程风格、模块化编程、安全编程规范以及实用技巧四个方面进行深入探讨。 首先,文章强调了良好的编程风格的重要性。良好的编程风格不仅使得代码易于阅读和维护,也有助于团队间的协作。这包括但不限于使用清晰的变量命名、注释的合理使用、遵循一定的代码格式规范以及避免过度复杂的表达式。作者提醒读者,代码应该像书写一篇清晰的文章,让其他开发者能够迅速理解其意图。 其次,模块化编程是大型项目中不可或缺的实践。模块化意味着将复杂的问题分解为独立、可重用的组件,每个组件都有明确的职责。这有助于降低代码的复杂度,提高可读性和可测试性。作者提到了函数和结构体的使用,以及如何通过头文件来管理接口,以实现模块之间的解耦合。 接着,文章参照了MISRA C 2004规范来讲解嵌入式C的安全编程。MISRA C是一套针对嵌入式系统的C语言编码规则,旨在减少代码中的错误和潜在风险。作者讲解了一些关键的规则,如避免使用容易引起混淆的类型转换、限制指针的使用、禁止全局变量等,以确保代码的健壮性和可靠性。 最后,文章探讨了一些嵌入式C语言的实用技巧。这可能包括位操作的高效使用、内存管理策略、中断服务例程的编写注意事项,以及针对特定硬件平台的优化技巧。作者还提醒读者在处理嵌入式系统时,要时刻考虑到硬件限制,例如存储空间、计算能力和功耗。 本文适用于有一定C语言基础和嵌入式系统经验的开发者,希望通过深入学习提升自己的专业能力。作者鼓励读者积极参与讨论,分享经验,共同推动嵌入式编程技术的发展。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/9563217/bgd.jpg)
学会模块化编程
4 / 8
部全局变量。为了说明这个概念,可以参见uC/OS_II.H,其中包括以下定义:
#ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif
OS_EXT INT32U OSIdleCtr;
OS_EXT INT32U OSIdleCtrRun;
OS_EXT INT32U OSIdleCtrMax;
同时,uCOS_II.H 有中以下定义:
#define OS_GLOBALS
#include “includes.h”
当编译器处理uCOS_II.C 时,它使得头文件变成如下所示,因为OS_EXT 被设置为空。
INT32U OSIdleCtr;
INT32U OSIdleCtrRun;
INT32U OSIdleCtrMax;
这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C 文件时,头文件
变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT 被定义为extern。
extern INT32U OSIdleCtr;
extern INT32U OSIdleCtrRun;
extern INT32U OSIdleCtrMax;
在这种情况下,不产生内存分配,而任何 .C文件都可以使用这些变量。这样的就只需
在 .H文件中定义一次就可以了。
(3) 模块内的函数和全局变量需在.c 文件开头冠以static 关键字声明;
这句话主要讲述了关键字static的作用。Static是一个相当重要的关键字,他能对函数
和变量做一些约束,而且可以传递一些信息。比如上例在LCD驱动模块.c文件中定义的延时
函数static void delay (uint us),这个函数冠以static修饰,一方面是限定了函数的作
用范围只是在本模块中起作用,另一方面也给人传达这样的信息:该函数不会被其他模块调
用。下面详细说一下这个关键字的作用,在C 语言中,关键字static 有三个明显的作用:
1.在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,
但不能被模块外其它函数访问。它是一个本地的全局变
量。
3.在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这
个函数被限制在声明它的模块的本地范围内使用。
前两个都比较容易理解,最后一个作用就是刚刚举例中提到的延时函数(static void
delay (uint us)),本地化函数是有相当好的作用的。
(4) 永远不要在.h 文件中定义变量!
呵呵,似乎有点危言耸听的感觉,但我想也不会有多少人会在.h文件中定义变量的。
比较一下代码:
代码一:
/*module1.h*/
int a = 5; /* 在模块1 的.h 文件中定义int a */
/*module1 .c*/
![](https://csdnimg.cn/release/download_crawler_static/9563217/bge.jpg)
学会模块化编程
5 / 8
#include "module1.h" /* 在模块1 中包含模块1 的.h 文件 */
/*module2 .c*/
#include "module1.h" /* 在模块2 中包含模块1 的.h 文件 */
/*module3 .c*/
#include "module1.h" /* 在模块3 中包含模块1 的.h 文件 */
以上程序的结果是在模块1、2、3 中都定义了整型变量a,a 在不同的模块中对应不同的地
址元,这个世界上从来不需要这样的程序。正确的做法是:
代码二:
/*module1.h*/
extern int a; /* 在模块1 的.h 文件中声明int a */
/*module1 .c*/
#include "module1.h" /* 在模块1 中包含模块1 的.h 文件 */
int a = 5; /* 在模块1 的.c 文件中定义int a */
/*module2 .c*/
#include "module1.h" /* 在模块2 中包含模块1 的.h 文件 */
/*module3 .c*/
#include "module1.h" /* 在模块3 中包含模块1 的.h 文件 */
这样如果模块1、2、3 操作a 的话,对应的是同一片内存单元。
注:
一个嵌入式系统通常包括两类(注意是两类,不是两个)模块:
(1)硬件驱动模块,一种特定硬件对应一个模块;
(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
![](https://csdnimg.cn/release/download_crawler_static/9563217/bgf.jpg)
学会模块化编程
6 / 8
下面以 keil C 编译器为例,讲一下模块化编程的步骤。
下面这个程序分为三层,共 7 个模块,共同为主程序服务(它们之间也会相互调用)。
程序的结构图如下所示:
程序主要模块和功能简介:
一. 底层驱动
1. 红外键盘:程序通过红外键盘进行操作。红外键盘独占定时器 0 和外部中断 0,以
实现红外解码和键盘键值的识别。红外键盘定义了五个按键,分别为上翻、下翻、
左翻、右翻和确认键。
2. LCD 液晶显示:程序主要通过 LCD 显示信息,LCD 液晶显示驱动提供显示汉字、
图形和 ASCII 码的函数接口。可以全屏、单行显示汉字,任意位置显示 ASCII 码,还
可以全屏、半屏显示图形。
二. 功能模块
1. LCD 菜单程序:菜单程序可以使人机交互更加方便、容易。本菜单程序的菜单级
别深度受 RAM 大小的限制,每增加一级菜单将多消耗 4 字节的 RAM。菜单程序主
要完成菜单功能函数的调度,LCD 显示刷新。
2. 计算器程序:实现 65536 以内的加、减、乘、除,超出范围会出现溢出,溢出发
生时,LCD 显示“错误:出现溢出”的错误提示,同时本次运算被忽略。对于负数
红外键盘 key.c:
主要定义了上翻、下翻、左翻、右翻和功能键
液晶驱动: LCD_device
提供显示汉字、字
符和图像的接口
开机次数记
忆程
序:eepram.c
包括 IIC 驱动
EEPROM 读写
频率测量
序:mea_fre.c
采用定时器
加中断法
串口测试程
序:uart_.c
输出字符串
菜单程
序:menu.c
负责菜单的
调度,刷新
主程序:main.c
主要完成程序初始化,键盘调度及控制 LCD 显示
液晶显示
计算器程序
:counter.c
剩余74页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/cacb449511a34733a24061f83ab1b552_hkd_ywg.jpg!1)
hkd_ywg
- 粉丝: 5
- 资源: 93
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 多模态联合稀疏表示在视频目标跟踪中的应用
- Kubernetes资源管控与Gardener开源软件实践解析
- MPI集群监控与负载平衡策略
- 自动化PHP安全漏洞检测:静态代码分析与数据流方法
- 青苔数据CEO程永:技术生态与阿里云开放创新
- 制造业转型: HyperX引领企业上云策略
- 赵维五分享:航空工业电子采购上云实战与运维策略
- 单片机控制的LED点阵显示屏设计及其实现
- 驻云科技李俊涛:AI驱动的云上服务新趋势与挑战
- 6LoWPAN物联网边界路由器:设计与实现
- 猩便利工程师仲小玉:Terraform云资源管理最佳实践与团队协作
- 类差分度改进的互信息特征选择提升文本分类性能
- VERITAS与阿里云合作的混合云转型与数据保护方案
- 云制造中的生产线仿真模型设计与虚拟化研究
- 汪洋在PostgresChina2018分享:高可用 PostgreSQL 工具与架构设计
- 2018 PostgresChina大会:阿里云时空引擎Ganos在PostgreSQL中的创新应用与多模型存储
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)