搜索
bottom↓
回复: 11

也发一个LGT bootloader (串口XModem 占用1KB +4Byte Flash)

[复制链接]

出0入0汤圆

发表于 2013-3-22 18:42:16 | 显示全部楼层 |阅读模式
特点: 升错文件不会变砖,app程序不需要知道boot的存在
方法: 38400波特率,板子复位后键盘敲“d”, 正常接收后串口会不停打印“C” 后把bin文件通过xmodem传送过去即可。

原理: 升级app时,把第一条jmp指令换成跳转到boot的jmp指令。 然后把app原来的跳转jmp指令放到0x1bfc的位置(就是boot区的前四个字节)。boot执行完了后执行存在0x1bfc位置的jmp指令即可跳转到app程序区。简单来说就是劫持app的第一条jmp指令。

          因此流程是 起始的jmp --> boot区第一个jmp --> boot区代码  --> jmp 0x1fbc --> app 执行.

          此方法适用于GCC编出来的程序,只要第一条指令是个jmp指令即可 (普通编译器都是,除非是汇编)
         

本帖子中包含更多资源

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

x

出0入147汤圆

发表于 2013-3-22 18:47:10 | 显示全部楼层
哈 楼主重出江湖啊

出0入0汤圆

 楼主| 发表于 2013-3-22 18:55:35 | 显示全部楼层
dreampet 发表于 2013-3-22 18:47
哈 楼主重出江湖啊

没有, 随便玩玩。
工作上有时候也还需要做点工具啥的。 搭些小开发板,有bootloader总比还要连个下载线要方便。

出0入0汤圆

发表于 2013-3-22 20:32:27 | 显示全部楼层
本帖最后由 aworker 于 2013-3-22 21:53 编辑

喜得贵子了,恭喜!

出0入0汤圆

发表于 2013-3-23 13:19:51 | 显示全部楼层
本帖最后由 xwkm 于 2013-3-23 22:51 编辑

和我的原理一样。只不过我把jmp给弄到无用向量上了。不占用额外空间。
另外就是完全可以弄到最高的1K上。而且你这个擦除的时候要是断电了,呵呵直接会成砖头的……
这个貌似开始就给UART一堆消息的。
我弄估计是用短路跳线或者给UART发送一个D才会进升级模式的。

出0入0汤圆

 楼主| 发表于 2013-3-26 14:10:43 | 显示全部楼层
aworker 发表于 2013-3-22 20:32
喜得贵子了,恭喜!

谢谢      

出0入0汤圆

 楼主| 发表于 2013-3-26 14:15:31 | 显示全部楼层
xwkm 发表于 2013-3-23 13:19
和我的原理一样。只不过我把jmp给弄到无用向量上了。不占用额外空间。
另外就是完全可以弄到最高的1K上。而 ...

是个好想法,看下手册的确有好多reserved的向量。 谢谢

弄到最高的1K好像不好吧。 那样要先擦除,把内容读出来,修改,再写进去。 操作越复杂,变砖的可能性越大。

由于不是真正的boot区,怎么做都有可能变砖。

出0入0汤圆

 楼主| 发表于 2013-3-26 14:22:51 | 显示全部楼层
按照xwkm的思路把跳转app的指令放到无用中断向量上。

n多其它优化措施后 把最终size 从1KB 缩减到 512Byte 以内。 只占一个page。这样留个app的空间就更大了。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-3-27 17:41:37 | 显示全部楼层
本帖最后由 xwkm 于 2013-3-27 17:44 编辑
bozai 发表于 2013-3-26 14:15
是个好想法,看下手册的确有好多reserved的向量。 谢谢

弄到最高的1K好像不好吧。 那样要先擦除,把内容 ...


我的意思是说boot 在最高的1K。真正的APP向量弄到保留向量上。
我的一个USB的Boot用了2.5K。因为LGT的VUSB比AVR大,而且程序设计不太简介导致的。
哪个INT0的重定向弄了很久……
比如说擦除芯片的时候忽然掉了电,没有来得及把复位向量和INT0写入中断表。
我的思路是,只要程序跑到BOOT区,立刻恢复中断表。这样在擦除过程断电也不会变砖。

出0入0汤圆

 楼主| 发表于 2013-3-28 10:13:27 | 显示全部楼层
xwkm 发表于 2013-3-27 17:41
我的意思是说boot 在最高的1K。真正的APP向量弄到保留向量上。
我的一个USB的Boot用了2.5K。因为LGT的VUS ...

是我理解错了。

GCC编译出来的代码所有的中断向量都预留了,尽管有很多都不用。 这个会浪费空间(总共31个,124Bytes)。可以自己写这段汇编来解决。
还有main函数,一般永远都不会退出。因此进出栈等待码就可以免了。

这两样加起来可以省些空间。  数据类型能用小的就用小的。 函数只会被用到一次的可以inline,尽量让函数不在多个地方调用. 有些错误处理不太用的着的可以去掉。 这样整个size就会变小。毕竟LGT只有8K。  我后来改的boot不到512Byte,正好LGT的一个page能放下。

自动恢复挺不错,不过应该会带来不少额外的开销。

出0入0汤圆

发表于 2013-3-28 13:13:56 | 显示全部楼层
本帖最后由 xwkm 于 2013-3-28 13:15 编辑
bozai 发表于 2013-3-28 10:13
是我理解错了。

GCC编译出来的代码所有的中断向量都预留了,尽管有很多都不用。 这个会浪费空间(总共31 ...


lpm指令和别的一些指令在启动的时候带来的延迟不大,最多就半毫秒的。
不过V-USB真是大,啥事不干编译出来都1.8K了

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-5 18:31

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

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