首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

80x51下做代码在线更新,求

2012-11-11 
80x51上做代码在线更新,求高手指点各位好,小弟最近在单片机上做一个代码在线升级的东西,eepROM,存储代码段

80x51上做代码在线更新,求高手指点
各位好,
  小弟最近在单片机上做一个代码在线升级的东西,eepROM,存储代码段的区域可擦除并可以读写,因为之前我是做arm的,对单片机和keil也不是很熟悉,我理解单片机是这样执行代码的,首先上电后,代码从0地址开始执行,在startup的代码中跳至main运行,现在假设程序烧写进去后,因为代码问题想要在代码运行过程中更新代码本身,但是程序运行过程中又要在code段取指令运行,如果这个时候去更新,这样肯定会出问题的。
  前两天想用绝对地址的办法,把可能会更新的文件定义到绝对地址,如果在后面要更新的话,直接去替换对应的文件,但是后面发现只要改动了一个文件某一个地方,对比生成的烧写文件,不止绝对地址的地方改动了,基本上整个烧写文件都改变了,这样就要更新整个code区,还是不行。
  求大侠们指点迷津啊,先谢谢了!

[解决办法]
可以这样做:

1 Bootloader 不采用中断方式。Boot 部分可以检测你的 COS 区起始地址页是否为空(当然也可以是指定的某一地址的一个标志),如果没有 COS 就跳到 Loader 例程,如果有就跳入 COS。

2 将你的 COS 工程设置成包含中断向量表的。

3 更新 COS 时,使用一个后门命令删除 COS 起始页或指定标志。重新上电就可以回到 Bootloader 控制。



[解决办法]

探讨
引用:

写错了,应该是
1. 编译code1时在option中设置code起始地址及size,xdata等
2. code1中的中断入口地址偏移可在option->C51中设置
3. 在code2中对应的中断入口地址放跳转指令ljump(不是lcall),跳转目标地址为code1中设置的中断入口偏移地址+code2中对应中断向量地址


不好意思,问个问题,就是……

热点排行