80x51上做代码在线更新,求
80x51上做代码在线更新,求高手指点各位好,小弟最近在单片机上做一个代码在线升级的东西,eepROM,存储代码段
80x51上做代码在线更新,求高手指点
各位好,
小弟最近在单片机上做一个代码在线升级的东西,eepROM,存储代码段的区域可擦除并可以读写,因为之前我是做arm的,对单片机和keil也不是很熟悉,我理解单片机是这样执行代码的,首先上电后,代码从0地址开始执行,在startup的代码中跳至main运行,现在假设程序烧写进去后,因为代码问题想要在代码运行过程中更新代码本身,但是程序运行过程中又要在code段取指令运行,如果这个时候去更新,这样肯定会出问题的。
前两天想用绝对地址的办法,把可能会更新的文件定义到绝对地址,如果在后面要更新的话,直接去替换对应的文件,但是后面发现只要改动了一个文件某一个地方,对比生成的烧写文件,不止绝对地址的地方改动了,基本上整个烧写文件都改变了,这样就要更新整个code区,还是不行。
求大侠们指点迷津啊,先谢谢了!
[解决办法]
可以这样做:
1 Bootloader 不采用中断方式。Boot 部分可以检测你的 COS 区起始地址页是否为空(当然也可以是指定的某一地址的一个标志),如果没有 COS 就跳到 Loader 例程,如果有就跳入 COS。
2 将你的 COS 工程设置成包含中断向量表的。
3 更新 COS 时,使用一个后门命令删除 COS 起始页或指定标志。重新上电就可以回到 Bootloader 控制。
[解决办法]
问个问题,就是为什么要设置code1的中断入口地址偏移?我现在把我的code1的地址设置在0x1000,
code2在0x0000,我升级完成后直接跳转到0x1000不行吗?
51的中断入口地址是固定的,如0x03,0x0B...,但你在code1中需要用到中断,所以必须在产生中断时从code2中跳转至code1中执行中断,为了方便使用,所以可以跳转到对应的位置,如你code1的地址设置为0x1000,则在code2中对应的中断入口为0x1003,0x100B;在升级完成后直接跳转到0x1000是对的
如果设置中断入口地址偏移,要设置多大的偏移?有没有说明规则呢?
见上面
还有就是为什么升级完成后code2中的跳转地址要是code1中设置的中断入口偏移地址+code2中对应中断向量地址。
你把中断跳转和升级完成后跳转至code1弄混了,升级完成后跳转至0x1000(你的设置)地址开始执行即可
在code2中0x0003地址放置(LJMP 0x1003), 0x000B地址放置(LJMP 0x100B)......这是为了让你可以在应用代码(code1)中使用中断