搜索
bottom↓
回复: 46

分享:在KE02中做BootLoader

[复制链接]

出0入0汤圆

发表于 2014-5-5 17:32:30 | 显示全部楼层 |阅读模式
这几天在研究KE02做BootLoader,目前有点心得,想跟大家分享一下。当然,只是下位机部分。

程序的思路比较简单:
1.        程序存储:用串口接收到数据,然后写到Flash中去,写完后跳到应用程序中运行。
2.        操作标志:BootFlag,上电的时候先判断BootFlag的状态两种结果
        a.        如果BootFlag是操作过的状态(即里面有完整的应用程序),那么启动定时器,开始计时,2秒内如果没有接收到串口的数据,那么就跳到应用程序去运行。
        b.        如果BootFlag是未被操作的状态(即应用程序不完整),那么,不启动定时器,一直在Boot中运行。
        c.        当接到擦除命令的时候,将BootFlag擦除,处于Flash未操作状态。
        d.        当接到结束命令的时候,将BootFlag置起,处于Flash已操作状态。

通讯协议:

我个人比较懒,也懒得去研究ModernBus之类的协议,就看着HEX的文件格式就是不错的协议,所以就直接拿来用了,而且HEX文件都是ASCII字符,在数据传输过程中不容易出错,它的格式如下:
        :LLAAAATTDDVV\r\n
        :     每一行的头
        LL    数据域的长度
        AAAA 地址域
        TT          类型域
        DD          数据域
        VV          校验域
        \r\n   结尾

        以上要重点说明的是类型域,HEX的类型域一般有以下几种:
        00        表示数据记录
        01        文件结束记录
        02        扩展段地址记录
        04        扩展线性地址记录
        05        开始线性地址记录
        也就是说当类型域为00的时候,表示此段数据需要按照地址域的地址写到Flash中去。01的时候表示文件结束了,也就是说已经发送完了,可以跳到应用程序去了。然后还有一个需要注意的是04,它是扩展地址,可以理解成高16位地址。
按照上面的格式应该就可以进行通讯烧录,但是考虑到BootFlag操作,所以我添加了一个06,为擦除命令。即是说在烧录前可以将所有应用程序空间擦除一次,包括BootFlag,也被擦掉。
按照上面的描述,我的协议也有了。

BootFlag:
        刚才我们说需要做一个BootFlag,但是BootFlag所处的位置让我大伤脑筋,如果放在Boot区的Flash中,那么,我在擦除与置位的时候有太多的麻烦,所以只能放在应用程序区。经过综合考虑,最终,我决定将BootFlag放在Flash最后一段的最后几个字节。在擦除Flash的时候,我从最后面一个段开始往前面擦除,这样的话就最先擦掉BootFlag。而在Flash编程的时候,根据HEX文件的特性,会是从前往后编程,等编程完后,再把BootFlag置位。这样就避免了在任何时候断电重启时,内部残余的应用程序可能会启动的情况。

应用程序:
        在考虑BootLoader程序的时候,考虑最多的是中断向量的问题。因为BootLoader跟Applaction程序不可能公用中断向量。一开始想的是要实在不行的话,在RAM中做一个函数指针数组,然后将中断向量指向这个数组,然后在BootLoader与Applaction程序启动的时候都可以将中断句柄初始化到数组中,可以完成中断向量相同,但中断函数不同。但这样的做法很麻烦,面对目前飞思卡尔提供的例程架构,要改的东西太多。后来发现其实ARM的NVMI寄存器中有中断向量重影射的寄存器,这下解决大问题了,只要在应用程序启动的时候将中断向量直接写入此寄存器就可以了:
        SCB_VTOR = (uint32_t)(&__vect_table);

        做应用程序的时候要注意的两点:
        1、        就是刚才说的中断向量表的重影射。
        2、        应用程序起始地址。其实说完了就是分散加载的问题,我用的是KEIL,分散加载文件是用PE生成的,然后拿来做修改就可以了。

        现在所有的问题基本思路都清楚了,可以开干了!我用KE02提供的程序库,开始做,当我将程序做完之后,我发现妈呀,将近15K呀,这怎么行啊,优化,一定要优化。当然将KEIL中的优化级别设为最高,还是不行啊,10K多呀,这太郁闷了,我用的芯片是KE02Z64VQH2,只有64KFlash,我不能有10K多的Boot呀。后来打开MAP文件一看,里面有好多没有用到的函数啊,晕,没用到,但他也占空间啊,删吧,于是把不用的函数全给屏了,这回好多了,只有2.5K了,2.5K也大,再想办法,从MAP文件中看到有哪个函数占用空间大了,进行优化,能省一点是一点,在我的不断努力下,终于,小于2K了,成功!

        源码如下:
       


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-5-5 19:06:15 | 显示全部楼层
bootloader好像都是大神玩的啊
之前看Linux的时候好像了解过一些,只是了解......
我也来学习学习,拿出KE02哈哈哈

