unsigned int more_fun ( unsigned int );
unsigned int fun ( void )
{
return(more_fun(0x12345678));
}
$ arm-none-eabi-gcc -O2 -c so.c -o so.o
$ arm-none-eabi-objdump -d so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <fun>:
0: e92d4010 push {r4, lr}
4: e59f0008 ldr r0, [pc, #8] ; 14 <fun+0x14>
8: ebfffffe bl 0 <more_fun>
c: e8bd4010 pop {r4, lr}
10: e12fff1e bx lr
14: 12345678 .word 0x12345678
这默认为 arm,看起来像 armv4,因此它应该适用于从 armv4 到 armv7(几十年)的非 cortex-ms。
获取所有拇指变体,这将适用于您的 cortex-m4
$ arm-none-eabi-gcc -mthumb -O2 -c so.c -o so.o
$ arm-none-eabi-objdump -d so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <fun>:
0: b510 push {r4, lr}
2: 4803 ldr r0, [pc, #12] ; (10 <fun+0x10>)
4: f7ff fffe bl 0 <more_fun>
8: bc10 pop {r4}
a: bc02 pop {r1}
c: 4708 bx r1
e: 46c0 nop ; (mov r8, r8)
10: 12345678 .word 0x12345678
添加 -mthumb,但您使用的是 armv4t,它仍然有效
a: bc02 pop {r1}
c: 4708 bx r1
现在您可以升级到 cortex-m0,它将适用于所有 cortex-ms
$ arm-none-eabi-gcc -mcpu=cortex-m0 -O2 -c so.c -o so.o
$ arm-none-eabi-objdump -d so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <fun>:
0: b510 push {r4, lr}
2: 4802 ldr r0, [pc, #8] ; (c <fun+0xc>)
4: f7ff fffe bl 0 <more_fun>
8: bd10 pop {r4, pc}
a: 46c0 nop ; (mov r8, r8)
c: 12345678 .word 0x12345678
不需要 mthumb,但我们看到它不是 arv4t 级别,它是较新的
8: bd10 pop {r4, pc}
请注意,我们不需要 -mthumb,但始终检查以防万一
然后,如果您愿意
$ arm-none-eabi-gcc -mcpu=cortex-m4 -O2 -c so.c -o so.o
$ arm-none-eabi-objdump -d so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <fun>:
0: 4801 ldr r0, [pc, #4] ; (8 <fun+0x8>)
2: f7ff bffe b.w 0 <more_fun>
6: bf00 nop
8: 12345678 .word 0x12345678
好吧,这很令人不安,但我想由于 arm7-m 具有 armv6-m 的额外 thumb2 扩展,他们没有选择这个,他们也可以使用 cortex-m0 或 -mthumb 进行尾部优化。
我希望这个
unsigned int more_fun ( unsigned int );
unsigned int fun ( void )
{
return(more_fun(0x00001234)+1);
}
Disassembly of section .text:
00000000 <fun>:
0: b508 push {r3, lr}
2: f241 2034 movw r0, #4660 ; 0x1234
6: f7ff fffe bl 0 <more_fun>
a: 3001 adds r0, #1
在两条指令中使用 16 位立即数,但这条指令执行 ldr,相同的字节数,速度较慢,但无论两者都有效,我让它生成一个 movw ...
然后你将这些对象与你的引导程序链接在一起,然后弄清楚如何在你的单片机的闪存上得到它。
如果您只想知道如何使编译器从 C 生成拇指指令,那么这很容易。如果你有来自其他 mcu 的 C 代码,那么指令集是微不足道的,你可能需要做大量的工作,因为相当多的代码与指令集无关,而是可能与芯片完全不兼容的芯片任何其他尚未基于 cortex-m 的 mcu(即使基于 cortex-m,如果它不是同一供应商同一家族,您仍在重新编写)