
msp430单片机编程要点.doc
6页单片机 C 编程规范 【规则 1】各个模块分别放到私有的文件夹,每个模块有自己的.C 和.H 文件【规则 2】工程中只有一个 main.c 文件,其中包含主函数【规则 3】声明的变量都放在.H 文件之中【规则 4】头文件用 #ifndef _FILENAME_H_ #define _FILENAME_H_//Extern int doSomething();#endif声明,防止头文件被重复利用C 文件包含各自的头文件 【规则 5】工程中包含一个 project_cfg.h 文件,用来存放系统的配置 #ifndef _PROJECT_CFG_H_ #define _PROJECT_CFG_H_ typedef unsigned char U8; typedef char S8; typedef unsigned int U16; typedef int S16;typedef unsigned long U32; typedef long S32; #endif【规则 6】用 typedef 声明类型 Typedef unsigned char U8 Typedef char S8 Typedef unsigned int U32 Typedef intS32 Typedef unsigned short U16 Typedef shortS16 Static U8s_ucName;//静态的 U8 g_ucName;//全局的【规则 7】变量的定义与使用,变量的定义应该有可读性。
U8 ucRet; U32 uiRet; Bit DoSomething(S32 siVal) 【规则 8】用 Tab 进行排版,所有不相关的语句都用空一行规则 9】函数的使用函数名的定义要有可读性,似动宾结构最好用 get、setU32 GetUart();//动宾的首字母都要大写 U32 SetUart(); 【规则 10】源文件中开头,和函数之前都要写注释重要的代码要用 // 来注释 /* *函数功能:配置串口参数 *入口参数:ncom 串口号、波特率、校验 *返回参数:0 成功 -1 失败 *描述: */ 【规则 11】分支语句,都要以 default 结尾特殊的需说明 Switch(a) { case 1:break; case 2:break; case 3:break; case 4:break; default:break; } 【规则 12】区分 strcpy 与 memcpy【规则 13】开辟字符串空间的时候要+1 Char scBuf[Len+1]; 【规则 14】所有的变量、指针使用前都要初始化,检查合法性规则 15】程序中加入挑错检错的预言 accert、try-----catch【规则 16】做一套调试分析函数,有利于系统调试。
规则 17】注意数组越界、宏定义越界【规则 18】慎重使用库函数 malloc、new Char *pc=(char *)malloc(100);Free(pc);//释放空间 Pc=NULL;//防止产生野指针 【规则 19】结构体、枚举、共同体声明格式.Typedef struct _COM_ST_{ U32 uiA; U32 uiB; } COM_ST; Typdef enum _COM_ST_ { U32 uiA;U32 uiB; } COM_ST; 【规则 20】多使用 enum 提高程序的健壮性、可读性多使用 union 节省空间【规则 21】会使用 goto 语句【规则 22】避免多个功能在一个函数完成,一个函数只完成一个功能每个函 数必须考虑了留有足够的接口供其他人员使用规则 23】时间准确性要求较高的代码要嵌入汇编规则 24】一行只能放一条语句,不能放置多条规则 25】对于赋值语句,等号和数值保持垂直对齐 DispSegTblIx = 0; DispDigMsk = 0x80; DispScale = 1.25; 【规则 26】所有的逻辑括号要对齐,只能是 If(1) { } Else { } 不能是 If(1){}else{} 【规则 27】块代码注释使用#if 0 #endif【规则 28】局部变量与全局变量不能同名【规则 29】所有的函数返回值应该有意义,使用的时候应该仔细检查 并且判断。
【规则 30】编程注意循环的效率【规则 31】return 语句不可以返回栈内存的指针char * Func(void) { char str[] = “hello world”; // str 的内存位于栈上 … return str;// 将导致错误} 【规则 32】中断函数应该不要包括可重入函数,应该尽量编写小执行效率高的代 码 【规则 33】浮点数之间最好不要做比较判断 【规则 34】编程过程中,尽量采用 Sfr16Sfr1616 位声明Sfr16 T2=0xCC; sbitsbit特殊功能位声明Sbit ov=PSW^1; 例如:、Static U8s_ucName;//静态的 U8g_ucName;//全局的 Votilate U8 v_ucName//votilate2.函数 规则:模块名+动宾格式和模块名+主谓式,前一字母都大写函数名与变量名都要易读 例如:SetCom、GetCom ReadFromEEprom、WriteToEEprom RX8025InitIIcStart() IIcStop 返回值返回值函数名函数名 入口入口例子例子 S8 SetComU8 ucComS8 SetCom(U8 ucCom)模块模块名_函数名时钟模块RX8025_ReadTime();存储模块EEPROM_XX();温度模块18B20_XX();计量模块ATT7022_XX();通信模块RX485_XX();3.头文件 规则: 防止头文件被重复利用。
例如:#ifndef _FILENAME_H_ #define _FILENAME_H_ //Extern int doSomething(); #endif 4.注释 规则:每个函数的开头都有注释注销一段代码用#if 0 #endif.行代码注释用//. 例如: /* *函数功能:配置串口参数 *入口参数:ncom 串口号、波特率、校验 *返回参数:0 成功 -1 失败 *描述: */ 5定义名称举例变量.#define MAX(100) //定义的变量都要 大写函数#define Min(a,b){_nop(),_nop(),_nop()}//定义的函数6.去除各个子程序中的等待、死循环、长延时 程序最好仅完成运算、判断、处理、赋值等操作 7.能使用 char 绝不用 int 8.函数的可重用性与可扩展性强,且质量高 9.结构体、共同体结构体共同体枚举Typedef struct _COM_ST_ { S8 scA; S8 scB; } COM_ST;Typdef enum _COM_ST_ { scA=0x01, scB } COM_ST;10.工程代码用 VSS+IAR(SCC)管理 目录:E:\work\ VSS 使用须知:每次打开工程最好每次修改文件最好获取新版本。
11.MSP430 系列 IO 资源定义方式Project_cfg.h0 位#define PORT_MASK_BIT0 0x011 位#define PORT_MASK_BIT1 0x022 位#define PORT_MASK_BIT2 0x043 位#define PORT_MASK_BIT3 0x084 位#define PORT_MASK_BIT4 0x105 位#define PORT_MASK_BIT5 0x206 位#define PORT_MASK_BIT6 0x407 位#define PORT_MASK_BIT7 0x80存在于各自的功能头文件P3 输入的定义(其他端口雷同)#define SPI_P3IN P3INP3 输出的定义#define SPI_P3OUT P3OUTP3 方向的定义#define SPI_P3DIR P3DIRP3 选择的定义#define SPI_P3SEL P3SEL存在于各自的功能头文件P3.0 至高SPI_P3IN |= PORT_MASK_BIT0;P3.0 置低SPI_P3IN 其他的雷同--。
