1,025
社区成员
发帖
与我相关
我的任务
分享
.global _start
.global IRQ_handle
_start:
ldr sp, =0x40000000 @设置栈,以便调用c函数
mov r0, #0x53 @进入SVC模式,开中断(把I位设为1)
msr CPSR_cxsf, r0
bl main @调用main函数
IRQ_handle:
ldr sp, =0xD0037F80
sub lr, lr, #4 @计算返回地址
stmfd sp!, {r0-r12, lr} @保存现场
bl irq_handler @跳转到中断处理函数
ldmfd sp!, {r0-r12, pc}^ @恢复现场
这个是原来的代码,前面设置堆栈0x40000000,这个地址是DDR2上的地址,按照这样的做法,这个生成的bin文件要拷贝到DDR上。
makefile
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
int.bin: start.o main.o irq.o led.o clock.o uart.o
arm-linux-ld -Ttext 0x30000000 -o int.elf $^
arm-linux-objcopy -O binary int.elf $@
arm-linux-objdump -D int.elf > int.dis
gcc -o mktools mktools.c
./mktools $@ new_int.bin
clean:
rm *.o *.elf *.bin *.dis mktools
load:
dd iflag=dsync oflag=dsync if=new_int.bin of=/dev/sdb seek=1
这个makefile指定了链接地址为0x30000000。
但是我做了如下修改,将链接地址改成了0,将ldr sp, =0x40000000 改为了 ldr sp,=0xD002A000,这个实际上我是看了生成的bin文件,理论上这个地址不会覆盖掉在iram中的bin文件。