中华人民共和国航天行业标准FL0112QJ3300—2008航天型号DSP-TMS系列汇编语言编程要求RequirementsforDSP-TMSseriesassemblylanguageprogrammingofaerospaceproduct2008-03-17发布2008-10-01实施国防科学技术工业委员会发布QJ3300—2008I前言本标准的附录A、附录B、附录C均为资料性附录。本标准由中国航天科工集团公司提出。本标准由中国航天标准化研究所归口。本标准起草单位:中国航天科工集团公司第三研究院第三○四研究所。本标准主要起草人:于林宇、李昆、魏伟波、陈义林、宋宇飞。QJ3300—20081航天型号DSP-TMS系列汇编语言编程要求1范围本标准规定了采用TMS系列汇编语言编程的详细要求和约定。本标准适用于采用TMS系列汇编语言编写的航天型号软件的开发与测试。2规范性引用文件下列文件中的条款通过本标准的引用而成为本标准的条款。凡是注日期的引用文件,其随后所有的修改单(不包含勘误的内容)或修订版均不适用于本标准,然而,鼓励根据本标准达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本标准。GJB/Z102软件可靠性和安全性设计准则3术语和定义下列术语和定义适用于本标准。3.1程序模块proceduremodule用于完成特定功能的一组程序语句集合。3.2文件描述体filedescriptionbody用于表述文件基本信息的注释行。3.3程序模块描述体functiondescriptionbody用于表述程序模块基本信息的注释行。4一般要求4.1程序编写应符合TMS系列汇编语言文本、GJB/Z102的要求。4.2所有标识符应具有明显的含义,必要时可通过注释加以说明。5详细要求5.1程序文件TMS系列汇编程序可由单个或多个文件组成,程序文件个数不宜超过14个。一个程序文件一般包括文件描述体、引用声明、变常量声明、程序模块等部分,在程序设计过程中,还应根据相关语言的具体要求进行调整。以TMS320C30汇编程序为例,其文件结构一般由以下部分构成:文件描述体、外部引用声明、数据段、常量段、矢量段、主程序模块(一个软件只能有一个主程序模块)、子程序模块,其样例参见附录A。5.2程序模块QJ3300—20082程序模块在实现过程中应遵循以下原则:a)程序模块应采用结构化编程方式;b)每个程序模块应做到单入口、单出口;c)程序模块名应具有唯一性;d)多个程序模块不应共用一个返回指令;e)不宜从循环体中引出多个出口;f)程序模块长度宜控制在400行内(不包括注释行)。5.3程序语句5.3.1语句格式程序语句格式应遵循以下原则:a)若存在段定义,段名称前至少应有一个空格或制表符;b)语句的缩进和语句内部的间隔宜使用制表符实现;c)每一行只定义一个变量、常量或全局声明;d)若存在代码段、矢量段,变量定义不应在代码段、矢量段中;e)若无特殊要求,程序语句应放置在代码段中;f)指令应保持一致的风格,如全部大写或小写;g)单指令每一行只允许写一条语句,并行指令宜编写在同一行;h)程序模块名和程序模块中的标号均不应缩进;i)程序模块名和程序模块中的标号均应独占一行。5.3.2语句顺序5.3.2.1有明确顺序的程序语句有明确顺序的程序语句应遵循以下原则:a)组织代码,使它们间的依赖关系更加明确;b)与判定相联系的动作应紧跟着判定;c)对不明确的依赖关系进行注释。5.3.2.2与顺序无关的程序语句与顺序无关的程序语句应遵循以下原则:a)确保代码由上至下执行,避免随意跳转;b)将相关语句组织在一起。5.4命名要求与格式5.4.1变量变量的命名应遵循以下原则:a)变量名应具有实际意义,每个变量均应有相关注释;b)若存在两个(含)以上的数据类型,变量名应包含数据类型的说明;c)变量名称长度不宜超过20个字符;d)不应单独使用系统保留字作为变量名;e)变量名称不宜全部大写,避免同常量的命名方式混淆;f)状态变量应明确表示程序所处的状态。QJ3300—20083g)变量命名的方法参见附录B。5.4.2常量常量的命名应遵循以下原则:a)常量命名应与5.4.1a)~d)的变量命名原则一致;b)常量的名称应全部大写。5.4.3标号标号的命名一般遵循以下原则:a)标号名宜使用大小写混合格式,若标号名由多个独立的单词(或单词缩写)组合而成,每个单词(或单词缩写)的第一个字母应大写,其它字母小写;b)程序中所有标号的引用应与其定义保持一致;c)标号的长度不应多于20个字符。5.4.4程序模块程序模块的命名应遵循以下原则:a)程序模块的命名应与5.4.3命名原则一致;b)程序模块名应具有实际意义,要准确地描述该模块的功能。5.4.5其它应遵循的其它原则如下:a)应避免含义相同或相近的名称;b)应避免使用发音相同或相近的名称;c)应避免使用易混淆的变量名称。如字符有“I”和“1”、“1”和“I”、“0”和“o”、“S”和“5”、“G”和“6”等;d)应避免使用常见的容易拼写错的单词;e)应避免使用容易产生误会的名称或缩写。5.5程序注释5.5.1总体要求程序注释总体要求为:a)注释应准确、无二义性;b)程序中的注释行数不应少于源程序总行数的1/5;c)程序修改后应注释修改日期及简要原因;d)注释应为功能性的说明,而不应是指令的逐句说明。5.5.2文件注释文件的开始应有文件描述体进行说明,一般包含以下信息:文件名和版本、软件支持环境、硬件支持环境、编译器名称和版本、功能描述、与其它文件的关系、开发单位、作者、日期。其样例参见附录A。5.5.3程序模块注释程序模块注释要求为:a)程序模块开始前应有程序模块描述体进行说明,达到清晰描述本程序模块基本信息的目的。程序模块描述体一般包括功能描述、作者、日期、寄存器使用情况、输入、输出;QJ3300—20084b)程序模块内有多个功能点时应分别加以注释;c)程序模块起始标号前一行注释中应包含表示模块开始的统一标识,如“module_begin”;d)程序模块结束下一行注释中应包含表示模块结束的统一标识,如“module_end”。5.5.4语句及变量注释语句及变量注释要求为:a)不应在注释中复述代码;b)所有变量、常量定义时应注释其用途;c)一条程序语句及其后注释的总长不应超过80个字符,超过后应分行编写。5.6数据类型的使用要求数据类型的使用应遵循相应技术要求。应注意一些使用时容易导致程序出现问题的数据类型。在TMS320C3X汇编程序中浮点数和整数使用时应注意以下要求:a)程序中不宜使用浮点型立即数,以保证数据的精度;b)程序中不宜使用整型立即数,整型立即数由16位二进制补码表示,作为整型指令的操作数时其最高位为符号位,将会被扩展,如语句“ADDI8000H,R1”表示在R1基础上加FFFF8000H而不是8000H;c)浮点数在堆栈处理时的先后顺序应为:压栈时先PUSH、后PUSHF,出栈时先POPF,后POP;d)不应在数量级相差太大的数之间进行加减运算;e)浮点数的比较不应使用“等于”判断;f)程序中确实需要使用整型操作指令对浮点数进行操作的特殊用法时,应增加注释说明。5.7特殊用法在TMS系列汇编中存在一些固有的特殊用法,使用时存在一定的风险,应谨慎使用。以TMS320C30汇编程序为例,一些特殊用法参见附录C。QJ3300—20085附录A(资料性附录)TMS320C30汇编程序文件结构TMS320C30汇编程序文件结构参见以下模式:*************************************************************版权及版本声明**文件名称:filename.asm**摘要:简要描述本文件的内容****开发单位:XXX院XXX所XXX室**当前版本:Ver1.1**作者:XXX**完成日期:XX年XX月XX日****取代版本:Ver1.0**作者:XXX**完成时间:XX年XX月XX日****运行环境:XXX系统**编译器名称及版本:CodeComposerVer4.0.9*************************************************************;外部引用声明.globalTIM1_nCtrAdrss;定时器1控制寄存器地址.globalCtr_nNum;容错控制计数值……;数据段.datafk_nRadarCtr.word00H;发控程序模块的雷达控制字tst_nKdhState.word0AH;测试程序模块的惯导状态字……;常量定义.sect.constFILT1_NSTARNUM.word01H;滤波次数计数器初值……;中断矢量定义.sect.vectorINT0BRISR0;外部中断0对应的程序模块入口…….textQJ3300—20086*************************************************************模块名称:Main(主程序模块)**摘要:简要描述本模块功能**作者:XXX**完成日期:XX年XX月XX日**输入:对输入数据进行简要说明**输出:对输出数据进行简要说明**寄存器使用情况:对寄存器使用情况进行简要说明***************************************************************************************module_begin********************Main:LDI@TIM1_nCtrAdrss,AR0LDI0ABCH,R0STIR0,*AR0;初始化定时器1LDI@FILT1_NSTARNUM,R0;滤波计数器初值设为1……WnavStarLDI@Ctr_nNum,R0SUBI1,R0BZWnavStar;导航开始阶段容错设计……STIR0,@fk_nRadarCtr;记录雷达控制字STIR1,@tst_nKdhState;记录惯导状态字……BNZWnavStar;不为零则返回导航开始阶段……RETS**************************module_end***********************************************************************************模块名称:SubModule1**摘要:简要描述本程序模块功能**作者:XXX**完成日期:XX年XX月XX日**输入:R0**输出:R1**寄存器使用情况:使用AR0、AR1*QJ3300—20087**************************************************************************************module_begin********************SubModule1:STIR0,*AR0……;某算法实现过程SUBI1,R1;获取输出值RETS**************************module_end**********************……QJ3300—20088附录B(资料性附录)自然语言变量命名规则B.1概述一般使用自然语言对变量的名称进行命名,包含所属模块前缀、变量类型缩写、有意义的字符串。B.2变量名称的形式变量名称的形式如xxx_yAbc,具体说明如下:xxx:变量所属程序模块的全称或简称,由几个小写英文字母组成。y:变量类型,缩写为一个字母,程序中只存在单一类型时可以省略。Abc:一个单独意义的字符串,以大写英文字母开头,后接小写英文字母。其中单独意义字符串Abc部分根据需要可增加至两个或三个单独意义字符串,如AbcDef、AbcDefGhi,但要注意变量命名长度不宜超过20个。B.3变量类型缩写的约定TMS320C3X汇编程序变量类型的一些约定如下:b:bytef:f