Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded cortex a9引导与记忆_Embedded_Cortex A - Fatal编程技术网

Embedded cortex a9引导与记忆

Embedded cortex a9引导与记忆,embedded,cortex-a,Embedded,Cortex A,我是一个新手,刚开始从事微控制器编程。这里感兴趣的芯片是cortex-a9。复位或通电时,我的读数中必须有0x0000000的代码。我的问题虽然听起来太琐碎,但有助于我正确看待一些概念 内存地址0x0000000是否驻留在ROM中? 从该地址读取代码后会发生什么? 是否应该有某种引导加载程序存在&如果是,它应该位于哪个地址?它是否也应该位于ROM中? 最后,内核在什么时候启动&内核代码驻留在哪里?您必须在硬件开始执行的地址有可用的启动代码 这通常是通过让硬件将某种闪存或引导ROM映射到引导地址并

我是一个新手,刚开始从事微控制器编程。这里感兴趣的芯片是cortex-a9。复位或通电时,我的读数中必须有0x0000000的代码。我的问题虽然听起来太琐碎,但有助于我正确看待一些概念

内存地址0x0000000是否驻留在ROM中? 从该地址读取代码后会发生什么? 是否应该有某种引导加载程序存在&如果是,它应该位于哪个地址?它是否也应该位于ROM中?
最后,内核在什么时候启动&内核代码驻留在哪里?

您必须在硬件开始执行的地址有可用的启动代码

这通常是通过让硬件将某种闪存或引导ROM映射到引导地址并从那里开始运行来实现的

请注意,在micro控制器中,启动时开始运行的代码的使用寿命非常艰难-还没有初始化任何硬件,也没有硬件,我的意思是,即使是控制RAM访问的DDR控制器也无法工作。。。因此,您的代码需要在没有RAM的情况下运行

初始引导代码设置足够的硬件(例如,设置RAM芯片、设置TLB等、程序MAC等)后,启动加载程序

在某些系统中,初始引导代码只是引导加载程序的第一部分。在某些系统中,一个专用的引导代码会进行设置,然后从闪存读取引导加载程序并运行它

引导加载程序的工作是将内核/操作系统的映像引入RAM,通常来自闪存或网络(但也可以与另一块板、PCI总线等共享内存,尽管这种情况比较少见)。一旦引导加载程序在RAM中有了内核/OS二进制文件的映像,它就可以选择解压缩它,并移交内核/OS映像的开始地址的控制(调用)

有时,内核/操作系统映像实际上是一个小型解压缩程序和一个压缩内核

无论如何,最终的结果是内核/操作系统在RAM中可用,并且引导加载程序(可选地通过piggy-back解压缩程序)已将控制权传递给它


然后内核/操作系统开始运行,操作系统启动。

ARM销售的是内核而不是芯片,该地址的内容取决于购买ARM内核并将其放入芯片的芯片供应商。不同供应商、不同芯片的实现方式各不相同

传统上,ARM将从地址0引导,更准确地说,重置异常向量位于地址0。与其他处理器系列不同,传统的ARM模型不是异常入口点的地址列表,而是ARM在该地址执行指令,这意味着您需要使用相对分支或load pc指令。较新的cortex-m系列仅为thumb/thumb2(它们无法执行ARM(32位)指令),使用传统的(非ARM)地址列表,并且零地址不是异常向量,它是要加载到堆栈指针中的地址,然后重置第二个条目,依此类推。此外,cortex-m例外列表也不同,该家族有128个单独的中断,传统的ARM有两个,快速和正常。最近有一个基于cortex-m的问题,或者可能被称为thumb2问题,用于在thumb2手臂上运行linux。我认为cortex-m的实现都是微控制器级的芯片,并且只有几十KB的片上内存,基本上这些不属于你所问的类别。你问的是cortex-a9

许多内核或所有内核都有一个引导选项,其中引导地址可以是0x00000000或类似0xFFFF0000的内容作为备用地址。使用它会让ARM用户感到非常困惑,但它提供了一种功能,例如,在一个地址有一个rom,在另一个地址有一个ram,允许您从rom开机,然后将异常表切换到ram中进行运行时操作。您可能有一个具有核心的芯片可以做到这一点,但这取决于芯片供应商是否使用这些核心功能的边缘,或将其硬连接到某些设置,而不是为您提供灵活性

您需要查看有关芯片的数据表/文档。找出手臂核心的名称,就像你提到的cortex-a9。理想情况下,你想知道版本以及r0p0之类的东西,然后去ARM的网站,找到TRM,该核心的技术参考手册。您还需要一份ARM,ARM架构参考手册。ARM中描述了(传统的)ARM异常向量以及更多信息。您还需要芯片供应商的文档,并查看他们的引导方案。有些会在通电时将地址0指向引导prom,然后引导加载程序需要做一些事情,在寄存器中翻转一位,内存控制器会将地址0切换到ram。有些可能会将地址0始终配置为ram,而另一些地址始终配置为rom,例如0x8000000,芯片会在引导前将一些项目从rom复制到ram,或者芯片可能只是将重置向量的通电设置为rom的分支,然后由引导加载程序修补向量表。尽可能多的不同方案,可能有人尝试过,因此您必须研究芯片供应商的文档或示例代码,以基本了解rom问题的答案,这取决于您是否需要与芯片供应商核实

core的ARM TRM应说明(如果有)core上的strap选项(如能够从备用地址启动),连接供应商实施的strap选项(如果有)。手臂不会真的像TRM那样进入那里面。但值得购买的供应商将拥有一些自己的文档和/或代码,以显示其rom的功能