下载  >  开发技术  >  硬件开发  > 单片机程序设计编程规范

单片机程序设计编程规范 评分:

本规范适用于松翰科技8-bit MCU 部门汇编程序编写准则,同样适用于代理商及重要客户工 程师编程规范参考。本规范的目的为统一编程风格,保证程序编写质量,提高程序的可移植 性和维护性。
就按键来说,一般有 Key buffer、 Key FIFo或直接进入APF|FO三种设计方式。 κ ey buffer:一般用于保存数字按键信息。例如:在电话机的设计中,需要记录按 键內容用于LCD显示、最后数字确认、数字存储等,这时候需要把按键值的信息 (0123456789#)记录在 Key buffer中 Key FIFo3-些功能按键可以将相应信息列入到KeyF|O中,等待应用层的取用, 这样可根据不同的工作模式进行不同的处理及动作。 这些类似的观念可以应用在许多周边中 输入类: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亿 clr 应该改为(只有一个出凵位置,标号为labe90,便于程序检査): lable boots jmp lable9o cIr lable9o e 5)上电复位时要对所有的RAM空间进行初始化(建议用户寄存器清零,系统寄存器 进行必要设定),不要使用未经初始化的变量。RAM未经过完整的初始化,容易导致程序执 行的不确定性,这一不良现象往往在批量生产中有所体现。(这点是工程师经常犯错的地方, 须特别注意) 6)系统中如果需要等待一些未知的应答信号,如通信或等待输入信号时,必须进行超 时或异常处理,以防止程序进入“死等”状态。 例如在红外接收中,由于信号的突然消失或干扰从而无法得到一·帧完整或正确的信 息,这时需要复位接收程序的入口条件并退出接收程厅,而不是一直等待信号的来临。不然 无法进行下次接收甚至会影响到其亡程序的执行。 7)通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效 率。这种方式是解决软件空间效率的根本办法。 8)保证循环伓内的工作量最小化。应仔细考虑循环体内的活句是杳可以放在循环体之 外,使循环体内工作量最小,从而提高程序的执行效率。 9)在多重循环中,应将最忙的循环放在最内层 10)中断处理程序应尽量短。有效的作法为:在中断中进行标记,在主程序中进行处 理。但一些实时性要求较高的程序例外。此外,进入中断时应该保存涉及到的变量和寄存器。 11)看门狗的正确使用。看门狗主要用于微控制器死机时的时间溢出复位,需要程序 适时清除。正确的处理方式为:整个系统程序中尽量保证只有一处清看门狗位置,而且应处 在主循环的主干位置。切记不可在定时中断中清狗,因为微控制器有时只是在主循环中死掉。 (所有AC电源的应用程序都必须强迫加入看门狗选项尤其是条件式的看门狗有利」系统 发生异常后的重启动) 二、排版风格 1、程序采用缩进风格编写,缩进为1个Tab键,1个Tab键定义为8个空格位。 2、程序中的标号要从第一列廾始书写。以“”廾头的预编译命令也要从第一列廾始书写, 其他预编译命令采用缩进风格编写。 例如 1)以“开头的预编译命令要从第一列开始书写,其他预编译命令釆用缩进风格书 LIST ;从第列开始书写 CLUDESTD macro l h CONST NUMBER EQU 55h DATA /k00 DS CODE ORG oh 2)标号要从第一列开始书写 maIn 从第一列开始 mp maIn 缩进8个空格位 3)变量或常量的定义采用缩进风格。 例如 DATA keyun DS CONST NUMBER EQU 8 4)定义变量或常量时,变量名或常量名与命令符之间使用2个Tab键(相当于16个空 格位)分开,命令符与后面的操作数用1个Tab键(相当于8个空格位)分开 例如 keybuf DS NUMBER EQU 55h 5)操作码与操作数之间用1个Tab键(相当于8个空格位)分开。 例如: ORG 80h mov a NUmBer table DW 1234h 6.)程序中两个操作数之问用一个“,”作为分隔符,“#”号与立即数之问不需要分隔 符 例如 mov a,#55h 7)标号要单独占·行 8)相对独立的程序块之间必须加空行。 例如 ORG 10h INC LUDE sys.asm INCLUDE intasm INCLUDE key.asi 9)程序语句后面右有注释,所有的注释要遵守上下对齐的原则。 例如 booy 1,#7fh use dpox(hI) pointer moy a,#00 set pointer = 007th 应该书写为: booy ,#7fh use dpOx(hl) pointer moV a,#00 set pointer= 007th 、程序可读性与可维护性 1.程序中的语句、标号、变量使用小写英文字母,常量与预编译命令使用大写英文宇母, 以便和一般的语句进行区分。 例如 NUMBER EQU 55b DATA accout DS CODE a#ENUMBER 2.表示不同进制的立即数,要在立即数后面加上不同的进制符号。 例如 moV a,#00100011b mov a#23h 不建议使用 mov a,#0x23 3.一般情况下,变量和常量要分开定义,不要混在一起。变量在”DATA”段中定义,采用 命令符“DS”,常量在” CONST”段中定义,米用命令符“EQU 例如 CONST NUMB ER EQU 10 ATA accout DS 4.程序中不使用未定义或意义不明确的常量。 例如 下面的赋值方法要避免使用 a,#3 不要直接使用意义不明确的数字 在常量中做定义 mov r a 建议米用如下赋值方法: CONST NUMBER EQU 3 ;循坯次数 CODE mov a #NUMBER ra 5.整个程序的结尾要以“ENDP”话句结束。 6.当·段代码在程序中有多个地方使用吋,建议采用了程序调用或宏命令的方式来替代。 如此,对该代码段的修改就可在一处完成,增强代码的可维护性。 7.程序中关系较为密切的子程序代码尽可能相邻。 8.避免程序中的垃圾代码,预留代码应以注释的方式山现。程序中的垃圾代码不仪占用额 外的空间,而且还可能影响到稈序的功能与性能,很可能给程序的测试、维护等造成不必要 的麻烦。 四、注释 1.程序应该包括两个部分注释,说明部分和语句注释。般情况下,源程序有效注释量必 须存30%以上。 2.说明部分 1)源文件说明部分位于每个源文件的最前面,主要描述:文件名、作者、生成日期、 联络方式、功能描述、版本号、软硬件平台、版杈说明、修改记录等的简要说明,以英文书 与 例如 k★本大大水★★古★★本大★大古和★★六大;★大★水大大★大★本k古大★六大★六★ File name 文件名 Author. 作者 Date 期 Email ;邮箱地址 Description 功能描述 Version 版本号 6 Hardware &DE 软硬件平台 Copyright(C), SONIX TECHNOLOGY Co., Ltd Histor ;修改记录 大大和★★★★*火★为h大火大大计为大为计为★★者火★★★*★大★k 2)子程序说明部分位于每个子程序的最前面,主要描述:子程序名称、功能、设计原 理、所用变量、入口条件、岀口信息、调用模块、堆栈层数、影响资源、算法简述、使用说 明和修改记录等 例如 为★*火★*★*大;★背★大大大如大★★★★火★★*大★大 Subroutine: ;子程序名称 Description 子程序功能的描述 Principium 程序设计原理 Calls 被木子程序调用的子程序清单 Variables 本子程序中所用到的临时变量 Input: 了程序调用所需要基本参数的说明 Output 子程序调用后运算结果的说明 Stack: 占用的堆栈层数 Histo 修改记录 3.边写代码边注释,修改代码的同吋修改相应注释,以保证注释与代码的致性。不再有 用的注释要朋除。 4.要避免在注释中使用缩写,特别是非常用缩写 5.程序在必要的地方必须有注释,注释要准确、易懂、筲洁。注释要有意义,如果有需要, 还要详细措述相关含义。 例如 以下是无意义的注释 moy a#5 把5赋给acc moy wkoO. a 把acc赋给wk0O 应该如下注释: moy a#5 ;设置循环次薮为5次 mov Koo. a 6.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释 的相邻位置,不可放在下方,如放于上方则需与其上面的代码用空行隔开 例如 wkoo Check read index= fiFo limit cprs Is Read index= limit Imp 7.注释格式尽量统一,对多行注释建议使用“/*…….*’,对单行的注释建议使用“;”’。 8.注释应考虑程序易读及外观排版因素,语言尽量统一。对不能进行准确英文表达的建议 使用中文。 9.对有含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说 明其含义 五、变量命名规则 变量的名称要采用有意义的英文单词小写缩写。可以采用以卜儿和方式进行缩写命名 1)去掉所有不在词头的元音字母。如 screen可以简写为scrn 2)使用每个单词的头儿个字母。如 channelactivation可以简写为 chanactiy 3)使用变量名中具有典型意义的单词。如 numberofcycle可以简写为 cyclenumber 4)去掉无用的单词后缀ing、ed等。如 pagingrequest可以简写为 paged 5)尽量使用标准或惯用的缩写形式,缩写应该保持一致性。如 serial peripheral interface可以简写为spin 6)部门已经完成函式的变量名称,如果没有特别原因,发展人员延续使用以增加可 读性 2.在定义部分要加入注释来说明变量的含义 3.变量的定义要在“DATA段中。 4.变量标识符的长度不超过16个字符。 5.程序会用到起码三种变量 1)全局变量 名称前面不加任何修饰 2)局部变量 利用wk00,Wk01.Mkon来表示,每个独立程序里面用到的 Local var.可有效节省RAM 3)中断局部变量 中断里面用的 Interrupt local var利用Mk00,Mwk01以作为 区隔(注意中断使用的变量必定要小心的跟主程序区隔开,不然影响系统稳定性相当大) 例如: DATA accout ds 1 ;全局变量 number ds 5 ;局部变量 6.位定义。程序多处会经常对寄存器的某一位进行操作,可以在变量定义时对需要用到的 位进行定义,建议名称以”开头 7.临时工作寄存器的定义。程序中经常需要用到一些临时存储数据的寄存器,我们称之为 临时工作寄存器,这些临时工作寄存器的命名方法为“w加上一个二位数字组成,这个 数宇字可以从‘o0”开始随着需要定义的临吋匚作寄行器的数量的增加而增加。需要特别说明 的是,临时工作寄存器的使用可以人量节笮RAM空间,但是要注意相应的生命周期,必须 在子程序退出之前,将空间释放以便其它子程序使用。 8.在中断处理程序中用到的寄存器,为了和一般的临时工作寄存器作以区分,可以在寄存 器前面加英文字母“”米命名。在使用时需要加以注意,不要和主程序中的变量复用 例如 DATA wkoo s Wk01 ds Nk02 iwk ds ;中断中要用到的临时工作寄存器 ds 中断中要用到的临时工作寄存器 CODE mov ar moV wkoo.a mov a, wko1 mov ra 六、常量命名规则 1.常量的名称要采用有意义的英文单词大写缩写。 2.常量要定义在“CONT段中 3.在定义部分要加入注释来说明常量含义。 4.常量标识符的长度不超过16个字符。 5.系统寄存器中常用到的某些位可以再额外进行定义,但要有意义: P kev EQU P1.0 P打头表示为Port定义 Pm key1 EQU P1m.0 Pm打头表示为Port方向定义 七、标号命名规则 1.标号的名称要采用有意义的英文单词小写缩写。 2.了程序标号定义。在同·个了程序中,所有的标号应该有规律可寻。建议第·个标号为 子稈序名,下面所用到的标号用子稈序名添加数字表示,从而便于今后程序的添加和修改。 数字尽量使用两位数,在子程序的退出位置,数字一般为”90°。 例如: 在一段按键扫描程序中,如下的标号是不可取的。 Labe|∷ LabeloK Labelfai LabelQuit Labelfun Labeled: Ret 设计要化许多精神命名 label,同时不容易看出子程序的结枃关西,所以建议在子程序 里面别在化精神命名,都用号码表示)(详细的动作都用注解米说明) 应该改为: 火如业火★★★★实火实北★★为★★★如★*★★实★★★★北火★头 Sub-routine Name: label 大大大★大★言大大木★大大★大古大大★内大★★大★古大言★大大★本大木大★大古大大★古★古大 Label: If the condition fail then go to Label9o program begin here 9 Labella 注解都写在这里 Labe 20 最后结尾结束的labe|都用90当做结尾 有助于程序的阅读 Labels Ret 3.为了使程序的结构更加清晰,子程序的命名要尽量能显示出相互间的调用关系 由main主循环中直接调用的程序,要以“mn”作为标号的开头,下面仪列出些常用的 子程序名称,其它类似情况可同样处理。 mn app 系统应用程序 mn intend 中断与主程序之问的界面子程序 mn ke 按键扫描子稈序 mn cd ;LCD显示了程序 mn e LED显示子程序 mn tone 声音处理子程序 mn epp EEPROM读写操作 bi mn bIo ;基本输入/输出控制 mn adc ADC输入及处理 mn debug debug处理程序 4.程序的几个常用入口地址命名如下: 复位入∏: reset 中断入口:isr 主程序入凵:main 例如: org 0 Imp reset org 8 Jmp s ISR(Interrupt Service Routine org 10 有效程序开始地址 reset 进入主程序前的一些准备工作(预处理) premain. ;主程序循环圈 maIn Jmp main

...展开详情
2018-07-17 上传 大小:268KB
举报 收藏
分享
c_51单片机程序设计

良好的入门教程 和试验对初学者非常重要 不论的单片机还是其它 这本书一步一步将你带入单片机 浩瀚的海洋 深入了解

立即下载
51单片机编程规范

在网上找到这份单片机C51编程规范,觉得很有用,所以转过来,决定在以后自己编C51程序的时候用上。

立即下载
单片机的c语言应用程序设计(修订版)

单片机经典C语言应用,全书全书都是用C语言讲解的单片机编程。打开软件需要用超星阅读器!

立即下载
KEIL_C写法规范

KEIL C语言编程的一些文档规范,比较实用.

立即下载
单片机程序设计规范

单片机开发技术规范,希望对学习单片机的同学有帮助!!!

立即下载
单片机程序编写代码规范工具

单片机程序编写代码规范工具,有助于规范程序代码

立即下载