【发布时间】:2017-05-28 14:40:44
【问题描述】:
int main(){
char * ptr = (char *) 0x1000;
*(char *)ptr = 0; //Illegal memory access
printf("ptr %p\n", ptr); //prints the address (hex); ptr is pointing memory location 0x1000.
printf("ptr %d\n", *ptr); //illegal memory access
return 0;}
上面的代码 sn-p 在我的 linux 机器上运行 但;当在我的 32 位目标板上 ptr 是指向类型 uint32 映射寄存器地址的易失性指针时,可以如下所示写入该寄存器:
*(volatile uint32*)ptr = 0x00000001;
【问题讨论】:
-
您的目标是什么 CPU/平台/系统?该 CPU/平台/系统上的地址
0x1000是什么意思?如果它是一个 32 位寄存器,那么你不能只对它进行部分写入吗? -
对 volatile 的更改是相关更改还是对 uint32* 的更改?
-
这两个代码 sn-p 互不相关。我的查询与将某些值分配给某个地址的方式有关。当我执行 '(volatile uint32)ptr = 0x00000001;'这对我来说很好,这里 ptr 指向 IO 映射地址。而当我在我的 linux 机器上运行第一个小代码 sn-p 时,它给了我分段错误。
-
@Someprogrammerdude 谢谢我理解你的意思。