嵌入式系统中启动代码的流程,启动加载程序的概念?

Ren*_*h G 10 c embedded boot microcontroller assembly

我正在使用嵌入式主板,但我不知道相同的启动代码(C /汇编)的流程.

在嵌入式系统的情况下,我们是否可以讨论启动操作所采取的一般模块/步骤.

只是高级概述(算法)就足够了.欢迎所有的例子.

/ Kanu__

Yan*_*min 26

  1. CPU上电复位,并跳转到定​​义的点:复位向量,闪存开始,ROM等.
  2. 运行启动代码(crt-C运行时).这是您的编译器/ libc生成的一段重要代码,它执行:
    1. 配置并打开任何外部存储器(如果绝对需要,否则留待以后的用户代码).
    2. 建立堆栈指针
    3. 清除.bss段(通常)..bss是未初始化(或归零)全局内存区域的名称.没有初始化值(超过0)的全局变量,数组等位于此处.微控制器的一般做法是循环该区域并在启动时将所有字节设置为0.
    4. 从.text结束复制非const .data.由于大多数微控制器都是从闪存运行的,因此无法在那里存储可变数据.对于诸如此类的语句int thisGlobal = 5;,thisGlobal必须将值从持久区域(通常在闪存中的程序之后,由链接器生成)复制到RAM.这适用于静态值和函数中的静态值.未定义的值不会被复制,而是作为步骤2的一部分清除.
    5. 执行其他静态初始化程序.
    6. 呼叫 main()

从这里开始运行您的代码.通常,CPU处于中断关闭状态(取决于平台).


mar*_*r75 1

最大的问题是您的嵌入式系统是否将运行操作系统。一般来说,您要么想要运行操作系统,要么启动某种形式的控制反转(我记得学校项目中的一个例子是一个 telnet,它将使用 RL-ARM 或开源 tcp/ip 监听请求)堆栈,然后在建立连接/接收数据时执行回调),或者进入您自己的控制循环(可能显示一个菜单,然后循环直到按下某个键)。