Microchip公司16位单片机dsPIC33E/PIC24E系列bootloader的开发(1)

Mikael Gustafsson开 发的bootloader支持Microchip公司8位/16位/32位单片机全系列产品,只可惜到了最新70MHz的dsPIC33E/PIC24E 系列以后,就不再开源,并且开始收费了。如果你决定自己开发一款用在dsPIC33E/PIC24E单片机上的bootloader,我的这系列篇文章将 会给您提供非常好的参考。首先,让我从剖析Mikael Gustafsson的“ds30 Loader”入手。

  1. Bootloader入门:
    Bootloader可以被成为自加载程序,简而言之就是自己对自己编程。bootloader本身就是一段存储在单片机flash中的固件。但不同的 是,bootloader只做一件固定的事情——接受用户的应用代码固件,并将其存放在空余的flash中。除此以外,bootloader不做其他任何 事情,甚至可以被视作不存在。一个含有bootloader的单片机运行起来和不含bootloader、直接通过编程器烧制固件的单片几乎完全一样。对 于bootloader而言,体积小是起码的要求,因为bootloader多少占用你的闪存空间。Bootloader的另一大优势是免去了必须要编程 器烧制固件的麻烦,你只需要第一次用编程器烧制bootloader,之后就可以通过bootloader来烧制新的固件了。当然这也对 bootloader的可靠性提出了非常高的要求——bootloader要保证不会把自己给删除了。
  2. bootloader放在哪里:
    网上对于bootloader的架构有很多不同的见解。“ds30 Loader”这类的产品将bootloader放在闪存区的尾部,而Microchip给出的设计参考“AN1094 – Bootloader for dsPIC30F/33F and PIC24F/24H Devices”则选择紧接着中断向量表的闪存开始部分存放bootloader。我个人倾向于“ds30 Loader”的架构,因为使用闪存尾部的做法无须应用固件开发工程师对开发环境(IDE)进行特殊配置。

    BL1_no_bootloader_cn

    图1. 不含bootloader的单片机闪存使用情况。编译器从最开头可用的空间用起。当芯片启动的时候GOTO指令将引导系统读取用户应用程序。

    BL1_microchip_bootloader_cn

    图2.将bootloader至于闪存头部的设计架构。严格地说,bootloader并非是置于最最前部。因为“GOTO指令”和“RESET地 址”以及中断向量表(IVT,interrupt vector table)处于闪存的最前部,接下来才是用户可用空间。一般而言,这种设计将bootloader放在第二个编程区(program block / erase block)中。因此编译器必须通过配置知道第二编程区已经被占用需要空出。这种设计的另一个缺点是第一编程区(即包含GOTO,RESET以及IVT的 区)未被使用的部分也被浪费了。因为flash在擦除的时候是按照区位做小单位的。第一区有GOTO,RESET和IVT,不得不必须跳过,在接下来的第 二区放置bootloader。同样的道理,第二区有空余也不能被其他程序使用。(注,IVT后面空出来的一区其余闪存可以通过修改复杂的编译器设置来使 用,这里不详述)

    BL1_my_preferred_bootloader_cn

    图3. 将bootloader置于闪存尾部的设计架构。这样的话,编译器按照寻常的做法,从头开始使用flash空间,无需特别配置。当然,对于被 bootloader占用的那块编程区余下部分,则依旧只能浪费。当然你要确保你的应用程序不至于太长(绝大部分情况下是不会发生的)而覆盖掉位于尾端的 bootloader。

至于如何将bootloader烧制到flash中,没办法,这时候你只能用一次编程器,不过你只需要这次用一下它,接下来bootloader就开始帮你烧制固件了。

不要离开,我的下一篇文章将和你深入探讨理解Microchip单片机的二进制hex代码规范

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

%d 博主赞过: