Bootloader /启动代码嵌入式系统

时间:2016-04-20 20:17:08

标签: assembly embedded startup avr bootloader

我对微控制器中使用的Bootloader和启动代码之间的区别非常困惑(比如AVR atmega),我有一些问题需要回答:

我可以同时使用这两种方式,也可以在使用其中时使用另一种方法吗?

重启AVR后应首先运行哪一个?

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

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

哪一个是"内置"在AVR中我应该开发哪一个?

提前致谢!

2 个答案:

答案 0 :(得分:4)

我认为你在谈论bootstrap而不是bootloader。 C引导程序确实想要在程序集中编写,否则你会遇到鸡和蛋的问题。您可以在C中编写其中的一部分但C代码不能完全符合标准(不能假设bss中的变量为零,如果C代码同时执行这两项操作,则初始化预初始化变量)。

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

这就是为什么引导程序通常在asm中,因为它没有这些规则,并且它可以访问高级语言不具备的堆栈指针等内容。

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

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

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

某些引导加载程序是按部件设计的,因此您可以使用引导加载程序更新引导加载程序,例如您的引导加载程序可以设计为在执行任何其他操作之前将其自身复制到ram,然后如果您想要修改引导加载程序本身可以,使用bootloader覆盖闪存,希望不要自己打砖块。您也可以对此进行一些保护,例如有两个引导加载程序,第一个有代码可以检查自己是否损坏,或者如果你有一个带子或它启动的辅助,它可以用来覆盖主要的主要覆盖次要的。你还有一个鸡蛋和鸡蛋的问题,前面有一点代码检查带子或在启动其余代码之前做校验和。你打破了它,你仍然是砖砌的。

像AVR这样的芯片有硬件方法可以从砖块中恢复,并且还有硬件保护的引导加载程序,有时在你获得芯片之前进行工厂编程,你可以使用带子或按键或任何其他方式来启动和重新加载你的申请。

答案 1 :(得分:3)

“启动代码”实际上称为C运行时。它由编译器添加到您的程序中。您可以在使用WinAVR和Atmel Studio安装的src文件中看到汇编代码。它将被称为crt5.asm,具体取决于您使用的处理器。

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

Bootloader是程序代码,也被称为在C运行时和程序代码之前运行。代码测试是否满足条件,例如按下按钮。如果按下该按钮,则引导加载程序会将新代码加载到闪存中。如果没有,代码跳转到复位向量,C运行时和代码正常运行。

引导加载程序代码位于闪存附近的特殊闪存部分,并且某些熔丝设置将导致执行从那里开始,而不是像通常那样在闪存开始时复位向量。

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