当前位置: 技术问答>linux和unix
指標問題
来源: 互联网 发布时间:2016-05-05
本文导语: #define IO_BASE (0xa0000000) #define uint32_t unsigned int #define REG32(addr) (*((volatile uint32_t*)(((uint32_t)(addr))|IO_BASE))) 上述這段不太理解用途是幹嘛用的,為什麼要這麼做 | 总体来说就...
#define IO_BASE (0xa0000000)
#define uint32_t unsigned int
#define REG32(addr) (*((volatile uint32_t*)(((uint32_t)(addr))|IO_BASE)))
上述這段不太理解用途是幹嘛用的,為什麼要這麼做
#define uint32_t unsigned int
#define REG32(addr) (*((volatile uint32_t*)(((uint32_t)(addr))|IO_BASE)))
上述這段不太理解用途是幹嘛用的,為什麼要這麼做
|
总体来说就是读寄存器的值
1) ((uint32_t)(addr)) 将addr强制转为 unsigned int
2) (((uint32_t)(addr))|IO_BASE), 很明显,这里的addr是个offset,基地址是IO_BASE
3) 可以这么理解
1) ((uint32_t)(addr)) 将addr强制转为 unsigned int
2) (((uint32_t)(addr))|IO_BASE), 很明显,这里的addr是个offset,基地址是IO_BASE
3) 可以这么理解
reg_addr = (((uint32_t)(addr))|IO_BASE);
volatile uint32_t *p;
p = (volatile uint32_t *) reg_addr; // 将reg_addr这个整型强制转化为一个指针,volatile是为了防止编译器优化,每次都重读该变量的值,而不是保留在寄存器的备份
reg_value = *p; // 读出寄存器的值
|
楼主的这段程序应该是MIPS架构下的地址定义,意思是将物理地址转换为未映射,未做MMU的线性地址。
0xa0000000~0xbFFFFFFF:Unmapped, 512 MB Kernel virtual address space Uncached
0xa0000000~0xbFFFFFFF:Unmapped, 512 MB Kernel virtual address space Uncached
|
读设备硬件寄存器的功能,其中volatile告诉编译器别将其通过CPU寄存器进行优化,而直接以操作到内存。
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。