【问题标题】:How do we enable thumb mode in stm32f series when we use embedded c to drive it?Can you explain it in detail as i am a beginnerstm32f系列在使用嵌入式c驱动时如何开启thumb模式?我是初学者,能详细解释一下吗?
【发布时间】:2022-11-04 05:34:23
【问题描述】:

我想在 stm32f401re 板上启用拇指模式。我为它编写的代码在嵌入式 c 中。我们如何在嵌入式 c 语言中启用拇指模式。我们是否使用 -mthumb 命令,我们是否必须在使用该命令之前添加任何库。或者有什么完全不同的方法。

我搜索并发现只有汇编语言的方法。但我希望它在嵌入式 c 中。我什至使用了 -mthumb 命令,但它显示了一个错误。

【问题讨论】:

  • STM32F4 是一个 cortex-m4 cpu,只支持“thumb2”指令集。 CPU 不支持传统的 ARM 32 位 ISA。您选择适当的 CPU 类型-mcpu=cortex-m4 ,它自然会编译为拇指模式。
  • 你用的是什么工具链?牛?指定arch或cpu和-mthumb,是的。但是您还必须以不同的方式构建向量表。并且您的大部分代码不会移植到新芯片上(因为几乎所有代码都与 ISA 无关),因此您将不得不重新编写它
  • 移植是一项重要的工作,从新芯片的示例开始以获得基础知识,然后开始将您的代码分段移植。 ISA是简单的部分,微不足道的部分。

标签: arm stm32f4 thumb


【解决方案1】:
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,如果它不是同一供应商同一家族,您仍在重新编写)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2014-07-02
    • 2021-09-28
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多