×
单片机 > 单片机程序设计 > 详情

【ARM】ARM程序规范

发布时间:2020-12-28 发布时间:
|

1.函数名单词之间用_隔开,每一个字母大写

 

   Uart_Printf()

   //这个由三星的TEST风格延续下来,因此没有参数时,必须加void,否则ADS会编译报警

   void Test_Keyscan(void);

 

2.寄存器名前要带小写的r。表示寄存器,大写名称要与DataSheet标的名一致..其宽度要根据硬件有效位来定义,其中必须带volatile关键字

 

   有效位大于16位

   #define rGPMCON          (*(volatile unsigned *)(0x7F008820))

   有效位小于等于16位,大于8位

   #define rWTCON         (*(volatile unsigned short*)(0x7E004000))

   有效位小于等于8位

   #define rNFDATA8    (*(volatile unsigned char *)(NANDF_BASE+0x10))

 

3.寄存器对位赋值的写法。

   格式:  寄存器名 =               //寄存器名解释

                  (值 << 位移)   //每位的解释: 对应值的解释

                | (值 << 位移)  //每位的解释: 对应值的解释

 

   注意象 (0<<12)等于没写,但是这样的写法起到占位的作用,表示12位为0.

例:

   rCIWDOFST = // Set window offset register

   (0<<31) // window offset - 1: Enable, 0: No Offset

   |(0<<16) // Window horizontal offset1

   |(0<<0)); // Window Vertical offset1

 

4.寄存器赋连续超过两位时要考虑清零问题.

 

   rGPKCON0 |= (10 << 30);

   这里的本意是把30,31两位置成10。但是假设原来的30位为1.这个表达式的结果变成设11了。

   因些标准写法是 ,先清零,再置。

   rGPKCON0  = (rGPKCON0 & ~(3 <<30)) |  (10 << 30);  

 

   如果需要清零位太多,不如一开始赋0值再来加比较简洁,保险。  

   unsigned int val = 0;

   rGPKCON0 |= (10<<30) | (10 <<2) ;

 

5.一组相关值是定义成enum好还是宏定义好?

   从程序规范角度是定义成宏定义好。

   一般硬件定位一组值不一定连续。如下定义。

   #define  CONST_VAL1  (0x00)

   #define  CONST_VAL2  (0x01)

   #define  CONST_VAL3  (0x02)

   #define  CONST_VAL3  (0x04)

   如果用enum容易笔误成连续值,而且因为不直观,在代码检查时不太容易查出来。

   当然可以手动赋值了,但就失去了enum的优点了。


关键字:ARM  程序规范 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义