c语言对内存地址的直接操作(读ARM有感)
2012-09-10 16:07
316 查看
在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中的寄存器(不能取地址)不一样,这里就是内存地址(外设寄存器,寻址方式与内存寻址方式一样(速度当然也一样))
这里上一段代码
[cpp]
view plaincopy
#include <stdio.h>
int main()
{
void (* signal (int sign,
void(*handler)(int))) (int);//也可以写成这样
[cpp]
view plaincopy
<span style="WHITE-SPACE: pre"> </span> void (* signal (int ,
<span style="WHITE-SPACE: pre"> </span> <span style="WHITE-SPACE: pre"> </span>void(* )(int))) (int);
[cpp]
view plaincopy
* (volatile unsigned *)0x0012ff7c = 0x12345;
[cpp]
view plaincopy
printf("%x\n",* (volatile unsigned *)0x0012ff7c);
return 0;
}
vc编译通过,值得注意得是上面指针的声明,这玩意恐怕你都没有见过吧,这就是高级指针声明,指针乃C语言精华,灵活多变;做完这几天的笔记继续学习ARM去....
刚看到这吓我一跳,以前只听说过没有看过,这里还真这样干了,这就是c语言中的直接对内存赋值,以上的语句还真有特色,这样用了宏还在下面移位操作,运用的这么规范化
,比如我们要将某数中间的第7,6,5位分别置011(假设这数先被初始化为0) 这个一般不是x |=0x01100000;而是这样x |= (3<<5);好处在于,十进制比十六进制更方便看,方便检查。
关键字 volatile:(易变的) 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。就好似每次操作都刷新,类似原子操作的功能
后面的地址是查ARM手册得到的,虽然注释为,....寄存器,但这与我们理解的CPU中的寄存器(不能取地址)不一样,这里就是内存地址(外设寄存器,寻址方式与内存寻址方式一样(速度当然也一样))
这里上一段代码
[cpp]
view plaincopy
#include <stdio.h>
int main()
{
void (* signal (int sign,
void(*handler)(int))) (int);//也可以写成这样
[cpp]
view plaincopy
<span style="WHITE-SPACE: pre"> </span> void (* signal (int ,
<span style="WHITE-SPACE: pre"> </span> <span style="WHITE-SPACE: pre"> </span>void(* )(int))) (int);
[cpp]
view plaincopy
* (volatile unsigned *)0x0012ff7c = 0x12345;
[cpp]
view plaincopy
printf("%x\n",* (volatile unsigned *)0x0012ff7c);
return 0;
}
vc编译通过,值得注意得是上面指针的声明,这玩意恐怕你都没有见过吧,这就是高级指针声明,指针乃C语言精华,灵活多变;做完这几天的笔记继续学习ARM去....
相关文章推荐
- c语言对内存地址的直接操作(读ARM有感)
- ARM直接操作管脚
- 在DM355平台上如何在应用层直接控制GPIO----操作arm的寄存器
- linux直接写framebuffer linux 直接 对 Frame Buffer 操作,写画面缓存例子,c语言读写framebuffer
- C语言直接驱动硬件实现PC机的串口操作
- ARM 上直接操作SD卡,无文件系统地。。。
- malloc和new出来的地址都是虚拟地址 你就说内存管理单元怎么可能让你直接操作硬件内存地址!
- JLinkExe 命令直接操作ARM
- C语言中字符串的内存地址操作的相关函数简介
- Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
- 【C语言】【unix c】使用mmap将文件映射到进程的虚拟地址空间,然后对内存的操作直接反应到文件中
- Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
- Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
- 用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作
- mfc 直接操作ie浏览器自动填写表单实例
- arm驱动程序——按键程序6_互斥1—原子操作(韦东山的视频总结及针对linux-2.6.30)
- 【C语言】 字符串操作函数及内存拷贝函数归总
- 用360杀毒后的善后"操作" 使用360杀毒后的有感)
- 安卓剪裁图片(直接操作bitmap)
- 直接给内存地址赋值