单片机程序设计编程规范
单片机程序设计编程规范
本规范适用于松翰科技8-bitMCU部门汇编程序编写准则,同样适用于代理商及重要客户工程师编程规范参考。本规范的目的为统一编程风格,保证程序编写质量,提高程序的可移植性和维护性。
大部分的规范严格,品质要求高的软件公司对员工编写代码的风格都有硬性规定,例如缩排的使用,TAB的长度,函数变量的命名方式.这些规定的明显好处是可以统一规范不同程序员所编制的代码,提升程序代码的可读性与可维护性,同时统一格式的编程风格也为codereview提供方便.
目录
一、设计总则
二、排版风格
三、程序可读性及可维护性
四、注释
五、变量命名规则
六、常量命名规则
七、标号命名规则
八、文件命名规则及文件分割
九、标准程序模块
十、附录
设计总则一、一、设计总则
1.程序质量的评估
程序的优劣可以从两个方面进行评估,定量指标和定性指标。
定量指标包括:
1)程序代码执行效率;
2)程序占用资源多少。
定性指标包括:
1)可调试性,即是否方便排除程序语法错误;
2)可测试性,即是否方便验证程序功能的正确性;
3)可维护性,即是否方便程序的修改和升级;
4)可移植性;
5)可读性。
2、程序架构
为了便于维护和移植,推荐使用层次化的软件设计方法。可把整个软件分为三层:应用层、界面层和底层驱动层。各层之间的关系如下图所示。
层次化设计说明:
1)底层驱动层主要包含直接和硬件相关的驱动程序,如数码管显示、按键、峰鸣器、继电器和电机控制等。底层的各个模块间要保持各自的独立性,不产生直接的数据交互,底层也不直接访问应用层,如果有需要,都要通过界面层进行数据交互。
2)界面层主要提供数据交互,为应用层和底层驱动之间以及底层驱动层各模块之间提供数据的交互。
3)应用层主要完成具体功能的实现,它要通过界面层控制底层驱动层各模块来完成所需功能,而不能越过界面层直接访问底层驱动层。所有的用户接口要在应用层来实现.
4)一个好的架构必须将底层硬件包装起来,为应用程序提供一组丰富的函数操作(bufferorparameter),例如在中断的处理中,应用程序不需要资料中断的堆栈如何保护不需要知道地址操作,只需要读取中断产生的旗标动作.
5)在即时性软件系统里面,对达到高效率的实时性与反应力,所以程序使用大量的事件触发方式来设计任务.事件有可能来自外部的触发(key,rxdata,sensordetect,…)也可能是系统内部自行产生的(Timer,alarm,flag),与事件触发方式相对应的是定时查询方式(polling),一般来说polling效率较差因为有多余的动作而且系统反应时间与查询polling时间间隔有关,但是在小型的MCU系统里面用Polling方式反而简单许多
3、设计基本原则
1)尽量减少各个子程序功能模块间的耦合度(耦合度是指一个程序的执行对另一个程序的影响力),保证各自的独立性。一般情况下,建议子程序模块功能的划分要尽可能细化,功能尽量单一,减少子程序模块间的数据交互。
2)在满足功能需求的情况下,可适当牺牲代码的执行速度,以保证程序的透明度。
3)主要子程序模块间的交互,要通过特定的界面跟应用层进行沟通,可使用FIFO(Firstin,Firstout)或是Buffer两种方式。每种子程序模块都可以有自己的FIFO。例如:
就按键来说,一般有Keybuffer、KeyFIFO或直接进入APFIFO三种设计方式。
Keybuffer:一般用于保存数字按键信息。例如:在电话机的设计中,需要记录按键内容用于LCD显示、最后数字确认、数字存储等,这时候需要把按键值的信息(0123456789*#)记录在Keybuffer中;
KeyFIFO:一些功能按键可以将相应信息列入到KeyFIFO中,等待应用层的取用,这样可根据不同的工作模式进行不同的处理及动作。
这些类似的观念可以应用在许多周边中:
输入类:Key、RFDatainput、UARTdatainput、Switchinput等;
输出类:LCDdisplay、LEDdisplay、UARTdataoutput等。
APPFIFO(应用界面层):主要是将发生的事件储存在APPFIFO里面等待适当的时间依序处理,不然有可能造成系统在某一程序物件里面循环,从而降低系统的实时性(Real-Time)。
4)每个子程序模块只能有唯一一个程序入口地址在程序的首部,只能有唯一一个程序出口地址在程序的尾部。
例如:
以下的写法是不规范的(两个RET出口,存在调试时不易设立断点,程序可读性降低等问题):
lable:
b0bts0fz
ret
…
clry
ret
应该改为(只有一个出口位置,标号为lable90,便于程序检查):
lable:
b0bts0fz
jmplable90
….
clry
lable90:
ret
5)上电复位时要对所有的RAM空间进行初始化(建议用户寄存器清零,系统寄存器进行必要设定),不要使用未经初始化的变量。RAM未经过完整的初始化,容易导致程序执行的不确定性,这一不良现象往往在批量生产中有所体现。(这点是工程师经常犯错的地方,须特别注意)
6)系统中如果需要等待一些未知的应答信号,如通信或等待输入信号时,必须进行超时或异常处理,以防止程序进入“死等”状态。
例如在红外接收中,由于信号的突然消失或干扰从而无法得到一帧完整或正确的信息,这时需要复位接收程序的入口条件并退出接收程序,而不是一直等待信号的来临。不然无法进行下次接收甚至会影响到其它程序的执行。
7)通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。这种方式是解决软件空间效率的根本办法。
8)保证循环体内的工作量最小化。应仔细考虑循环体内的语句是否可以放在循环体之
外,使循环体内工作量最小,从而提高程序的执行效率。
9)在多重循环中,应将最忙的循环放在最内层。
10)中断处理程序应尽量短。有效的作法为:在中断中进行标记,在主程序中进行处理。但一些实时性要求较高的程序例外。此外,进入中断时应该保存涉及到的变量和寄存器。
11)看门狗的正确使用。看门狗主要用于微控制器死机时的时间溢出复位,需要程序适时清除。正确的处理方式为:整个系统程序中尽量保证只有一处清看门狗位置,而且应处在主循环的主干位置。切记不可在定时中断中清狗,因为微控制器有时只是在主循环中死掉。(所有AC电源的应用程序都必须强迫加入看门狗选项尤其是条件式的看门狗有利于系统发生异常后的重启动)
排版风格二、二、排版风格
1、程序采用缩进风格编写,缩进为1个Tab键,1个Tab键定义为8个空格位。
2、程序中的标号要从第一列开始书写。以“.”开头的预编译命令也要从第一列开始书写,其他预编译命令采用缩进风格编写。
例如:
1)以“.”开头的预编译命令要从第一列开始书写,其他预编译命令采用缩进风格书写。
.LIST;从第一列开始书写
INCLUDESTDmacro1.h
.CONST
NUMBEREQU55h
.DATA
wk00DS1
.CODE
ORG0h
2)标号要从第一列开始书写。
main:;从第一列开始
…
jmpmain;缩进8个空格位
3)变量或常量的定义采用缩进风格。
例如:
.DATA
keybufDS1
.CONST
NUMBEREQU8
4)定义变量或常量时,变量名或常量名与命令符之间 …… 此处隐藏:2708字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [小学教育]四年级综合实践活动课《衣物的洗涤》教
- [小学教育]2014半年工作总结怎么写
- [小学教育]20世纪外国文学专题综合试题及答案
- [小学教育]TS_1循环使用催化丙烯环氧化反应研究
- [小学教育]最实用的考勤签到表(上下班签到表)
- [小学教育]气候与生态建筑——以新疆民居为例
- [小学教育]二人以上股东有限责任公司章程参考样本
- [小学教育]2014届第一轮复习资料4.1,3美好生活的
- [小学教育]土方开挖、降水方案
- [小学教育]手绘儿童绘本《秋天的图画》(蜡笔)
- [小学教育]2002级硕士研究生卫生统计学考试试题
- [小学教育]环保装备重点发展目录
- [小学教育]金蝶K3合并报表培训教材
- [小学教育]岩浆岩试题及参考答案
- [小学教育]知之深爱之切学习心得
- [小学教育]第十二章 蛋白质的生物合成
- [小学教育]Chapter 2-3 Solid structure and basi
- [小学教育]市政道路雨季专项施工方案
- [小学教育]中国海洋大学2012-2013学年第二学期天
- [小学教育]教育心理学第3章-学习迁移
- 浅谈深化国企改革中加强党管企业
- 2006年中国病理生理学会学术活动安排
- 设计投标工作大纲
- 基于ARP的网络攻击与防御
- 2016届湖北省七市(州)教科研协作体高三
- Google_学术搜索及其检索技巧
- 2019-2020学年七年级地理下册6.3美洲教
- 城市道路可研报告
- 【名师指津】2012高考英语 写作基础技
- 6级知识点培训北京师范大学《幼儿智趣
- 注册会计师会计知识点:金融资产
- 新安装 500 kV 变压器介损分析与判断
- PS2模拟器PCSX2设置及使用教程.
- 医院药事管理与药剂科管理组织机构
- {PPT背景素材}丹巴的醉人美景,免费,一
- NAS网络存储应用解决方案
- 青海省西宁市六年级上学期数学期末考试
- 测量管理体系手册依据ISO10012:2003
- 洞子小学培养骨干教师工作计划
- 浅谈《牛津初中英语》的教材特点及教学




