嵌入式软件设计相关规范

上传人:101****457 文档编号:87648807 上传时间:2019-04-10 格式:PDF 页数:18 大小:683.71KB
返回 下载 相关 举报
嵌入式软件设计相关规范_第1页
第1页 / 共18页
嵌入式软件设计相关规范_第2页
第2页 / 共18页
嵌入式软件设计相关规范_第3页
第3页 / 共18页
嵌入式软件设计相关规范_第4页
第4页 / 共18页
嵌入式软件设计相关规范_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《嵌入式软件设计相关规范》由会员分享,可在线阅读,更多相关《嵌入式软件设计相关规范(18页珍藏版)》请在金锄头文库上搜索。

1、嵌入式软件设计相关规范 嵌入式软件设计相关规范 3.1 CodeWarrior 环境下工程组织规范 现在,实验室使用的 16 位、32 位芯片的软件开发平台主要是 CodeWarrior IDE,所以 下面就以 CW 环境下的工程文件组织方法为例来介绍嵌入式软件工程组织规范。当然,如 果使用其他 MCU 软件开发环境,也应当尽量遵循这个规范。 1. 工程文件结构 如下图给出了小灯闪烁工程相关源文件的树型结构。 1)汇编程序文件 在“汇编程序”中包含的文件与工程初始化相关,包括工程启动文件“steup.s”与中断 向量表文件“vectors.s” ,由于源代码完全使用汇编语言编写,故将其独立作为

2、一类。 2) C语言程序文件和头文件 C 语言程序文件和头文件基本上是一一对应的, 例如, includes.h 与 main.c、 isr.h 与 isr.c、 GeneralFun.h 与 GeneralFun.c、GPIO.h 与 GPIO.c 等。C 语言程序文件又分为如下 3 类: 图1 小灯闪烁工程相关源文件的树型结构 (1)主函数文件和中断函数处理文件 一般嵌入式软件的执行流程有两条线,一条是主循环,另一条就是中断请求处理,分别 对应了 main.c 和 isr.c 文件,因此将这两个文件与其他文件分开管理。 (2)总体框架程序文件 总体框架程序文件中包含的是通用程序文件, 这些

3、文件在每一个工程都会使用到。 例如, 图 1 小灯工程中的 GeneralFun.c 文件,它提供了常用的功能性子函数,如延时子函数等,像 这些框架性的文件,每个工程都要包含。 (3)软件构件 每个功能实体,或叫作“构件” ,都对应一个软件构件程序文件。例如,图 1 小灯工程 中的 Light.c 就是用于指示灯控制的“Light”构件。 由于头文件基本上是与 C 语言程序文件一一对应的,所以对头文件也是如此分类,这 里不再赘述。 3) 链接文件 链接文件的后缀名为.lcf,它是一个地址链接文件,用于告诉编译器代码是如何安放在 具体的地址空间的。 4) 工程说明 工程说明文件用来放对构件的描述

4、、 测试用例和系统的硬件接线等信息, 还可以将调试 心得以及工程的变更信息和注意事项放在其中。特别注意,要重视工程说明文件,必要的工 程说明对于软件开发者的交互是非常必要的。 2. 不带操作系统的嵌入式程序组织结构 1)保证各模块的松散耦合性质 各个模块之间不能有横向联系, 从程序中删除某个模块的代码, 不能影响到整个系统的 运行。模块之间禁止使用全局变量传递参数,底层模块的驱动不能使用全局变量,尽可能少 的使用文件级变量。 编写底层驱动模块不要考虑具体项目应用, 只依照模块本身应有的功能 来编写,要保证其通用性。 2)嵌入式程序组织 无操作系统的嵌入式程序分主程序和中断处理程序两条主线, 设

