使用Thumb
使用Thumb
目录
-
C文件使用编译选择增加
-mthumb
即可,修改makfile -
汇编文件使用
.code
32表示下面的指令是ARM指令,使用.code16
表示下面的代码是Thumb指令使用bx指令表示切换到thumb
状态.同时,thumb 某些指令不支持比如直接赋值pc,需要改写.code 32 .... /* 怎么从ARM State切换到Thumb State? */ adr r0, thumb_func add r0, r0, #1 /* bit0=1时, bx就会切换CPU State到thumb state */ bx r0 .code 16 thumb_func: bl sdram_init //thumb 某些指令不支持,需要改写 // ldr pc,=main 不支持 ldr r0, =main /* 绝对跳转, 跳到SDRAM */ mov pc, r0
-
修改Makefile
$@ 表示目标文件 $^ 表示所有的依赖文件 $< 表示第一个依赖文件 all: led.o uart.o init.o main.o start.o arm-linux-ld -T sdram.lds start.o led.o uart.o init.o main.o -o sdram.elf arm-linux-objcopy -O binary -S sdram.elf sdram.bin arm-linux-objdump -D sdram.elf > sdram.dis clean: rm *.bin *.o *.elf *.dis %.o : %.c arm-linux-gcc -mthumb -c -o $@ $< %.o : %.S arm-linux-gcc -c -o $@ $<
-
编译器的一些自作主张.在韦老师的代码中提到,有如下C代码,编译器使用了
memcpy
来构造了数组arr[]
,也就是赋初值,如何禁止这个(ARM指令集并没有优化)?void sdram_init2(void) { unsigned int arr[] = { 0x22000000, //BWSCON 0x00000700, //BANKCON0 0x00000700, //BANKCON1 0x00000700, //BANKCON2 0x00000700, //BANKCON3 0x00000700, //BANKCON4 0x00000700, //BANKCON5 0x18001, //BANKCON6 0x18001, //BANKCON7 0x8404f5, //REFRESH,HCLK=12MHz:0x008e07a3,HCLK=100MHz:0x008e04f4 0xb1, //BANKSIZE 0x20, //MRSRB6 0x20, //MRSRB7 }; volatile unsigned int * p = (volatile unsigned int *)0x48000000; int i; for (i = 0; i < 13; i++) { *p = arr[i]; p++; } }
gcc中并没有这个选项,可以改变这个数值的属性,定义为静态数组的话就会将该数组的初始值放置到数据段,然后到数据段取值.也就是修改为
const static
.或者自己实现memcpy
注意实际上这个函数是没有用到的,这个是有初始值的数组,并不是位置无关码,直接删除这个函数就好了