data=*(vu16*)addr;的理解?

首先addr是一个32位的整形数据(比如是0x80040000),代表的是一个地址(地址一般都是32位的),(VU16*)就是把这个整数强制转换成一个指针(这个指针还是32位的,只不过它指向的数据是16位的),这个指针指向的地址里面存了一个类型为vu16的变量x,*(vu16*)addr就是把这个x赋值给data。

再来看另一个例子(怎么样通过寄存器的地址来操作寄存器,就是给寄存器赋值,下面这句话就可以操作寄存器):

很多时候我们会看到下面的宏定义

#define   MEM_ADDR(addr)            *((volatile unsigned long  *)(addr)) 


这里的addr是一个寄存器的地址(其实地址就是一个32位的数值,比如0x80040000),要将它强制转化成一个指针(并且声明这个指针指向的内容是一个32位的long型变量)
用(unsigned long  *)(addr) 即可,这样就成了一个真正的有血有肉的地址了。
前面再加一个*号,就可以访问这个地址得到其中的变量值了。


在C语言中,unsigned char *p; 定义p为一个指向unsigned char的地址指针;而 *p=1;就是向这个指针指向的地址所存储的变量赋值为1了。
至于中间加一个volatile关键字,则指示编译器不要自作主张对此进行优化,必须每次老老实实地去直接访问这个地址!!!

猜你喜欢

转载自www.cnblogs.com/jblzky/p/9342110.html