这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » 【分享开发笔记,赚取280元手持便携数字示波器】8051使用keil编译的程序移

共1条 1/1 1 跳转至

【分享开发笔记,赚取280元手持便携数字示波器】8051使用keil编译的程序移动心得

助工
2026-03-05 17:27:09     打赏

1 用处

做程序时,会有iap的需求。硬件一旦离开你,就是风筝飞走了,iap就是唯一的那根线子。通过iap更新程序,增加新的功能。

就是咱们自己写的bootloader,自然功能越少越好。去掉中断,保留唯一的通信外设,如uart口,接收升级程序数据。

内存使用上,就要分为两个部分:bootloader和app。bootloader在前,app在后。中断向量表跳转到app的中断函数上。

2 keil配置

8051芯片不支持动态配置中断向量表的地址,是硬件预设好的、存储中断服务程序(ISR)入口地址的一组固定物理内存地址,当某个中断被触发且被 CPU 响应时,程序计数器(PC)会强制跳转到这些特定的地址执行指令,如下

image.png

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

image.png

image.png

app程序要偏移到 app的rom空间去,keil的配置如下

1 点击菜单 Project -> Options for Target。找到  Off-chip Code memory。如下

image.png

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

image.png

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

image.png

备注:LX51 Misc 选项卡(通常被称为“大杂烩”或“高级控制”选项卡)是给高级开发者用来通过命令行指令直接控制链接器的。

常见的指令包括:
REMOVEUNUSED:强制删除没被调用的段。这可以腾出空间,防止代码挤占中断向量表(0003H)。
RESERVE:告诉链接器“这块地皮我要留着,你别动”。
例如输入:RESERVE (D:00H-D:07H),这会强制要求链接器不要把任何变量分配到寄存器组 0 的位置。

3 问题

1 调试时memory窗口的内存数据和编译成果map文件对不上

答:Keil 有一个特殊的机制:它可以只加载“符号表”(让你看到变量和函数名字),但不把真实的十六进制代码写入到仿真内存中。

2 查看各类符号的地址

打开view-》sysmbol window,按照文件名,选中各类符号,可以看到符号的地址。

image.png

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

image.png

image.png

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





关键词: 8051     bootloader     keil    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]