韦东山Linux嵌入式课程社区
直播中

宋文剑

7年用户 219经验值
私信 关注

JZ2440裸机程序全局变量不能用

源文件如附件,程序的目的为使用全局变量来获取按键的值,然后做软件防抖,通过全局变量来改变LED灯的状态。
现在的问题是,如果只是使用局部变量的话,可以达到效果。但是使用全局变量,则灯的状态完全不能改变。

请高手帮忙看一下,是什么原因?谢谢

回帖(1)

李丽波

2019-4-24 11:38:06
这个问题的解决需要看反汇编:
Disassembly of section .data:

00008324 <__data_start>:
    8324:       00000001        andeq   r0, r0, r1


如上图,8324的地址对应的就是全局变量dgtInBuf的地址,这显示已经超出了片内4K内存的地址。
即这个全局变量无法正确读写。

你需要添加一个key.lds文件,内容如下:

SECTIONS {
        . = 0x00;
          .text          :   { *(.text) }
        .rodata ALIGN(4) : {*(.rodata)}
          .data ALIGN(4) : { *(.data) }
          .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
}

然后Makefile改为:
key.bin : crt0.S  key.c
        arm-linux-gcc -g -c -o crt0.o crt0.S
        arm-linux-gcc -g -c -o key.o key.c
        arm-linux-ld -T key.lds  crt0.o key.o -o key_elf
        arm-linux-objcopy -O binary -S key_elf key.bin
        arm-linux-objdump -D -m arm  key_elf > key.dis
clean:
        rm -f key.dis key.bin key_elf *.o
举报

更多回帖

发帖
×
20
完善资料,
赚取积分