TI DSP BootLoader技术要点概述

概述

在开发一款产品特别是要装到密闭空间里面的产品的时候,经常要考虑到程序的更新问题,更新程序的方法有使用芯片厂家自带的功能的(通过拉某个引脚,设置芯片启动某块boot程序,然后引导将自己的程序下载进去),有自己写BootLoader程序的,使用厂家自带功能更新程序方便,但必须要用厂家的通讯协议,板卡设计时必须留出程序升级要求的通讯接口,如果这个通讯接口后期使用还好,后期没用就占用了BOM成本,如果板卡对外有自己的通讯口,可以写一个BootLoader程序代替厂家的程序升级功能。TI的DSP在工控领域应用较多,在这篇文章中以TI的28335为例介绍一下BootLoader的写法,其他C2000系列的都大同小异。

功能要求

BootLoader的功能简单一句话概括,就是完成一些自检,然后准备好应用程序的运行环境然后执行应用程序,在有需要更新应用程序时更新应用程序。在这篇文章中重点介绍升级程序的功能。

要点

要做BootLoader程序需要的基础功能(知识)有:
1、程序存储介质的擦写功能,对程序运行在芯片内部flash上的需要有擦写内部flash的功能,对一些程序在外部存储介质上的需要能擦写外部存储介质,如果程序是一个文件(不是简单二进制)还需要有对文件系统的支持。
2、芯片中断向量表的深刻理解,有一些芯片在BootLoader程序和应用程序上都能随便更改中断向量表,但有一些芯片只能在BootLoader程序上改中断向量表,这时候就要自己做一个中断跳转表了。
3、链接文件的理解,BootLoader程序和应用程序是分开编译的,对于这种单片机的程序必须要理解程序编译到哪儿了,要在哪儿执行,这涉及到一些加载域和执行域的东西。
4、HEX文件的格式,编译DSP程序可以编译出来hex文件,然后根据hex文件就知道程序应该放到哪块儿地址了。

实现

上面说了要点,在这儿就对每个问题进行介绍。
1、TI官方提供了一个擦写内部flash的库,在TI的ControlSuit里面,目录是:ti\controlSUIT\libs\utilities\flash_api,在这个目录下有详细的介绍和例程,需要注意的是:擦写flash的代码要运行在RAM中,不可对OTP区还有受保护区进行擦写(曾经无意擦了一次,芯片锁死了);擦写动作不可被打断,执行的时候要关中断。
2、28335的中断向量表存在RAM中,可以在BootLoader程序和应用程序中随便更改,涉及的变量是PieVectTable,跟踪代码可以发现,这个变量被链接到了固定的地址中,这个地址刚好是芯片的中断向量表处。所以在BootLoader程序中设置一下这个表,然后再在应用程序中设置一下这个表就能设置好中断向量了。
3、修改链接文件,修改方法如下
链接文件的修改
上面是应用程序的链接文件,BootLoader程序还默认起始点定在BEGIN_M0上,修改为起始点之后还要注意修改程序空间的划分,这就要根据自己项目确定了,可以将flash划分为自己想要的区域。
这里需要注意的是将codestart定位到了BEGIN_FLASH上面,在这儿第一条的指令是汇编的指令,根据以前的经验这个代码的功能是初始化堆栈,然后跳转到main函数(这款芯片看不到具体的源码,感兴趣的可以参考STM32的启动文件);由于要初始化堆栈,所以不能自己将main函数定位到自己定义的地方,如果非要这样做,初始化堆栈的工作要在BootLoader中做好,在这里就直接使用芯片自带的功能了(多说一嘴,在其他一些BootLoader程序比如uboot和UEFI中都是自己代码初始化堆栈的)。
4、hex文件的格式,满天都是可以参考学习一下,将DSP的程序编译出hex格式网上也有相关的说明都可以参考学习(感谢网络!)。

有了上面介绍的基础知识后实现起来就比较方便了,在设计BootLoader程序的时候,程序启动就检查是否要更新程序,如果要更新更新就和外部主机进行通讯获得更新的代码,然后写到相应的位置上(这里就要BootLoader设计一个通讯协议了,通讯协议无非 帧头||长度||命令||数据||c校验码 等,设计复杂的可以传输加密的数据),将应用程序写到它的位置上之后更新一个标记(flash上自己定义的),标记已经有应用程序,下次启动检查有这个标记表明有应用程序了,跳到应用程序去执行就可以了。
程序跳转的位置也要保存在flash上自己定义的位置上,上面通过修改链接文件应用程序已经不在芯片默认的起始点了,可以通过map文件获取到程序的起始点
在这里插入图片描述
打开map文件,就可以看到应用程序的入口地址了,第一个函数是 _c_init00 在这里面就是初始化C运行的环境了。初始化完成后去执行main(C的天下了)

后记

上面大概就是编写BootLoader的一些技术要点了,涉及基础知识不多,是一些需要注意到的点,和关键点的实现,希望对大家有所帮助。
将BootLoader程序写完在生产的时候通过厂家的工具下载进去,然后启动BootLoader就可以更新自己的应用程序了,如果嫌弃这样麻烦,可以在将程序编译出hex文件之后自己写工具将BootLoader程序和应用程序打包成一个hex文件,通过厂家的工具也可以下载到芯片中去。
TI的DSP可以使用C2prog将程序下载到DSP中,如果嫌弃这个工具麻烦,自己也可以仿照C2prog写一个工具实现程序下载的功能,这就相当于又有一个BootLoader程序,这在大规模自动化生产的时候比较有用,有了这个工具可以实现非常多的自己的功能,这方面TI也提供了一些例子,下面的文章中将介绍一下这个工具的实现原理。

  • 13
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值