单片机程序设计编程规范
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机程序设计编程规范
本规范适用于松翰科技 8-bit MCU部门汇编程序编写准则,同样适用于代理商及重要客户工程师编程规范参考。本规范的目的为统一编程风格,保证程序编写质量,提高程序的可移植性和维护性。
大部分的规范严格, 品质要求高的软件公司对员工编写代码的风格都有硬性规定, 例如缩排的使用,TAB 的长度,函数变量的命名方式。这些规定的明显好处是可以统一规范不同程序员所编制的代码,提升程序代码的可读性与可维护性,同时统一格式的编程风格也为code review提供方便。
目录
一、设计总则
二、排版风格
三、程序可读性及可维护性
四、注释
五、变量命名规则
六、常量命名规则
七、标号命名规则
八、文件命名规则及文件分割
九、标准程序模块
十、附录
一、设计总则
1.程序质量的评估
程序的优劣可以从两个方面进行评估,定量指标和定性指标。
定量指标包括:
1) 程序代码执行效率;
2) 程序占用资源多少。
定性指标包括:
1) 可调试性,即是否方便排除程序语法错误;
2) 可测试性,即是否方便验证程序功能的正确性;
3) 可维护性,即是否方便程序的修改和升级;
4) 可移植性;
5) 可读性。
2、程序架构
为了便于维护和移植,推荐使用层次化的软件设计方法。可把整个软件分为三层:应用层、界面层和底层驱动层。各层之间的关系如下图所示。
层次化设计说明:
1) 底层驱动层主要包含直接和硬件相关的驱动程序,如数码管显示、按键、峰鸣器、继电器和电机控制等。底层的各个模块间要保持各自的独立性,不产生直接的数据交互,底层也不直接访问应用层,如果有需要,都要通过界面层进行数据交互。
2) 界面层主要提供数据交互,为应用层和底层驱动之间以及底层驱动层各模块之间提供数据的交互。
3) 应用层主要完成具体功能的实现,它要通过界面层控制底层驱动层各模块来完成所需功能,而不能越过界面层直接访问底层驱动层。所有的用户接口要在应用层来实现。
4) 一个好的架构必须将底层硬件包装起来,为应用程序提供一组丰富的函数操作(buffer or parameter),例如在中断的处理中,应用程序不需要资料中断的堆栈如何保护不需要知道地址操作, 只需要读取中断产生的旗标动作。
5) 在即时性软件系统里面,对达到高效率的实时性与反应力, 所以程序使
用大量的事件触发方式来设计任务。事件有可能来自外部的触发(key , rxdata , sensor detect, …)也可能是系统内部自行产生的(Timer, alarm, flag),与事件触发方式相对应的是定时查询方式(polling),一般来说polling 效率较差因为有多余的动作而且系统反应时间与查询polling时间间隔有关, 但是在小型的MCU系统里面用Polling方式反而简单许多。
3、设计基本原则
1) 尽量减少各个子程序功能模块间的耦合度(耦合度是指一个程序的执行对另一个程序的影响力),保证各自的独立性。一般情况下,建议子程序模块功能的划分要尽可能细化,功能尽量单一,减少子程序模块间的数据交互。
2) 在满足功能需求的情况下,可适当牺牲代码的执行速度,以保证程序的透明度。
3) 主要子程序模块间的交互,要通过特定的界面跟应用层进行沟通,可使用 FIFO(First in,First out)或是 Buffer 两种方式。每种子程序模块都可以有自己的FIFO。例如:就按键来说,一般有 Key buffer、Key FIFO 或直接进入AP FIFO三种设计方式。
Key buffer:一般用于保存数字按键信息。例如:在电话机的设计中,需要记录按键内容用于LCD 显示、最后数字确认、数字存储等,这时候需要把按键值的信息(0123456789*#)记录在 Key buffer 中。
Key FIFO:一些功能按键可以将相应信息列入到Key FIFO中,等待应用层的取用,这样可根据不同的工作模式进行不同的处理及动作。
这些类似的观念可以应用在许多周边中:
输入类:Key、RF Data input、UART data input、Switch input等。
输出类:LCD display、LED display、UART data output等。
APP FIFO(应用界面层):主要是将发生的事件储存在APP FIFO里面等待适当的时间依序处理,不然有可能造成系统在某一程序物件里面循环,从而降低系统的实时性(Real-Time)。
4)每个子程序模块只能有唯一一个程序入口地址在程序的首部,只能有唯一一个程序出口地址在程序的尾部。
例如:
以下的写法是不规范的(两个RET出口,存在调试时不易设立断点,程序可读性降低等问题):
lable:
b0bts0 fz
ret
…
clr y
ret
应该改为(只有一个出口位置,标号为 lable90,便于程序检查):
lable:
b0bts0 fz
jmp lable90
…
clr y
lable90:
ret
5) 上电复位时要对所有的RAM空间进行初始化(建议用户寄存器清零,系统寄存器进行必要设定),不要使用未经初始化的变量。RAM未经过完整的初始化,容易导致程序执行的不确定性,这一不良现象往往在批量生产中有所体现。(这点是工程师经常犯错的地方,须特别注意)
6) 系统中如果需要等待一些未知的应答信号,如通信或等待输入信号时,必须进行超时或异常处理,以防止程序进入“死等”状态。
例如在红外接收中,由于信号的突然消失或干扰从而无法得到一帧完整或正确的信息,这时需要复位接收程序的入口条件并退出接收程序,而不是一直等待信号的来临。不然无法进行下次接收甚至会影响到其它程序的执行。
7) 通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。这种方式是解决软件空间效率的根本办法。
8) 保证循环体内的工作量最小化。应仔细考虑循环体内的语句是否可以放