zoukankan      html  css  js  c++  java
  • 【ARM】ARM程序规范

    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的优点了。
     

    原文出处
     
     
  • 相关阅读:
    Central Contract无法传到ECC的排查工具
    直接采购在Core SRM与SRM PPS间的区别
    整理一下思路
    PR无法修改的几个原因
    MARCTRAME与MARCHTRAME
    Revision Level在PS中的决定
    Storage Location在物料分配时的选择逻辑
    如何正确删除WBS下的Planned Independent Requirement
    Open XML SDK 2.0
    Silverlight使用问题汇总一
  • 原文地址:https://www.cnblogs.com/lcw/p/3159421.html
Copyright © 2011-2022 走看看