出10入10汤圆

发表于 2014-5-5 19:45:30 | 显示全部楼层
freescale有提供现成的,没必要什么都自己弄。到官网看看吧。

出10入10汤圆

发表于 2014-5-5 19:47:01 | 显示全部楼层
刚看到有网友贴上来了。见
http://www.amobbs.com/thread-5579626-1-1.html

出0入0汤圆

 楼主| 发表于 2014-5-5 20:52:29 | 显示全部楼层
本帖最后由 wangpengcheng 于 2014-5-5 20:54 编辑


现成的看了一下,用起来不舒服,就当熟悉ARM架构了,好久前就想做一个,一直没动手,现在刚好有KE02的平台,就做了一个,哈哈!

出0入0汤圆

 楼主| 发表于 2014-5-5 20:53:36 | 显示全部楼层
苦行僧 发表于 2014-5-5 19:06
bootloader好像都是大神玩的啊
之前看Linux的时候好像了解过一些,只是了解......
我也来学习学习,拿出KE0 ...

没那么复杂的,当年用AVR的时候,就玩过,只不过AVR是专门分出了Boot区,现在ARM所有地址都相同,自己分一下!

出0入0汤圆

发表于 2014-5-5 21:29:07 | 显示全部楼层
楼主高人啊,自己作BootLoader。

出0入0汤圆

发表于 2014-5-5 21:44:41 | 显示全部楼层
zndz410 发表于 2014-5-5 21:29
楼主高人啊,自己作BootLoader。

wwww.freescale.com搜索一下An2295就知道飞思卡尔的bootloader其实是小儿科

出0入0汤圆

 楼主| 发表于 2014-5-5 21:58:50 | 显示全部楼层
zndz410 发表于 2014-5-5 21:29
楼主高人啊,自己作BootLoader。

简单的Boot而已,ARM9那样的,我到现在都没玩明白!

出0入0汤圆

发表于 2014-5-5 21:59:51 | 显示全部楼层
自己写,楼主厉害啊,之前玩KE02是用官方的

出0入0汤圆

 楼主| 发表于 2014-5-5 22:09:35 | 显示全部楼层
其实这个Boot要用的话,是会限制应用程序的,需要在应用程序中写清楚程序起始地址以及中断向量重影射!如果不限制的话应该怎么弄,还没想明白!

出0入0汤圆

 楼主| 发表于 2014-5-6 10:39:51 | 显示全部楼层
motodefy 发表于 2014-5-5 21:59
自己写,楼主厉害啊,之前玩KE02是用官方的

官方的程序有点大,不适合自己用,呵呵!

出0入0汤圆

发表于 2014-5-6 13:47:16 | 显示全部楼层
请问楼主这个BOOTLOADER是用什么上位机操作来升级固件?

出0入0汤圆

发表于 2014-5-6 16:40:51 | 显示全部楼层
谢谢楼主分享!
好资料。

出10入10汤圆

发表于 2014-5-6 19:44:29 | 显示全部楼层
官方的程序是看来学习的,用到产品中还是要自己写。否则容易被破解。

出0入0汤圆

 楼主| 发表于 2014-5-6 21:55:40 来自手机 | 显示全部楼层
zhongyb 发表于 2014-5-6 13:47
请问楼主这个BOOTLOADER是用什么上位机操作来升级固件?

上位机准备选择用mk60dx256来做,实现脱机,这几天正在看usb的msd,暂时还没看明白

出100入101汤圆

发表于 2014-8-27 20:45:51 | 显示全部楼层
"里面有好多没有用到的函数啊",mdk的话勾选“one elf section per function“

出0入0汤圆

发表于 2014-8-27 22:23:03 | 显示全部楼层
官方的程序只是演示性的确实不适合直接用。

出0入0汤圆

发表于 2014-8-27 22:38:48 来自手机 | 显示全部楼层
楼主牛人,迅速换塔式板子做应用回馈大家

出0入0汤圆

 楼主| 发表于 2014-8-27 23:41:44 | 显示全部楼层
cn_x 发表于 2014-8-27 22:38
楼主牛人,迅速换塔式板子做应用回馈大家

靠你了,我最近太忙了,呵呵!

出0入0汤圆

发表于 2014-8-28 06:57:01 | 显示全部楼层
好帖  mark。。