5、计时主程序一定要有流 程图的概念,中断处理程序与主程序通过全局变量进行交互。主程序的流程一定要清晰化, 中断处理程序一定简单化,不要过多占用系统时间。 3)主程序的结构 主程序的一般结构为:芯片初始化模块初始化内存变量初始化开放中断 进入系统总循环。 通常各个模块中断的开启与关闭语句, 可在相关的头文件中用宏定义来固 定成类似函数调用的形式供主函数和中断处理函数调用。 在主程序中开放总中断的语句, 应 该放置在进入系统总循环之前的几句代码处。在开放总中断之前,一定要保证芯片、模块以 及内存变量的初始化圆满完成。 若检测到看门狗复位, 可以视情况决定是否重新执行内存变 量初始化过程。若检测到短时

6、间内在同一地方产生多次 COP 复位,则可判定系统在该处有 问题。 要考虑主循环周期的两个极限, 即最快和最慢时执行一次的时间。 尽可能降低最大极限 时间的数值,使得最小和最大两个极限时间的差异不是很大。看门狗喂食不要到处加,不能 加在中断处理程序中,一般加在主循环中的开头的语句中,要考虑最大极限时间的影响。 要留两个小灯用于系统状态的显示:运行指示灯和错误指示灯。 在主循环中, 对任务进行合理的切分, 用全局的状态变量作为信号量来实现各个任务之 间的通信。这样可以有效降低主循环的最大极限时间,提高系统的实时性能。 4)中断处理程序 除非实时要求非常高,否则不要在中断中直接干预硬件,且中断程序

7、尽可能简单化,使 用的全局变量也应尽量少。 3. 注意事项 在实际编程过程中,除了要按上述方法组织工程文件之外,还要注意如下几点: (1)工程中可以定义全局变量,但只能在 includes.h 中定义。 (2) 只有main.c和isr.c可以直接使用全局变量, 其他程序文件尽量不要使用全局变量, 如果要用,也要用传址的方式实现,不得直接使用。 (3)main.c 文件要尽量做到与芯片无关,即主程序不应直接控制底层构件,而要通过 调用构件函数来控制构件。 (4)主循环中的代码如果太长,可以按功能划分成多个函数,放在主函数之后,这些 函数在 main.c 中声明即可,不必放在 includes.

