如果arm中的程序计数器(PC)复位,如何恢复引导?

如果arm中的程序计数器(PC)复位,如何恢复引导?,arm,embedded,bootloader,trace32,Arm,Embedded,Bootloader,Trace32,我有一个arm控制器,可以选择使用Lauterbach Trace32重置CPU寄存器。现在,在重置CPU寄存器之后,当我在Trace32中按“Play”时,我的电路板启动并运行了2次。因此,当无法知道从何处获取命令时(因为我假定PC是告诉从何处查找指令的人),这是如何实现的?。我去看了代码,我可以看到CPU寄存器复位后,PC值为0。行为是这样的 我重置所有CPU寄存器 恢复运行 处理器停止,并显示消息“停止向量捕获” 我再次恢复跑步 董事会已启动并运行 infocenter.arm.com包含

我有一个arm控制器,可以选择使用Lauterbach Trace32重置CPU寄存器。现在,在重置CPU寄存器之后,当我在Trace32中按“Play”时,我的电路板启动并运行了2次。因此,当无法知道从何处获取命令时(因为我假定PC是告诉从何处查找指令的人),这是如何实现的?。我去看了代码,我可以看到CPU寄存器复位后,PC值为0。行为是这样的

  • 我重置所有CPU寄存器
  • 恢复运行
  • 处理器停止,并显示消息“停止向量捕获”
  • 我再次恢复跑步

  • 董事会已启动并运行

    infocenter.arm.com包含关键文档,请阅读这些文档

    但你需要知道该读哪一本。比如说,arm有三种主要口味和一些亚口味。一个是从acorn开始的传统arm过渡,首先是ARMv4T,这是一款经典的ARM7TDMI内核,我们今天所知道的arm就是从它开始的。该体系结构包括经典的32位ARM指令以及较小的thumb指令。我们将通过ARMv5T、ARMv6(不认为它需要再携带t),然后是ARMv6M。ARMv7和ARMv7m

    第一个不是ARM7TDMI的微控制器是cortex-m3,它基于ARMv7m,是一个仅拇指的机器,没有全尺寸的arm指令,它有大约150个拇指2扩展,这是两个半字大小的指令,第一个半字按照预期使用thumb解码器进行解码,然后以前未定义的指令现在定义为thumb2扩展,然后解码下一个半字。cortex-m3只是先上街,然后cortex-m0问世,它基于armv6m。ARMv8是一个全新的指令集,包括64位寄存器,通常也将具有ARMv7兼容模式,这是经典32位arm指令集的结尾。是的,有一个用于微控制器的ARMv8m,它主要是带有一些ARMv7m thumb2扩展的ARMv6m指令,但如果我没记错的话,它是编译(逻辑)时可选的。在撰写本文时,街上很少有这样的人

    所以arm不生产芯片,他们生产内核,请查看芯片供应商的文档,首先查找cortex-a或cortex-m,如果不是,则查找arm7或arm9或arm11。然后,您可以转到arms信息中心页面,查找特定核心的技术参考手册,在该文档中,您将找到架构(例如cortex-m3),然后转到参考手册,找到该架构的架构参考手册,其中包含您的答案

    对于传统的内核,没有m、非cortexms的内核,也就是arm7(不是armv7、arm7)、arm9、arm10、arm11、cortex-a和cortex-r

    通常,地址0x00000000包含释放重置后执行的第一条指令,内核上有条带允许获取高地址,但通常假设0x00000000也必须以某种方式使用该条带,允许您访问或他们将其用于引导加载程序。如果芯片供应商首先在其引导加载程序上引导内核,那么所有关于应用程序代码可以从何处开始的赌注都将取消,通常他们会通过使用该内核的库存重置解决方案(许多微控制器ARM7TDMIs和cortex ms,但并非全部取决于芯片设计)来创建重置的假象

    因此,不要对程序计数器的作用感到困惑,在现实中,现代处理器认为存在多个程序计数器,当然在arm中,您有一个用于预取的地址,一个用于取数的地址,一个至少用于执行的地址。对我们来说,重要的是架构文档说,对于这些全尺寸的经典ARM,执行的第一条指令位于地址0x00000000。对于这类ARM体系结构,还有一个异常,它的第一条指令在地址0x00000004处执行,因此您必须避开这些特殊地址(您正在使用的地址,如果不期望或使用其他事件,那么您可以在零处启动代码)您需要通过使用无条件分支或ldr pc之类的方式进行分支

    cortex ms(cortex-m0,cortex-m0+,cortex-m1…)使用经典的中断向量表方法,一个简单的例外,但它仍然是向量表方法

    对于这些,可以在内核上设置一个要覆盖的绑定,但是假设地址0x00000000的正常用例包含您想要初始化堆栈指针的值,许多芯片供应商都会在0x20000000处启动ram,但并非全部,因此您可以将0x20004000放在这里,例如,您在该部分有0x4000字节的sram。cores地址空间中的地址0x00000004包含重置向量,在这里,作为程序员,您将地址放入重置代码中,这是您要执行的第一条指令。作为一个thumb机器,由于我们在用于互通时想到thumb地址,所以设置了lsbit,并且您需要设置lsbit,因此如果您要执行的第一条指令位于地址0x00000100,那么您需要将地址0x00000004设置为0x0000001,处理器逻辑(停止考虑程序计数器)重置检查lsbit后,将读取地址0x00000004,将其剥离并使用0x100获取第一条指令

    地址0x00000008和on最多可使用100或2个条目,具体取决于内核和芯片供应商的实现。其理念是性能,每一个可能有中断的小东西都有可能有自己的向量,这取决于芯片供应商的设计。与过去单一中断不同的是,你必须先读取一堆中断控制器寄存器,然后再进行轮询