ok6410 为何用指针写入寄存器无法点亮LED
ok6410 为何用指针写入寄存器无法点亮LED编译器使用 arm-none-eabi-g++
开发板是 ok6410-B 看以下三个代码段,分别是用宏书写地址 ,用指针指向寄存器地址用引用指向寄存器地址
书上写的代码使用宏 对led的 gpio 寄存器读写可以点亮led
#define GPBCON (*(volatile unsigned long * ) 0x7f008820)
#define GPBDAT (*(volatile unsigned long * ) 0x7f008824)
int main(){
GPBCON=0x1111;
GPBDAT=0x08;
return 0;
}
#endi
我改动了一下使用指针的方式访问寄存器
//指针方式写入 无法点亮led
typedef volatile unsigned long *reg_pt;
reg_pt GPBCON=(volatile unsigned long * )0x7f008820;
reg_pt GPBDAT=(volatile unsigned long * )0x7f008824;
int main(){
*GPBCON=0x1111;
*GPBDAT=0x08;
return 0;
}
#endif
//引用方式写入寄存器 可以点亮led
typedef volatile unsigned long ®_pt;
reg_pt GPBCON=*(volatile unsigned long * )0x7f008820;
reg_pt GPBDAT=*(volatile unsigned long * )0x7f008824;
int main(){
GPBCON=0x1111;
GPBDAT=0x08;
return 0;
}
百思不得其解,为何指针指向寄存器无法正常工作呢。
这是crt0.S
.text
.global _start
.global halt_loop
_start:
ldr sp,=1024*8
bl main
halt_loop:
b halt_loop
用引用写入寄存器的代码,在编译选项 -O0时不能点亮led,在 -O3市可以点亮led。
事到如今我觉得是编译器问题了。
页:
[1]