(C)理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))

Posted 逆水东流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(C)理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))相关的知识,希望对你有一定的参考价值。

1. 理解

嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。
既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。

所以,知道要访问的内存地址后,比如0x57000040(这儿的addr就是内存地址0x57000040)
第一步是要把它强制转换为指针类型

unsigned int*)(0x57000040);

所以0x57000040强制转换为指向unsigned int类型。

volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。
简单的说使用volatile的目的就是: 让对volatile 变量的存取不能缓存到寄存器,每次使用时需要重新存取。

第二步,对指针变量解引用,就能操作指针所指向的地址的内容了

   *(volatile unsigned int*)(0x57000040)

小心地把#define宏中的参数用括号括起来,这是一个很好的习惯。
所以,write(b,addr) 的作用就是把值b写入addr所指的内存地址单元。

以上是关于(C)理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))的主要内容,如果未能解决你的问题,请参考以下文章

调用write函数失败,Bad file descriptor

Linux 0.11中write实现

js函数柯里化的理解

js函数柯里化的理解

#define 定义与 typedef

C语言问题,宏定义中的参数为啥要定义,不是主函数中的参数直接替换吗?