我正在使用嵌入式板,但我不知道相同的启动代码(C/程序集)的流程。
在嵌入式系统的情况下,我们能否讨论启动操作所执行的一般模块/步骤。
只是一个高级概述(算法)就足够了。欢迎所有示例。
/卡努__
我正在使用嵌入式板,但我不知道相同的启动代码(C/程序集)的流程。
在嵌入式系统的情况下,我们能否讨论启动操作所执行的一般模块/步骤。
只是一个高级概述(算法)就足够了。欢迎所有示例。
/卡努__
.bss
是未初始化(或归零)全局内存区域的名称。没有初始化值(超过 0)的全局变量、数组等位于此处。微控制器的一般做法是在该区域上循环并在启动时将所有字节设置为 0。int thisGlobal = 5;
,必须将 的值thisGlobal
从持久区域(通常在闪存中的程序之后,由链接器生成)复制到 RAM。这适用于静态值和函数中的静态值。未定义的值不会被复制,而是作为步骤 2 的一部分被清除。main()
从这里开始运行您的代码。通常,CPU 处于中断关闭状态(取决于平台)。
相当开放式的问题,但这里有一些我收集的东西。
对于超简单的处理器,没有真正的启动代码。cpu 获得电源,然后开始运行其内存中的第一条指令:no muss no fuss。
再往上一点,我们有像 avr's 和 pic's 这样的 mcu。这些启动代码很少。唯一真正需要做的就是用适当的地址设置中断跳转表。之后,由应用程序代码(唯一的程序)来做它的事情。好消息是,作为开发人员,您通常不必担心这些事情:这就是libc 的用途。
之后我们就有了简单的基于手臂的芯片之类的东西;比 avr 和 pic 更复杂,但仍然很简单。这些还必须设置中断表,确保时钟设置正确,并启动任何需要的片上组件(基本中断等)。看看Atmel 的这个 pdf,它详细介绍了 ARM 7 芯片的启动过程。
在食物链的更远处,我们拥有完整的 PC(x86、amd64 等)。这些的启动代码实际上是 BIOS,它非常复杂。
最大的问题是您的嵌入式系统是否将运行操作系统。一般来说,你要么想运行你的操作系统,要么启动某种形式的控制反转(我记得一个学校项目的例子是一个 telnet,它可以使用 RL-ARM 或开源 tcp/ip 来监听请求堆栈,然后在建立连接/接收数据时执行回调),或者进入您自己的控制循环(可能显示一个菜单然后循环直到按下一个键)。
C/C++ 启动代码的功能
那么“BOOT LOADER”放在哪里呢?它应该放在启动代码之前吧?据我了解,从复位向量控制转到引导加载程序。代码在那里等待一小段时间,在此期间它期望数据被刷新/下载到控制器/处理器。如果它没有检测到数据,则控制将转移到 theatrus 指定的下一步。但我怀疑 BOOT LOADER 代码是否可以重写。例如:可以将 UART 引导加载程序更改为 ETHERNET/CAN 引导加载程序,还是使用任何协议发送的数据使用网关转换为 UART 然后刷新。