弄清关于启动代码的几个问题
启动代码通常都烧写在Flash中,它是系统一上电就执行的一段程序,运行在任何用户C代码之前
启动代码主要完成两方面的工作,一是初始化执行环境,例如中断向量表、堆栈、I/O等;二是初始化C库和用户应用程序。
关于启动代码,有几个问题需要解解惑!
为什么启动代码一定一要用汇编语言编写?
最开始的几行代码要完成初始化中断向量,堆栈什么的,这些只能用汇编做。
启动代码的主要功能是什么?
CPU上电后会从IO空间的某地址取第一条指令。但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低;CPU工作模式、中断设置等不确定;存储空间的各个BANK(包括内存)都没有驱动,内存不能使用。在这种情况下必须在第一条指令处做一些初始化工作,这段初始化程序与操作系统独立分开,称之为bootloader。
一个嵌入式Bootloader最初始部分的代码几乎必须是用汇编语言写成的,因为开发板刚上电后没有准备好C程序运行环境,比如堆栈指针SP没有指到正确的位置。汇编代码应该完成最原始的硬件设备初始化,并准备好C运行环境,这样后面的功能就可以用C语言来写了。
单片机不用启动代码,为什么ARM要用启动代码?
1. C language 没有 SP(Stack Pointer register), CPSR, CP15 等控制指令, 若要初始化这些, 一定要用 Assembly code, 其它部分不是不能用 C language 实现, C language 的运行环境尚未准备好, 故 SP 必须先设好, Global Variable, standard library 都还不能使用。
2. 单片机没有 OS 的观念, 可以说全部都是在启动代码的模式。
其实单片机也是有“启动代码”的。只不过这部分工作不需要单片机程序员自己来完成。
比如用Keil C编写单片机程序,针对指定型号的单片机启动代码由Keil来完成了,不需要我们干涉。单片机程序只需要直接编写C部分的程序即可。
启动代码和Bootloader的区别和关系是怎样的?
启动代码是系统上电或者复位后运行的第一段代码,是进入C 语言的main 函数之前需要执行的那段汇编代码。它的作用是在用户程序运行之前对系统硬件及软件环境进行必要的初始化并在最后使程序跳转到用户程序。它直接面对ARM 处理器内核及硬件控制器进行编程,所执行的操作与具体的目标系统紧密相关。
C语言程序的运行需要具备一定的条件,如分配好外部数据空间,堆栈空间和中断入口等。另外,汇编代码可以更直接地对硬件进行操作,效率更高,这对启动中断等对时间要求更高的情况是非常必要的。
Bootloader 不是一段代码,它是一个具有引导装载功能的完整的程序,如可以引导装载linux的vivi,uboot,以及通常PC机上的BOIS程序等。
Bootloader 也包含了相应的启动代码,也就是说,启动代码是Bootloader的一部分,是所有相应应用程序的一部分。
楼主最近还看过