1 用处
做程序时,会有iap的需求。硬件一旦离开你,就是风筝飞走了,iap就是唯一的那根线子。通过iap更新程序,增加新的功能。
就是咱们自己写的bootloader,自然功能越少越好。去掉中断,保留唯一的通信外设,如uart口,接收升级程序数据。
内存使用上,就要分为两个部分:bootloader和app。bootloader在前,app在后。中断向量表跳转到app的中断函数上。
2 keil配置
8051芯片不支持动态配置中断向量表的地址,是硬件预设好的、存储中断服务程序(ISR)入口地址的一组固定物理内存地址,当某个中断被触发且被 CPU 响应时,程序计数器(PC)会强制跳转到这些特定的地址执行指令,如下

当你写了某个中断,编译时候,编译器会生成对应代码段,在相应跳转出写一条LJMP指令。效果如下


app程序要偏移到 app的rom空间去,keil的配置如下
1 点击菜单 Project -> Options for Target。找到 Off-chip Code memory。如下

2 lx51 locate,勾选下方的 “Use Memory Layout from Target Dialog”,让Keil自动将这个范围传递给LX51链接器。

为了更好的保护bootloder不被app程序误覆盖,通过lx51 misc设置指令保护bootloader的空间,如下。

备注:LX51 Misc 选项卡(通常被称为“大杂烩”或“高级控制”选项卡)是给高级开发者用来通过命令行指令直接控制链接器的。
常见的指令包括: REMOVEUNUSED:强制删除没被调用的段。这可以腾出空间,防止代码挤占中断向量表(0003H)。 RESERVE:告诉链接器“这块地皮我要留着,你别动”。 例如输入:RESERVE (D:00H-D:07H),这会强制要求链接器不要把任何变量分配到寄存器组 0 的位置。
3 问题
1 调试时memory窗口的内存数据和编译成果map文件对不上
答:Keil 有一个特殊的机制:它可以只加载“符号表”(让你看到变量和函数名字),但不把真实的十六进制代码写入到仿真内存中。
2 查看各类符号的地址
打开view-》sysmbol window,按照文件名,选中各类符号,可以看到符号的地址。

可以选中关注的符号,移动到watch窗口


关于程序移动如上所述,后面继续更新bootloader+app的整体开发。
我要赚赏金
