assembly Cortex-M3初始化

c8ib6hqw  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(79)

我写了(IMO)几乎最简单的ARM应用程序,它没有工作:)什么可能是错的?错过了什么?
闪存写入和CPU复位后,寄存器中存在垃圾。
如果你知道的话,请告诉我在STM32F1上运行最简单的应用程序需要做些什么。
可能有人could列举什么必须做的应用程序开始之前,即。
1.初始化堆栈(是否有必要?)
1.设置一些东西。
1.设置其他东西。
应用程序:

@Directives
    .thumb                  @.code 16
    .syntax unified

.section .text
    .org 0                  @ Alters location of pointer - in this case set to zero

vectors:                    @ Define basic vectors for specific capabilities
    .word _start + 1        @ Set - start address and increment pointer
    .word _nmi_handler + 1  @ Below all other vectors will be declared:
    .word _hard_fault + 1
    .word _memory_fault + 1
    .word _bus_fault + 1
    .word _usage_fault + 1

_start:
    mov r0, #5
    mov r1, #4
    add r2, r0, r1

_nmi_handler:
_hard_fault:
_memory_fault:
_bus_fault:
_usage_fault:

字符串
也许有人知道任何教程或书籍,关于链接器脚本,cpu初始化等?
处理器是:STM32F103VBT6
编程人:OpenOCD。
先谢了。

sigwle7e

sigwle7e1#

M3 documentation;

The vector table at location 0 is only required to have four values:

Stack top address
Reset routine location
NMI ISR location
Hard Fault ISR location.

字符串
栈顶地址应该在地址0,似乎你错过了它。

wxclj1h5

wxclj1h52#

我有很多基于thumb和cortex-m的例子http://github.com/dwelch67
正如Joachim指出的那样,你丢失了向量表中的第一个条目,即堆栈指针。Cortex-M不具有与ARM相同的向量表,这意味着在ARM模式下利用ARM指令启动的向量表。
为了完成这个问题的答案,对于cortex-m,您可以通过将堆栈指针的起始值放在第一个字的位置来设置堆栈

.cpu cortex-m3
.thumb

.word   0x10008000  /* stack top address */
.word   _start      /* 1 Reset */
.word   hang        /* 2 NMI */
.word   hang        /* 3 HardFault */
.word   hang        /* 4 MemManage */

字符串
你当然可以一次运行设置堆栈指针手动就像你会与一个手臂在手臂模式或大多数其他处理器。
我会让你的代码陷入无限循环,这样,就不会像写的那样陷入未定义的指令,等等。(应该是0xFFs,在cortex-m0上我认为是未定义的,在支持armv7 thumb 2的-m3或-m4上它可能是一个真实的的指令)。
注意,我没有在向量上使用+1。你需要知道你的工具。您需要设置lsbit来指示分支上的thumb地址/thumb模式。虽然我学到了一个教训(将不得不找到这样的问题)
Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function
在gnu汇编程序中,如果你在一个标签前放一个.thumb_func指令,这个标签会被标记为thumb标签,然后gnu工具会使用这个地址|1.

.thumb_func
.globl _start
_start:


您需要不时地构建和反汇编,以确保您的表正在正确构建,分支等正在使用正确的地址。

0:   10008000    andne   r8, r0, r0
   4:   0000005b    andeq   r0, r0, fp, asr r0
   8:   00000050    andeq   r0, r0, r0, asr r0
   c:   00000050    andeq   r0, r0, r0, asr r0
  10:   00000050    andeq   r0, r0, r0, asr r0


看,显然我有一个错误,在我的一个例子...它从来没有做任何事情,但重置(没有中断使用的例子,所以这就是我如何逃脱不知道)。忘记了.thumb_func

hang:   b .


生产的

00000050 <hang>:
  50:   e7fe        b.n 50 <hang>


改为

.thumb_func
hang:   b .


而向量表就变成了

00000000 <hang-0x50>:
   0:   10008000    andne   r8, r0, r0
   4:   0000005b    andeq   r0, r0, fp, asr r0
   8:   00000051    andeq   r0, r0, r1, asr r0
   c:   00000051    andeq   r0, r0, r1, asr r0
  10:   00000051    andeq   r0, r0, r1, asr r0
  14:   00000051    andeq   r0, r0, r1, asr r0


这很有趣,将代码更改为

.cpu cortex-m3
.thumb

.word   0x10008000  /* stack top address */
.word   _start+1      /* 1 Reset */
.word   hang+1        /* 2 NMI */
.word   hang+1        /* 3 HardFault */
.word   hang        /* 4 MemManage */
.word   hang        /* 5 BusFault */


而且它不是真的做加一,而是一个或一。

00000000 <hang-0x50>:
   0:   10008000    andne   r8, r0, r0
   4:   0000005b    andeq   r0, r0, fp, asr r0
   8:   00000051    andeq   r0, r0, r1, asr r0
   c:   00000051    andeq   r0, r0, r1, asr r0
  10:   00000051    andeq   r0, r0, r1, asr r0


这有点令人不安。不过,底线是两件事,使用cortex-m可以在向量表中设置堆栈指针,第二,当开始一个新项目时,反汇编并检查向量表,以确保它是你所期望的。特别是如果它没有做你认为它应该做的事情。

相关问题