0实验环境与实验例程
实验环境:TQ2440
实验例程:韦东山 嵌入式linux应用开发完全手册
1 makefile分析
-
objs := head.o init.o interrupt.o main.o
-
-
int.bin: $(objs)
-
arm-linux-ld -Ttext 0x00000000 -o int_elf $^;$^表示所有依赖的文件,指$(objs)
-
arm-linux-objcopy -O binary -S int_elf $@;$@指目标文件
-
arm-linux-objdump -D -m arm int_elf > int.dis
-
-
%.o:%.c
-
arm-linux-gcc -Wall -O2 -c -o $@ $<
-
-
%.o:%.S
-
arm-linux-gcc -Wall -O2 -c -o $@ $<
-
-
clean:
-
rm -f int.bin int_elf int.dis *.o
Makefile执行过程
-
arm-linux-gcc -Wall -O2 -c -o head.o head.S
-
arm-linux-gcc -Wall -O2 -c -o init.o init.c
-
arm-linux-gcc -Wall -O2 -c -o serial.o serial.c
-
arm-linux-gcc -Wall -O2 -c -o main.o main.c
-
arm-linux-ld -Tuart.lds -o uart_elf head.o init.o serial.o main.o
-
arm-linux-objcopy -O binary -S uart_elf uart.bin
-
arm-linux-objdump -D -m arm uart_elf > uart.dis
2原理图
3源码分析
中断向量地址
-
.extern main
-
.text
-
.global _start
-
_start:
-
@******************************************************************************
-
@ 异常向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用
-
@******************************************************************************
-
b Reset
-
-
@ 0x04: 未定义指令中止模式的向量地址
-
HandleUndef:
-
b HandleUndef
-
-
@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式
-
HandleSWI:
-
b HandleSWI
-
-
@ 0x0c: 指令预取终止导致的异常的向量地址
-
HandlePrefetchAbort:
-
b HandlePrefetchAbort
-
-
@ 0x10: 数据访问终止导致的异常的向量地址
-
HandleDataAbort:
-
b HandleDataAbort
-
-
@ 0x14: 保留
-
HandleNotUsed:
-
b HandleNotUsed
-
-
@ 0x18: 中断模式的向量地址
-
b HandleIRQ
-
-
@ 0x1c: 快中断模式的向量地址
-
HandleFIQ:
-
b HandleFIQ
4总结
使用c代码之前就要设置栈指针
-
Reset:
-
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
-
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启