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】ARM程序规范的更多相关文章

  1. 【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  2. 使用tftp给ARM下载程序

    使用tftp给ARM下载程序 1.开发板和主机能够ping的通 前提:要把计算机的防火墙关了,不然就会出现下面这种情况 如果电脑连接的无线网,那么设置本地连接的ip设置为固定ip.Ip地址和开发的ip ...

  3. arm裸机程序启动流程

    arm裸机程序启动流程 1373 Linux系统的引导: 一个SOC拿过来,它是有内部BROM和SRAM的,这个BROM中会固化芯片厂商的最初引导代码,我们叫它RBL(ROM boot loader) ...

  4. 服务器编程入门(5)Linux服务器程序规范

    问题聚焦:     除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范.     工欲善其事,必先利其器,这篇主要来探 ...

  5. Linux 高性能服务器编程——Linux服务器程序规范

    问题聚焦:     除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范.     工欲善其事,必先利其器,这篇主要来探 ...

  6. linux高性能服务器编程 (七) --Linux服务器程序规范

    第七章 LInux 服务器程序规范 1)linux服务器程序一般以后台进程形式运行.后台进程又称为守护进程,是没有控制终端的,所以不会受到外界的干扰.守护进程的父进程通常是init进程(PID为1的进 ...

  7. 【转载】eclipse调试arm裸机程序

    一.集成开发环境 软件部分:eclipse , GDB Server , Jlink软件 硬件部分:Jlink硬件 准备工作1:从SD/NOR Flash启动,格式化nand flash 准备工作2: ...

  8. 第008课_第1个ARM落版程序及引申

    form:第008课_第1个ARM裸板程序及引申 第001节_辅线1_硬件知识_LED原理图 当我们学习C语言的时候,我们会写个Hello程序.那当我们下ARM程序,也该有一个简单的程序引领我们入门, ...

  9. IMX6开发板qt creator直接编译ARM架构程序

    除了通过 11.2.2 小节通过命令行的操作来编译在 iTOP-imx6 开发板上运行的程序,还可以直接在 qtcreator 上设置,然后每次编译的程序都可以在开发板上运行.如下图所示,打开 qtc ...

随机推荐

  1. centos7 修改中文字符集 How to avoid having to `export LC_ALL=“zh_CN.UTF-8”` upon each SSH connection

    Each time I SSH to my Fedora Server, the locale setting is not right. $ locale locale: Cannot set LC ...

  2. C语言学习笔记 (002) - C++中引用和指针的区别(转载)

    下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图 ...

  3. sql 2005出现错误:数据库 'Twitter' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。

    --先备份数据库 --截断事务日志 backup   log   Twitter with   no_loggo --收缩数据库 dbcc   shrinkdatabase(Twitter) go O ...

  4. 【Spring】SpringMVC中浅析数据的传递方式

    包括了基本数据类型的传递和 Date数据类型的传递.关于SpringMVC的配置可以参见基于注解实现SpringMVC+MySQL 假设有表单页面如下: <h1>登录</h1> ...

  5. Maven运行Selenium报错org/w3c/dom/ElementTraversal

    项目使用maven 构建,并且使用集成测试(integration-test). 在命令行中运行mvn clean deploy tomcat:undeploy时,报错: java.lang.NoCl ...

  6. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  7. Mac OS下Android Studio的Java not found问题,androidfound

    Android Studio正式版已经发布一段时间了,使用Mac版的Android Studio可能与遇到Java not found:Android Studio was unable to fin ...

  8. 跟我学SharePoint 2013视频培训课程——自定义网站导航(4)

    课程简介 第4天,自定义SharePoint 网站导航 视频 SharePoint 2013 交流群 41032413

  9. nodejs 最受欢迎的orm sequelize

    传送门 # 视频教程 https://nodelover.me/course/sequelize/ # 官方文档 http://docs.sequelizejs.com/manual/tutorial ...

  10. tensorflow中使用Batch Normalization

    在深度学习中为了提高训练速度,经常会使用一些正正则化方法,如L2.dropout,后来Sergey Ioffe 等人提出Batch Normalization方法,可以防止数据分布的变化,影响神经网络 ...