关于C语言中用#define和sfr定义ARM寄存器的问题

C语言为什么能#define定义寄存器啊?比如#defineGPBCON(*(volatileunsignedlong*)0x56000010)这种定义的格式是什么?#d... C语言为什么能#define定义寄存器啊?比如#define GPBCON (*(volatile unsigned long*) 0x56000010)这种定义的格式是什么?#define不是宏定义吗怎么能定义寄存器?另外sfr不是也能定义寄存器吗?与#define有什么区别?另外C语言中用register声明的寄存器变量与上面2者又有什么关系与区别????求高手详细解答 谢谢!! 展开
 我来答
xiaozai04
推荐于2018-03-29 · TA获得超过128个赞
知道答主
回答量:33
采纳率:0%
帮助的人:44万
展开全部
我给你解释几点:1:0X56000010 这个值是GPBCON这个寄存器在ARM地址空间的物理地址,(unsigned long *)0x56000010 是将这个地址强制转换成unsigned long *类型的指针,再在这个指针前加*号是解引用,取这个地址里的值,这完全符合C的语法,其中加的那个volatile关键字是防止C编译器对这个地址的优化,每一次对该地址的的取值必须访问到总线上去,而不能在缓冲或寄存器里取值。 2,sfr只是在嵌入式里边对特殊功能寄存器的英文简称,没有任何其它的意义,甚至你完全可以在你的人生中彻底忘掉这个sfr,但在嵌入式处理器里本来就有两类所型的寄存器,通用寄存器和特殊功能寄存器,这是基于8位单片机的知识回答这样的,在ARM里,R1-R15我们可能叫通用寄存器,指令执行需要用到这些寄存器,而其它分布在总线地址上的几百个甚至上千个寄存器我们可能叫他特殊功能寄存器(sfr),但没有人这么叫,一般都是一些控制器的配置寄存器,地址寄存器,数据寄存器等,不要和通用寄存器混淆,通 用寄存器没地址,直接用R1-R15这样的名字进行访问,而其它所有寄存器都要通过地址来访问,所以就有了上述的#define GPBCON 这个宏定义。
3,C语言中用register声明的变量叫做寄存器变量,即该变量没有放在内存上,而是放在R1-R10中的一个通用寄存器里,CPU对该变量的操作就变成了对CPU内部寄存器的操作,不访问总线,这样就提高了访问速度,实际上C编译器大部分情况下也不一定就把register 显示声明的变量放到寄存器上去,编译器是根据CPU的架构,通过一个最优的算法将选择适合的变量当作寄存器变量,所以加这个register实际上没有作用,所以基于编译器的这个特点,volatile这个关键字就变得有必要了,因为有些东西是绝对不能当做寄存器变量来访问的,例如硬件状态寄存器里的值是根据硬件的状态来更新的,所以就一定要访问到挂在总线上的这个相应的地址上来读取这个值。
经理
2025-08-08 广告
说到edl模块产品的生产厂家,深圳市迈力威环保科技有限公司可以了解一下。深圳市迈力威环保科技有限公司是一家专注于超纯水edl(电除盐)技术研发、制造、服务一体化的企业,成立于2012年,专业从事edl膜块技术研发与生产服务。目前公司共有资深... 点击进入详情页
本回答由经理提供
匿名用户
2012-10-19
展开全部
那种定义的应该是寄存器的内存地址吧 #define 是宏定义
即 GPBCON 等价于(*(volatile unsigned long*) 0x56000010)--->这个是寄存器的地址

sfr定义不是太清楚...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式