Bootloader/Startup代码嵌入式系统

Bootloader/Startup code Embedded Systems

我对微控制器(如 AVR atmega)中使用的引导加载程序和启动代码之间的区别感到非常困惑,我有一些问题需要回答:

我可以同时使用两者吗?或者当我使用一个时不能使用另一个?

重启 AVR 后 运行 应该先哪个?

哪个是用汇编写的,哪个是用C写的?

引导加载程序可以执行启动代码功能吗?喜欢(将任何初始化数据从 ROM 复制到 RAM,初始化处理器的堆栈指针,调用 main,...等)。

AVR中"built-in"是哪一个,我应该开发哪一个?

提前致谢!

"startup code"其实就是叫C运行的时候。它由编译器添加到您的程序中。您可以在随 WinAVR 和 Atmel Studio 安装的 src 文件中看到汇编代码。它将被称为 crt5.asm,具体取决于您使用的处理器。

如果你想修改C 运行时间,你可以。编写您自己的副本并使用编译器开关 --nostartfiles 将其与您的程序文件一起编译。您可以用汇编或 C 编写,但汇编更容易。

Bootloader 是在 C 运行 时间和您的程序代码之前也被调用到 运行 的程序代码。代码测试是否满足条件,例如按下按钮。如果按下按钮,引导加载程序会将新代码加载到闪存中。如果不是,代码跳转到重置向量和你的 C 运行time 和代码 运行s 正常。

引导加载程序代码位于闪存末尾附近的特殊部分,某些保险丝设置会导致执行从那里开始,而不是像通常那样在闪存开头的复位向量处开始执行。

关于 C 与汇编语言的问题,答案是任何代码都可以用任何一种语言编写。编译器会将源代码转换为目标体系结构的机器指令,称为目标代码。通常,有一个编译器选项可以在将 C 源代码编译为目标代码之前输出转换为汇编指令的 C 源代码,以便您查看。如果您想用 C 编写然后在汇编阶段调整代码,这很方便。

我想你说的是 bootstrap 而不是引导加载程序。 A C bootstrap 确实要用汇编编写,否则你会遇到先有鸡还是先有蛋的问题。您可以用 C 编写其中的一些内容,但 C 代码不能完全符合标准(不能假设 bss 中的变量为零,如果 C 代码同时执行这两种操作,则预初始化变量也不会被初始化)。

需要bootstrap 高级语言与微控制器或特定指令集无关,它是全球需要的。高级语言,即使是C,也有一定的假设(堆栈指针已设置,定义为初始值的全局变量为该值,其他为零,任何C库准备(堆位置))都在之前完成main() 或 C 的任何入口点。其他语言也是如此。

这就是为什么 bootstrap 通常在 asm 中,因为它有 none 这些规则,并且它可以访问高级语言没有的堆栈指针之类的东西。

如果您愿意放弃某些语言兼容性,bootstrap 可以更简单。使用 arm cortex-m,硬件提供了一种无需代码即可初始化堆栈指针的解决方案,如果您希望它作为入口点,则可以启动到 C 中,但是如果您这样做,您不会获得全局变量初始化,所以如果愿意的话放弃那样你只需要一种方法来定义向量 table(asm 指令是迄今为止最简单的,因为工具都在那里)。

现在也许你在调用我调用的启动代码bootstrap。

引导加载程序是用您喜欢的任何语言编写的程序,可启动芯片或系统。它可以打开时钟或调出 ddr 或擦除内存以启用 ecc,无论您需要什么。然后启动主应用程序(用任何语言编写,引导加载程序和主应用程序中的每一个都有根据语言规则的启动代码,如上所述 bootstrap 我使用的术语)。那是引导加载程序的引导部分。加载器部分意味着有人可以中断引导过程以启动应用程序,从而允许开发人员以某种方式试验不同的应用程序,要么覆盖非易失性 ram 中的应用程序,要么将应用程序加载到 ram 中 运行 它而不是正常引导路径。

一些bootloader是分部分设计的,这样你就可以用bootloader更新bootloader,例如你的bootloader可以设计成在做任何其他事情之前先将自己复制到ram,那么如果你想修改bootloader本身你可以,使用引导加载程序覆盖闪存,希望不要让自己变砖。您还可以采取一些保护措施来防止这种情况,例如拥有两个引导加载程序,第一个具有检查自身是否损坏的代码,或者您是否有带子或启动辅助程序的任何东西,辅助程序可用于覆盖主程序,主程序可以覆盖主程序次要的。你仍然有一个先有鸡还是先有蛋的问题,前面的一小段代码会在启动其余代码之前检查表带或执行校验和。你打破了它,你仍然是砖头。

像 AVR 这样的芯片有硬件方法可以从变砖中恢复,也有硬件保护的引导加载程序,有时在你拿到芯片之前就进行了工厂编程,你可以从中使用带子或按下一个键或其他任何东西来启动和重新启动-加载您的应用程序。