8、h 中。 (5)在每个软件构件的头文件中,要有对该构件的描述信息,一般用“/*/”括 起来,以方便软件构件的移植和使用。 (6)总中断和模块中断的开和关,应当在 isr.h 文件中以宏的形式定义。 3.2 MCU-C 程序基本编程规范 1概述 为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。本 标准规定了程序设计人员进行程序设计时必须遵循的规范。 本规范主要针对单片机编程语言 和 08 编译器而言,包括排版、注释、命名、变量使用、代码可测性、程序效率、质量保证 等内容。 2命名规则 1)命名基本原则 (1)命名清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,

9、较短的单 词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写。即“见名知 意“。 (2)命名风格要自始至终保持一致。 (3)命名中若使用特殊约定或缩写,要有注释说明。 (4)为了代码复用,命名中应避免适用与具体项目相关的前缀。 (5)应使用英语命名。 2)预定义(#define) 只使用大写字母,下划线和数字。 例如: #define MAX_LENGTH 1 3)宏和常量命名 只使用大写字母,下划线和数字。宏和常量用全部大写字母来命名,词与词之间用下划 线分隔。对程序中用到的数字均应用有意义的枚举或宏来代替。 4)变量命名 变量命名规则: _类型名称。 范围 前最 结构体的

10、成员变量 m_ 静态变量 s_ 全局变量 g_ 局部变量 无前缀 类型 前缀 指针(Pointer) p 枚举(Enumeration) e 布尔(Boolean) b 浮点(Float) f 双精度(Double) d 字符(Char) c 结构(Structure) st 其他数字类型, e.g. byte, (unsigned) int, (unsigned)long int, (unsigned)short, (unsigned) short int, (unsigned) long long n 例如: /全局变量 int g_nMaxCount; /函数体内局部变量 MyEnumT

11、ype eParsingMode; 局部循环体控制变量优先使用 i、j、k 等;局部长度变量优先使用 len、num 等;临时 中间变量优先使用 temp、tmp 等。 5)结构和类型定义(typedef) 按 Camel-Style 方式命名,如 ThisIsAnExampleStructOrEnumOrTyedef 。避免使用下划线。 6)枚举 按 Camel-Style 方式命名,如 ThisIsAnExampleStructOrEnumOrTyedef 。避免使用下划 线。 Enum DataSetState ValidModified = 1, InvalidModified = 2

12、, AllDataLoaded = 3 7)函数命名 按 Camel-Style 方式命名, ThisIsAnExampleMethod。 8)文件命名 一个文件包含一类功能或一个模块的所有函数, 文件名称应清楚表明其功能或性质。 每 个.c 文件应该有一个同名的.h 文件作为头文件。 3注释 1)注释基本原则 有助于对程序的阅读理解, 说明程序在“做什么“, 解释代码的目的、 功能和采用的方法。 一般情况源程序有效注释量在 30左右。 注释语言必须准确、易懂、简洁。边写代码边注 释,修改代码同时修改相应的注释,不再有用的注释要删除。 汇编和 C 中都用“/“,取消“;“ 不使用段注释“ /*

13、 */ “(调试时可用) 。 2)文件注释 文件注释必须说明文件名、项目名称、函数功能、创建人、创建日期、版本信息等相关 信息。修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的 目的。所有修改记录必须保持完整。 文件注释放在文件顶端,用“/*/“格式包含。 注 释文本每行缩进 4 个空格;每个注释文本分项名称应对齐。 /* 文件名称: 项目名称: 作 者: 版 本: 说 明: 修改记录: */ 3)函数注释 函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容。如有必要还可 增加作者、创建日期、修改记录(备注)等相关项目。 函数头部注释放在每个函数的顶端,

14、用“/*/“的格式包含。其中函数名称应简写为 FunctionName(),不加入、出口参数等信 息。 /* 函数名称: 函数功能: 入口参数: 出口参数: 备 注: */ 4)代码注释 代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面。如放于上方则需 与其上面的代码用空行隔开。 一般少量注释应该添加在被注释语句的行尾, 一个函数内的多 个注释左对齐; 较多注释则应加在上方且注释行与被注释的语句左对齐。 通常, 分支语句 (条 件分支、循环语句等)必须编写注释。其程序块结束行“的右方应加表明该程序块结束的 标记“end of “, 尤其在多重嵌套时。例如: int nNum = 7

15、; / 注释 。 。 。 / 注释。 。 。 for(int i = 0 ; I 200mv 表示 1 信号, (D+)-(D-)-200 mV 表示 0 信号。VBUS 和 GND 为电源线和地线,VBUS 由主机提供,一般为+5 V。 对于 10/100BASE-T 以太网, 其传输也采用差分信号, 使用四个信号线: 两根用来发送, 两根用来接收。 每对信号线中的一根承载 0+2.5V 的信号电压, 而另一根承载的电压是 0 -2.5V,因此就可以产生一个 5Vpp 的信号差。 (2)输入 开关量 包括机械式的开关量输入、 电子式的开关量输入等等。 对于开关量的采集要考虑到对被 测试对象是否有干扰,以及被测对象会不会对其他对象产生干扰。对于模拟量也可以通过 A/D 转换把模拟量处理成开关量来使用。 模拟量 一般通过各种传感器来获取模拟量。 传感器取得的值一般在 mV、 mA 或V、 A 的级别, 所以通常也需要通过放大器进行放大之后在处理。 如果要在中断中对模拟量进行处理, 要注 意实时性的问题。 3)基本硬件测试实验 与控制相关的;收集的资料;原有的资料。 规范 I-5 工程交付前的

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号