《软件设计规范标准.docx》由会员分享,可在线阅读,更多相关《软件设计规范标准.docx(88页珍藏版)》请在三一办公上搜索。
1、深知I市德卡科技有眼公司SHENZHENDECARDSMARTCARDTECHCO.,LTD.软件设计规范制定:审核:批准:文件编号生效日期版本号分发部门修订履历序号版本修订内容修订人修订日期会签与文件发放:会签部门会签人会签日期签收部门签收人签收日期深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心第一章、项目模块划分16一、模块划分16二、模块命名16第二章、文件格式16一、c文件格式说明:161、文件创建及修改说明区162、头文件引用区173、全局
2、变量定义区174、驱动函数区175、应用函数区186、文件结束说明18二、h文件格式说明181、文件创建及修改说明区182、防重调用定义193、头文件引用194、控制接口定义区195、常量定义区206、宏调用定义区207、类型定义区208、外部引用变量区209、外部引用函数区2110、操作流程说明区2111、文件结束说明21第三章、命名规则22一、函数命名规则22深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心二、变量命名规则22三、宏命名规则23四、文件命名规则23五、新定义变量类型命名规则23六、命名注意事项:231、标识符命名基本原则232
3、、命名中若使用特殊约定或缩写,则要有注释说明243、局部循环变量也必须按照变量命名规则来定义244、不要用数字或较奇怪的字符来定义标识符245、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等246、避免使用以下划线开始和结尾的定义247、程序中不要出现仅靠大小写区分的相似的标识符248、标识符缩写259、函数名应准确描述函数的功能2510、避免使用无意义或含义不清的动词为函数命名25第四章、代码书写规范25一、基本原则25二、排版251、缩进风格252、不要使用【TAB】键253、空行254、语句长度要小于80个字符265、长语句换行266、长表达式换行277、若函数的参数较长,则要
4、进行适当的划分278、一行只写一条语句279、括号2810、语句缩进要求28深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增修订发行部门研发中心11、分界符2912、空格30三、注释311、注释量312、函数头部注释313、代码与注释同时修改314、注释的内容要清楚、明了,含义准确,防止注释二义性325、避免在注释中使用缩写,特别是非常用缩写326、注释书写位置327、变量、常量命名不能充分自注释的,必须加以注释328、数据结构命名不能充分自注释的,必须加以注释339、全局变量注释3310、注释要与说描述的内容进行同样的缩排3311、将注释与其上面的代码用空行隔开34
5、12、连续CaSe语句处理时,必须编写注释3513、代码或表达式的中间禁止插入注释3614、通过正确命名使代码成为自注释的3715、在代码的功能、意图层次上进行注释,提供有用、额外的信息3716、在程序块的结束行右方加注释标记,以表明某程序块的结束3717、注释格式3718、采用中文注释3819、使用#if0和#endif注释代码块3820、注释不能嵌套38四、代码可读性381、使用小括号明确表达式的操作顺序382、用有意义的枚举和宏替代数字393、源程序中关系较为紧密的代码应尽可能相邻394、用多行简单语句替代复杂语句40深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别
6、新增修订发行部门研发中心五、变量,结构401、公共变量401.1、 去掉没必要的公共变量401.2、 仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系.401.3、 明确公共变量与操作此公共变量的函数或过程的关系401.4、 要谨慎向公共变量传递数据411.5、 防止局部变量与公共变量同名。411.6、 公共变量仅由模块或函数创建和修改,其余模块和函数只能访问412、局部变量412.1、 严禁使用未经初始化的变量作为右值412.2、 不使用与硬件或软件环境关系密切的变量412.3、 变量声明时,同一类型,不同意义的多个变量,要分行,便于区分.412.4、 对只设置一次的变量,宜使
7、用“const”限定词进行声明422.5、 避免在函数中使用static局部变量423、数组423.1、 数组大小及初始值要明确定义423.2、 数组、结构和联合的初始化列表应显式描述424、结构、联合424.1、 结构的功能要单一,是针对一种事务的抽象424.2、 不要设计面面俱到、非常灵活的数据结构434.3、 不同结构间的关系不要过于复杂434.4、 结构中元素的个数应适中444.5、 结构体中元素的布局454.6、 结构体设计要考虑兼容性464.7、 跨平台数据结构,要考虑字节顺序及对齐问题464.8、 StrUet或Union类型中至少应有一个成员474.9、 StrUet或Unio
8、n类型的成员类型475、枚举47深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增修订发行部门研发中心5.1、枚举元素的初始化应完整476、自定义数据类型476.1、 合理地设计数据并使用自定义数据类型476.2、 自定义数据类型命名要恰当477、类型转换487.1、 谨慎使用数据类型的强制转换487.2、 了解编译系统默认的数据类型转换487.3、 应禁止signed类型与unsigned类型之间的隐式转化487.4、 应禁止int类型与float类型的隐式转化488、指针488.1、 不应对指针变量使用强制类型转换赋值488.2、 不应把自动类型的局部变量的地址赋值
9、给外部指针488.3、 指针的指针不应超过两级498.4、 指向不同数据类型的指针之间不应相互转换498.5、 指针转换过程中不应丢失指针的COilSt、VOlatile属性498.6、 只有指向数组的指针才允许进行算术运算498.7、 只有指向同一数组的两个指针才允许相减498.8、 只有指向同一数组的两个指针才允许用、=、和二等关系运算符进行比较508.9、 指针的索引值不应为负508.10、 10、不应对指针值可能为NULL的指针进行算术运算508.11、 调用返回类型为指针的函数后,应进行是否为空的判断508.12、 12、局部变量的地址不应在本对象消亡后传给另外一个对象508.13、
10、一个未知大小的对象的指针不应成为加法或者减法操作的左操作数.51六、函数511、函数编写原则511.1、 明确函数功能,精确(而不是近似)地实现函数设计511.2、 函数的规模尽量限制在200行以内511.3、 一个函数仅完成一件功能52深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心1.4、为简单功能编写函数521.5、 不要设计多用途面面俱到的函数521.6、 函数功能具有可预测性521.7、 函数功能具有独立性531.8、 防止函数出现随机内聚531.9、 功能不明确的较小函数,可以不必存在541.10、 设计高扇入、合理扇出(小于7)的函
11、数551.11、 减少函数本身或函数间的递归调用551.12、 降低函数间的耦合度552、函数参数552.1、 明确接口函数参数的合法性检查者552.2、 防止将函数的参数作为工作变量562.3、 避免设计多参数函数,不使用的参数从接口中去掉562.4、 非调度函数应减少或防止控制参数,尽量只使用数据参数572.5、 检查函数所有参数输入的有效性572.6、 检查函数所有非参数输入的有效性,如数据文件、公共变量等572.7、 调用函数时参数类型要一致582.8、 避免使用BOoL参数582.9、 在函数参数中不应使用StatiC存储类标识符582.10、 10、函数参数数量582.11、 宜避
12、免函数参数在调用中未被使用583、函数返回583.1、 对所调用函数的错误返回码要仔细、全面地处理583.2、 函数的返回值要清楚、明了,让使用者不容易忽视错误情况583.3、 函数返回值要与赋值变量类型一致583.4、 对于提供了返回值的函数,在引用时最好使用其返回值583.5、 函数只有一个出口584、可重入函数58深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增修订发行部门研发中心4.1、可重入函数使用局部变量584.2、可重入函数使用全局变量595、函数模块划分605.1、 仔细分析模块的功能,进行函数的划分和组织605.2、 如果多段代码重复做同一件事情,那
13、么在函数的划分上可能存在问题.605.3、 函数内部的代码结构顺序606、循环语句616.1、 循环控制变量的类型应为整型616.2、 循环控制变量应为局部变量616.3、 for循环控制语句中的3个表达式只应和循环控制相关616.4、 for循环不宜只执行一次617、判断语句627.1、不要轻易用条件分支去替换逻辑表达式627.2、switch语句中不应只包含default语句627.3、所有非空的SWitehCaSe子句都应以break语句结束627.4、switch控制表达式不应是一个常量或逻辑表达式627.5、每一个SWitCh语句都应至少有一个CaSe子句627.6、case表达式的
14、类型应与switch控制表达式的类型一致627.7、case表达式的大小不应超过switch控制表达式的大小628、赋值语句628.1、尽量不使用条件赋值语句629、其他注意事项629.1、 避免函数中不必要语句,防止程序中的垃圾代码629.2、 在多任务操作系统的环境下编程,更要注意函数可重入性的构造629.3、 将常用较长变量用宏替代62七、预处理631、宏631.1、 用宏定义表达式时,要使用完备的括号63深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心1.2、将宏所定义的多条表达式放在大括号中631.3、 使用宏时,不允许参数发生变化64
15、1.4、 函数类宏调用时参数要完整642、条件编译642.1、 预处理语句“#if”和“痴ndif”不应分散在不同的文件之中642.2、 被包含文件中的“#else、“#elseif、“#endif”不应与父文件中的“#if”匹配642.3、 “#if”表达式中使用的宏应该已经被定义,并且“#if”表达式只能包含整型常量642.4、 宏如果需要被重定义,应该先用Indef”解除前面的定义65八、中断651、中断服务程序不应有返回值652、中断服务程序中不应使用Printf()函数653、对于中断中使用到的非局部变量,在中断处理函数中应对其进行入栈保护.654、调用中断处理程序中的变量要进行开关
16、中断处理655、对于开关中断,要注意成对匹配656、中断服务程序代码要简单化65九、程序可测性651、原则651.1、 统一的调测开关及打印函数651.2、 统一的打印信息串格式651.3、 正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉)651.4、 用调测开关切换软件的DEBUG版和正式版651. 5、软件DEBUG版和发行版在实现功能上具有一致性661.6、 构造测试环境和测试用例661.7、预先设计程序调测的方法和手段及各种调测开关66L8、调测开关应分为不同级别和类型662、断言662.1、 使用断言来发现软件问题,提高代码可测性66深圳市德卡科技有限公司文件编号文
17、件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心2.2、用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况672.3、 不能用断言来检查最终产品肯定会出现且必须处理的错误情况672.4、 对较复杂的断言加上明确的注释672.5、 用断言确认函数的参数672.6、 用断言保证没有定义的特性或功能不被使用672.7、 用断言对程序开发环境(OS/Compiler/Hardware)的假设进行检查682.8、 编写防错程序,然后在处理错误之后可用断言宣布发生错误68十、程序效率691、原则691.1、 编程时要经常注意代码的效率69L2、提高代码效率的前提701.3、
18、局部效率应为全局效率服务701.4、 合理划分模块函数701. 5、不应花过多的时间拼命地提高调用不很频繁的函数代码效率701.6、 不要一味追求紧凑的代码701.7、 不应存在执行不到的代码701.8、 去掉没必要的全局变量702、方法702. 1、解决软件空间效率1702.6、 解决软件空间效率2712.7、 循环体内工作量最小化712.8、 仔细分析有关算法,并进行优化722.9、 仔细考查、分析系统及模块处理输入(如事务、消息等)的方式,并加以改进722.10、 直接用汇编编写调用频繁或性能要求极高的函数722.11、 在多重循环中,应将最忙的循环放在最内层722.12、 尽量减少循环
19、嵌套层次732.13、 尽量不在循环体内放置判断语句732.14、 尽量用乘法或其它方法代替除法,特别是浮点运算中的除法74深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增修订发行部门研发中心2.11、应注意SWitCh-CaSe语句的使用74十一、程序质量751、原则751.1、 代码质量保证优先原则751.2、 合理划分子模块,提高可移植性和可重用性751.3、 提供良好的接口界面751.4、 系统具有一定容错能力752、方法752.1、 认真处理程序所能遇到的各种出错情况752.2、 系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用752.3
20、、 系统运行之初,要对加载到系统中的数据进行一致性检查752.4、 严禁随意更改其它模块或系统的有关设置和配置752.5、 不能随意改变与其它模块的接口752.6、 防止内存操作越界762.7、 编程时,要防止差1错误762.8、 要时刻注意易混淆的操作符762.9、 条件判断语句必须处理所有情况772.10、 不要用goto语句772.11、 尽量都采用标准语句和标准库函数772.12、 避免使用嵌入式汇编772.13、 精心构造算法,并对其性能、效率进行测试772.14、 对较关键的算法最好使用其它算法来确认772.15、 时刻注意表达式是否会上溢、下溢772.16、 使用变量时要注意其边
21、界值的情况782.17、 注意程序代码是否超过系统有关限制782.18、 循环、分支层次不要超过五层782.19、 不要比较浮点数的相等782.20、 关注共用体的存储、对齐模式78深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增修订发行部门研发中心2.21、头文件中不应有对象或函数的定义782.22、 不应单独使用小写字母“1”或大写字母“0”作为变量名782.23、 函数声明时参数不应只有类型名没有标识符782.24、 不应对有符号数进行位运算792.25、 无格式的字符型不应与负数常量和零比较792.26、 无符号值不应与负数常量比较792.27、 27、对变量
22、进行移位操作应保证不会产生溢出和数据截短792.28、 不应在布尔表达式中使用赋值操作符792.29、 不应对布尔表达式进行算术或者位运算792. 30,表达式的值在任何求值顺序下应保持一致792.31、 应避免除数可能为0的情况出现792.32、 赋值运算符的左操作数不应进行转换操作,并且应该是一个可更改的对象792.33、 SiZeof操作符不应用在有单边作用的表达式上802.34、 留心具体语言及编译器处理不同数据类型的原则及有关细节80十二、代码代码编辑、编译、审查801、打开编译器的所有告警开关对程序进行编译802、在产品软件(项目组)中,要统一编译开关选项803、通过代码走读及审查
23、方式对代码进行检查804、测试部测试产品之前,应对代码进行抽查及评审805、养成随时保存编写代码的习惯806、同产品软件(项目组)内,最好使用相同的编辑器,并使用相同的设置选项817、要小心地使用编辑器提供的块拷贝功能编程818、合理地设计软件系统目录,方便开发人员使用81附录A常用数据类型及简写81附录B常用单词及缩写82附录C常见反义词组84附录D常见命名规则86一、匈牙利命名法86深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增修订发行部门研发中心二、骆驼(Came1)命名法86二、骆驼(Came1)命名法86三、帕斯卡(Pascal)命名法86四、下划线命名法
24、86三、帕斯卡(Pascal)命名法86四、下划线命名法86深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心第一章、项目模块划分一、模块划分将整个项目按照功能进行模块划分,各个模块相互独立,每个模块由一系列C文件和h文件组成。简单功能的模块采用一个C文件和h文件接口,复杂功能的模块可能需要多个C文件和h文件。二、模块命名按照模块所实现功能的英文名称或者简写命名,全部采用小写字母,多于1个单词的中间加下划线。例如:模块命名说明液晶led.cled.h液晶初始化,字符、汉字和图片显示lcd_fonts.clcd_fonts.h液晶自定义字库按键key
25、.ckey.h按键初始化,键值列表,取按键值指示灯led.cled.h指示灯初始化,闪烁控制数码管Iedseg.cIedseg.h数码管初始化,数字显示,特殊字符显示蜂鸣器beep,cbeep,h蜂鸣器初始化,鸣叫控制第二章、文件格式一、C文件格式说明:1、文件创建及修改说明区深圳市德卡科技有限公司文件编号文件版本Al生效日期软件设计规范发行类别新增口修订发行部门研发中心*4*Copvright(c)*4*SHENZHENDECARDTECHNOLOGIESCo.,LTD. http:/wwwdecard,com *AFilelnfo *Createby:xp *Createdate:2013
26、-02-20 *Version:1.0 Descriptions:模板科FileInfom Modifyby: Modifydate: *Version: Descriptions:XMuM*zM*M*林秋林林林祜*木*科*林林料打*#*料料*科科林科科祜*再料*.主要包含:公司信息:公司名称、公司网站。创建信息:创建者名称,创建日期,最初版本号,文档内容描述。修改信息:修改者名称,修改日期,修改后版本号,修改内容描述。可参考模块template.”说明:与硬件相关的文件可以在此增加说明,如芯片型号等。2、头文件引用区includestring.hinclude主要包含:系统头文件引用:文件名
27、包含在尖括号中。自定义头文件引用:文件名包含着双引号中。可参考模块template.”3、全局变量定义区*擀*东林林*林*太*零*零*木*木*楙*杆*林林林*全局变量定义区*volatileuchargTempIateParaSign二0;模板梦家析工主要包含:全局变量定义区说明注释行:全局变量定义:要赋初值。全局变量注释:可参考模块(template.cK4、驱动函数区深圳市德卡科技有限公司生效日期软件设计规范文件编号文件版本发行类别发行部门新增口修订研发中心主要包含:驱动函数区说明注释行:函数说明:包含函数说明,参数说明,返回值说明。函数体:可参考模块(template.5、应用函数区*
28、* 杯 *应用函数区*桥*林*/* 桥 *Mc*4c* 科*sMC *函数功能:模板无参数无返回*参轰:无*返 回*和*注*4(*3|0:*树*科*1|(*/ void TMPeNoparaNoreturn 二、h文件格式说明1文件创建及修改说明区深圳市德卡科技有限公司生效日期软件设计规范文件编号文件版本发行类别发行部门Al新增口修订研发中心公司信息:公司名称、公司网站。创建信息:创建者名称,创建日期,最初版本号,文档内容描述。修改信息:修改者名称,修改日期,修改后版本号,修改内容描述。可参考模块(template.h2、防重调用定义Sifndef_TEMPLATE_H_define_TEMP
29、LATE_H_Sendif命名规则:下划线+文件名大写+下划线+文件类型H+下划线可参考模块(template,h3、头文件引用Sincludestring,h#include主要包含:系统头文件引用:文件名包含在尖括号中。自定义头文件引用:文件名包含着双引号中。可参考模块template4、控制接口定义区*林*杯*林林林林*擀桥擀杯*林*桥*林*控制线定义区*林*杵林;M*科*:*科*科科*朴*树祜*科*/SdefineTMPGPKLPoRTGPIOFGPlo端口主要包含:控制线定义区说明注释行:接口定义:全部采用大写字母,单词间以下划线分割注释说明:深圳市德卡科技有限公司文件编号文件版本A
30、l生效日期软件设计规范发行类别新增口修订发行部门研发中心可参考模块(template,5、常量定义区,*,*,*常量定义区*林*/#defineTMPIAXjBuFF256缓冲区最大长度主要包含:常量定义区说明注释行:常量定义:全部采用大写字母,单词间以下划线分割注释说明:可参考模块template6、宏调用定义区/林林杵杯神擀杯杯杯杯林杯材林*MM40K*M*MC)ME料杯林林松祜样杯杯杯杯林林40K林林*林*)MnK*)Muc*4E*M:*林宏调用定义区*科*姓*林虹林*科*料*,defineTMP_SUM(a,b)(a+b)求和运算主要包含:宏调用定义区说明注释行:宏调用处理:注释说明:
31、可参考模块template7、类型定义区*3Mc*)cjc*4c*4nc*4oC2Mc*4o)*g3c4c)c*)Mc*4c*4c* 类型定义区MdMcg样样MCgjlaMCMClCM:3|UInMoMUICMnlMd*MnM*Mc*4d树4H4cH*Mc43mH杆H*4CHMCMC杆*/typedefstructuintUiSendLen发举数据长度uintUiReceiveLen,接收数据长度charUcSendBuffTMP_MAX_BUFF戈氏教投ucharUcReceiveBuffTMP_MAX_BIFF在收获二tmpcommunicatio主要包含:类型定义区说明注释行:类型定义:
32、注释说明:结构体成员要单独说明。可参考模块template8、外部引用变量区/*料*杆科*料科样科科*本*杆耗材注料样样样*/率*.*料*#杆H杵杵注科* 外部引用变量区* *externvolatileucharg-TempIateParaSign模根与坡标二主要包含:深圳市德卡科技有限公司文件编号文件版本生效日期软件设计规范发行类别Al新增修订发行部门研发中心外部应用变量区说明注释行:引用变量声明:以extern关键字开始注释说明:可参考模块(template,9、外部引用函数区,卒卒不等不等书亭亭亭亭亭季亭习外部引用函数区*,*K*1(c*林* *函数功能:模板初始化* *参数:无* *
33、展回:无* *杯*桥*桥*林*桥*林*/externvoidTMP-Init(void);主要包含:外部应用函数区说明注释行:函数注释说明:包含函数功能说明,参数说明,返回值说明引用函数声明:以extem关键字开始可参考模块template10、操作流程说明区W*操作流程说明区*/*!Mc*jc*)Mc*1t*Mc*1、模块初始化,必须完成初始化后才能操作模块其他函数,1. U模块硬件接口初始化,进入步骤1.21.2. 模块参数初始化,进入步骤22、接收数据.数据由主机下发,模块接收成功后进行解析处理2.1、接收主机下发数据,故据不符合协议要求,进入步骤2.1;数据符合协议要求,进入步骤2.22.2、 孙议解析,根据不同命令字执行相应掾作,进A步骤2.32.3、 将执行结果打包处理.上传生机.迸入步姿2.1*莪*;*莪*1*#*:Mt林林林*桥林*和林*J主要包含:操作流程说明区说明注释行:模块执行流程说明:说明要详细,执行步骤要明确。可参考模块templateIh文件结束说明*廿*,*勒*姓*杵*,*林*科*EndOfFile,*:*4uc*40k*暮*姓*容*