6410之写跳转到c函数中运行

来源:互联网 发布:北京java平均工资 编辑:程序博客网 时间:2024/05/17 05:05

汇编程序:

#define CONFIG_PERIPORT_BASE 0x70000000#define CONFIG_PERIPORT_SIZE 0x13#define WTCON  0x7E004000 .global _start_start:/*告诉CPU 外设的地址*/ldr r0, =CONFIG_PERIPORT_BASEorr r0, r0, #CONFIG_PERIPORT_SIZEmcr p15,0,r0,c15,c2,4/*关闭看门狗*/ldr r0, =WTCONmov r1, #1str r1,[r0]mov sp,#(1024*8)   //设置栈,用来保存c函数的返回地址等等信息bl xxxx             //跳转到c函数中执行halt:b halt

c程序:

#define GPMDAT (volatile unsigned long *)0x7F008824#define GPMCON (volatile unsigned long *)0x7F008820void delay(){volatile unsigned long i = 0x1000;while(i){i--;}}int xxxx(){volatile unsigned long *gpmcon = GPMCON;volatile unsigned long *gpmdat = GPMDAT;*gpmcon = 0x1111;int i = 0;while(1){*gpmdat = i;i++;if(i == 16)i = 0;delay();}return 0;}

在编译的时候会出现下面的错误:

arm-linux-gcc  -c -o start.o start.S
arm-linux-gcc  -c -o led.o led.c
arm-linux-ld -Ttext 0 -o led.elf  start.o led.o
led.o:(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
led.o:(.ARM.exidx+0x8): undefined reference to `__aeabi_unwind_cpp_pr1'

make: *** [led.bin] Error 1

解决方法如下:

led.o:led.c
    arm-linux-gcc -nostdlib -c -o led.o led.c

start.o:start.S
    arm-linux-gcc -nostdlib -c -o start.o start.S
在编译的选项中加入nostdlib 选项,不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。


原创粉丝点击