bozai 发表于 2013-3-22 18:42:16

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

特点: 升错文件不会变砖,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指令即可 (普通编译器都是,除非是汇编)
         

dreampet 发表于 2013-3-22 18:47:10

哈 楼主重出江湖啊

bozai 发表于 2013-3-22 18:55:35

dreampet 发表于 2013-3-22 18:47 static/image/common/back.gif
哈 楼主重出江湖啊

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

aworker 发表于 2013-3-22 20:32:27

本帖最后由 aworker 于 2013-3-22 21:53 编辑

喜得贵子了,恭喜!

xwkm 发表于 2013-3-23 13:19:51

本帖最后由 xwkm 于 2013-3-23 22:51 编辑

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

bozai 发表于 2013-3-26 14:10:43

aworker 发表于 2013-3-22 20:32 static/image/common/back.gif
喜得贵子了,恭喜!

谢谢      

bozai 发表于 2013-3-26 14:15:31

xwkm 发表于 2013-3-23 13:19 static/image/common/back.gif
和我的原理一样。只不过我把jmp给弄到无用向量上了。不占用额外空间。
另外就是完全可以弄到最高的1K上。而 ...

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

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

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

bozai 发表于 2013-3-26 14:22:51

按照xwkm的思路把跳转app的指令放到无用中断向量上。

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

xwkm 发表于 2013-3-27 17:41:37

本帖最后由 xwkm 于 2013-3-27 17:44 编辑

bozai 发表于 2013-3-26 14:15 static/image/common/back.gif
是个好想法,看下手册的确有好多reserved的向量。 谢谢

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

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

bozai 发表于 2013-3-28 10:13:27

xwkm 发表于 2013-3-27 17:41 static/image/common/back.gif
我的意思是说boot 在最高的1K。真正的APP向量弄到保留向量上。
我的一个USB的Boot用了2.5K。因为LGT的VUS ...

是我理解错了。

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

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

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

xwkm 发表于 2013-3-28 13:13:56

本帖最后由 xwkm 于 2013-3-28 13:15 编辑

bozai 发表于 2013-3-28 10:13 static/image/common/back.gif
是我理解错了。

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

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

aquarius0703 发表于 2014-10-6 09:26:29

mark,学习一下
页: [1]
查看完整版本: 也发一个LGT bootloader (串口XModem 占用1KB +4Byte Flash)