我给你解释几点: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这个关键字就变得有必要了,因为有些东西是绝对不能当做寄存器变量来访问的,例如硬件状态寄存器里的值是根据硬件的状态来更新的,所以就一定要访问到挂在总线上的这个相应的地址上来读取这个值。
温馨提示:答案为网友推荐,仅供参考