出0入0汤圆

发表于 2014-8-28 08:24:27 | 显示全部楼层
wangpengcheng 发表于 2014-8-27 23:41
靠你了,我最近太忙了,呵呵!

我换6000的够了  高大上的玩不起

出0入0汤圆

发表于 2014-8-28 12:18:50 来自手机 | 显示全部楼层
技术贴啊,支持一下

出0入0汤圆

发表于 2014-8-28 12:26:05 | 显示全部楼层
这个如果用OpenSDA写一次MCU,会胡盖吗?

出0入4汤圆

发表于 2014-8-28 12:58:33 | 显示全部楼层
都是好资料啊,收藏慢慢学

出0入0汤圆

发表于 2014-8-28 13:49:27 | 显示全部楼层
没研究过这种东西,大致完成的功能是通过串口可以给单片机下载程序?

出0入0汤圆

 楼主| 发表于 2014-8-28 13:58:36 | 显示全部楼层
浪里白条 发表于 2014-8-28 13:49
没研究过这种东西,大致完成的功能是通过串口可以给单片机下载程序?

是的           

出0入0汤圆

发表于 2014-8-28 14:03:37 | 显示全部楼层

但是串口传的数据不是很容易出现误码,这个有没得校验?

出0入0汤圆

 楼主| 发表于 2014-8-28 16:47:54 | 显示全部楼层
浪里白条 发表于 2014-8-28 14:03
但是串口传的数据不是很容易出现误码,这个有没得校验?

在传输的时候采用HEX文件方式传输,一个是ASCII传输误码相对较少,另一个HEX文件格式中每行最后一个字节是校验数据,可以避免传输错误!

出0入0汤圆

发表于 2014-8-28 16:50:12 | 显示全部楼层
学习了           

出0入0汤圆

发表于 2014-8-28 17:16:01 | 显示全部楼层
wangpengcheng 发表于 2014-8-28 16:47
在传输的时候采用HEX文件方式传输,一个是ASCII传输误码相对较少,另一个HEX文件格式中每行最后一个字节 ...

原来如此,感谢讲解。

出0入0汤圆

发表于 2014-8-28 18:03:02 | 显示全部楼层
非常有价值的帖子,学习了。

出0入0汤圆

发表于 2014-8-30 17:14:55 | 显示全部楼层
支持楼主原创  学习了

出0入0汤圆

发表于 2014-8-30 18:36:27 | 显示全部楼层
收藏,有机会在板子上试

出0入0汤圆

发表于 2014-8-31 00:38:01 | 显示全部楼层
好东西,学习了,谢谢

出0入0汤圆

发表于 2014-10-22 18:34:06 来自手机 | 显示全部楼层
Mark ke02bootloader

出0入0汤圆

发表于 2014-10-22 21:49:56 | 显示全部楼层
MARK!后面有时间一同研究下BOOTLOADER

出0入0汤圆

发表于 2014-12-16 14:56:07 | 显示全部楼层
wangpengcheng 发表于 2014-8-28 16:47
在传输的时候采用HEX文件方式传输,一个是ASCII传输误码相对较少,另一个HEX文件格式中每行最后一个字节 ...

串口传是不是很慢,不是烧录器的会快点吗

出0入0汤圆

发表于 2014-12-16 17:56:33 | 显示全部楼层
bootloader一般还是加上校验等等多包传输什么的

出0入0汤圆

 楼主| 发表于 2014-12-18 21:56:46 | 显示全部楼层
Ray______ 发表于 2014-12-16 14:56
串口传是不是很慢,不是烧录器的会快点吗

呵呵,串口115K,SWD是12M,你说呢

出0入0汤圆

发表于 2014-12-18 23:24:21 来自手机 | 显示全部楼层
楼主真厉害!记得编译器有个选项,勾上后没用到的函数在链接时会自动屏蔽的

出0入0汤圆

发表于 2014-12-19 08:42:41 | 显示全部楼层
现在什么单片机都有bootloader了,

出0入0汤圆

发表于 2014-12-19 08:53:48 | 显示全部楼层
这个不错,是个简单的入门

出0入0汤圆

发表于 2014-12-19 08:57:12 | 显示全部楼层
收藏 学习学习啊

出0入0汤圆

发表于 2014-12-19 19:18:27 | 显示全部楼层
今天发现好像官方也有提供

出0入0汤圆

发表于 2014-12-20 11:44:22 | 显示全部楼层
谢谢楼主,好资料

出0入0汤圆

发表于 2014-12-20 11:56:19 | 显示全部楼层
感谢楼主分享,好资料要收藏!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 00:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表