最近在研究rt1050程序烧写相关的算法,于是对程序启动相关部分的知识进一步的学习理解,简单的梳理一下这两天查阅资料后对bootloader及启动模式的一些了解;
bootloader:即引导加载程序,就是在运行固件前需要进行执行的代码,它主要是引导程序,及映射一些内存等一些作用。
(引用网上的一段话:在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。为了初始化CPU及其他外设,使得Linux内核可以在系统主存中跑起来,并让系统符合Linux内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。而Boot Loader并不是Linux才需要,是几乎所有的运行操作系统的设备都具备的。https://blog.youkuaiyun.com/xinyuwuxian/article/details/8852610)
启动方式:这里以stm32为例,stm32有三种启动模式
1.BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。
2.BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。
3.BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。
启动模式即芯片在启动时把那部分的地址映射到0x00000000,stm32从0x00000000开始执行程序,比如模式1以闪存方式启动,则将主Flash地址0x08000000映射到0x00000000,然后从0x00000000开始启动,但是你访问0x0800000也同样能访问到其程序。
bootloader则是放在0x08000000的固件中的头部,需要我们在烧写固件的时候将其和我们的逻辑代码链接在一起然后烧写到flash中。cpu则先运行bootloader进行一些配置;
在说一下关于ISP(在系统编程)和IAP(在应用编程);
ISP:在系统编程,是指芯片产生在芯片中内置一小段代码,当用户启动这部分代码的时候,这份代码就可以进行引导固件的下载地址,如上面的启动方式2即是将isp存放的地址映射到0x0000000,然后运行这段isp代码,然后进行引导固件的烧写;
IAP:在应用编程,有芯片本身(或通过外围的芯片)可以通过一系列操作将code写入,比如一款支持IAP的单片机,内分3个程序区,1作引导程序区,2作运行程序区,3作下载区,芯片通过串口接收到下载命令,进入引导区运行引导程序,在引导程序下将new code内容下载到下载区,下载完毕并校验通过后再将下载区内容复制到2区,运行复位程序,则IAP完成;(参考http://blog.youkuaiyun.com/Cowena/article/details/47414233)
我现在对IAP和bootloader有些迷惑,我现在的理解就是bootloader,就是我们设计后的bootloader,后续客户直接进入到这段bootloader,而不再是进入到ISP中。在我们设计bootloader时就可以去设计如何升级更新我们的代码。
即上述启动模式中,运行模式1则进入到IAP,进入到我们设计的bootloader中去引导程序的运行。
刚开始写博客,语言组织以及排版都很糟糕.