从上传第一份bootloader资料到现在,一直收到网友的邮件索取资料。说真的,那些资料已经遗失(上次搬家的时候移动硬盘丢失,导致很多资料丢失)。网上流传的uboot等,又都是为ARM这样的片子准备的。市场上也没有完整的为了freescale S8、S16芯片编写的Bootloader。为了让大家更好地学习单片机bootloader如何编写,特整理如下文章(很抱歉,文章分章节发布,因为工作实在是忙!)。在此,也请大家原谅,我不能贴出我们的源代码,因为和项目相关。但,我总相信:授人以鱼不如授人以渔。文章中很多见解纯属个人意见,有不当之处,敬请指明。为了更好地解释下文内容,先说明工作的平台是:MC9S12XS128,bootloader基于标准CAN
UDS (ISO-14229-6,ISO-15765-3)且适用于汽车级应用。
首先,我们需要理解什么是bootloader。Bootloader包含了两个名词: boot和loader。很明显,从字面上讲,要实现bootloader就必须分步实现boot和loader过程。相信大家都在用电脑(不然怎么能看这篇文章?:-)),可以想象,在你按电脑电源开关的时候,也就是我们所说的Power-On-Reset的时候,Windows首先要初始化硬件,当所有初始化结束后,加载操作系统,并运行。该过程某种程度上和我们在单片机要实现的功能类似,只是单片机资源有限,以及单片机要执行的功能有限。因而,我们直接给单片机上的bootloader取名为嵌入式bootloader。嵌入式bootloader严重依赖于硬件实现,这也就说明了在嵌入式系统中难以建议一个通用的bootloader。
言归正传,bootloader要实现的功能就是:在系统上电或者复位后,将系统的软硬件环境带到一个合适的状态,为最终调用应用程序准备好正确的环境。它包括:
- 初始化硬件设备
- 建立正确的内存空间映射
- 初始化栈
- 检测并初始化内存
- 初始化全局变量
- 加载程序,将非易失性存储器中的特定软件组拷贝到RAM中,并运行。
在汽车ECU中,bootloader通常指代码更新程序。ECU在programming session模式下,tester通过CAN总线向ECU发送S19文件格式的binary文件。ECU将代码下载并烧录到Application区域,ECU代码得以更新。下次上电或复位后即运行新的Application程序。