c语言对内存地址的直接操作(读ARM有感)

在ARM中看到了 #define rWTCON (*(volatile unsigned *)0x03000000)然后在函数调用中对这地址直接赋值,rWTCON = (PCLK / (100000-1)<<8 | (3<<3));

刚看到这吓我一跳,以前只听说过没有看过,这里还真这样干了,这就是c语言中的直接对内存赋值,以上的语句还真有特色,这样用了宏还在下面移位操作,运用的这么规范化

,比如我们要将某数中间的第7,6,5位分别置011(假设这数先被初始化为0)  这个一般不是x |=0x01100000;而是这样x |= (3<<5);好处在于,十进制比十六进制更方便看,方便检查。


         关键字 volatile:(易变的) 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。就好似每次操作都刷新,类似原子操作的功能

后面的地址是查ARM手册得到的,虽然注释为,....寄存器,但这与我们理解的CPU中的寄存器(不能取地址)不一样,这里就是内存地址(外设寄存器,寻址方式与内存寻址方式一样(速度当然也一样))

     这里上一段代码

#include <stdio.h>
int main()
{
	void (* signal (int sign, 
		void(*handler)(int))) (int);//也可以写成这样
	  void (* signal (int  , 
	        	void(* )(int))) (int);
	

* (volatile unsigned *)0x0012ff7c = 0x12345;

	printf("%x\n",* (volatile unsigned *)0x0012ff7c);

	return 0;
}
vc编译通过,值得注意得是上面指针的声明,这玩意恐怕你都没有见过吧,这就是高级指针声明,指针乃C语言精华,灵活多变;做完这几天的笔记继续学习ARM去....

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值