2016-04-20 40 views
-1

我很困惑,在微控制器(AVR一样ATMEGA)使用引导程序和启动代码之间的区别,我有一些问题需要回答的问题:引导程序/启动代码,嵌入式系统

我可以在同时使用同一时间或当我使用一个我不能使用其他?

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

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

Bootloader可以启动代码功能吗?像(将任何初始化的数据从ROM复制到RAM,初始化处理器的堆栈指针,调用main,...等)。

哪一个在AVR中“内置”,哪一个应该开发?

在此先感谢!

回答

2

我想你是在谈论bootstrap而不是bootloader。一个C bootstrap确实希望被写入汇编,否则你有鸡和鸡蛋的问题。你可以用C编写它,但是C代码完全不符合标准(假设bss中的变量为零,如果C代码同时执行了这两项操作,则初始化变量被初始化)。

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

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

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

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

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

一些引导加载程序是分开设计的,因此您可以使用引导加载程序更新引导加载程序,例如,您的引导加载程序可以设计为在执行其他任何操作之前将其自身复制到RAM,然后如果要修改引导加载程序本身你可以使用引导程序覆盖闪存,希望不会阻塞自己。您也可以采取一些保护措施,比如有两个引导加载程序,第一个代码会检查自身是否损坏,或者如果您有绑定或任何启动辅助程序,辅助可用于覆盖主要的可以覆盖次要的。你仍然有一个鸡蛋和鸡蛋的问题,最初的代码是在代码的其余部分进行检查之前检查表带或做校验和。你打破了,你仍然砖。

像AVR这样的芯片有硬件方式可以从砖块中恢复,也有硬件保护的引导加载程序,有时在工厂编程之前,你得到芯片,你可以使用皮带或打一个键或任何启动,加载你的应用程序

+0

所以你说的引导程序确实有一个“引导程序”,它负责“引导部分”,应该写在程序集中,因为它没有上面提到的任何规则? –

+1

引导程序是一个类似于任何其他程序的程序,如果使用高级语言编写,那么它需要引导程序才能运行它,并根据需要设置堆栈副本.data。零.bss等。与其任务或其运行的环境或平台无关。引导程序只是一个像操作系统一样的程序,就像一个Web浏览器一样只是一个程序。 –

2

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

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

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

引导程序代码是在接近尾声闪光灯的专门章节,以及一些保险丝设置将导致执行在闪光灯的开始,因为它通常会在复位向量,而不是从那里开始。

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

+0

因此,作为启动加载程序运行在C运行之前它必须写在汇编? 我可以通过某种方式修改该引导程序? –

+0

如果你有bootloader的源代码,你可以修改它并编译它。不过,您将无法使用现有的引导加载程序将其加载到处理器上。你将不得不通过JTAG或者类似的设备使用AVRIce加载它。 – UncleO

+0

@MarwanAhmed您通常需要某种特殊设备才能替换引导加载程序。引导加载程序像AVR CPU一样的重点实际上是消除了对这种设备的需求。否则,如果没有引导程序,您需要使用这样的设备才能将任何类型的程序放在上面。 –