嵌入式爱好者

查看: 3412|回复: 1

[裸机程序] ok6410 为何用指针写入寄存器无法点亮LED

[复制链接]

2

主题

3

帖子

8

积分

扫一扫,手机访问本帖
发表于 2016-2-28 15:07:46 | 显示全部楼层 |阅读模式
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 &  reg_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

arm.zip

63.55 KB, 下载次数: 1, 下载积分: 贡献 1

回复

使用道具 举报

2

主题

3

帖子

8

积分

 楼主| 发表于 2016-2-28 16:02:50 | 显示全部楼层
用引用写入寄存器的代码,在编译选项 -O0时不能点亮led,在 -O3市可以点亮led。
事到如今我觉得是编译器问题了。
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-5-3 18:01

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表