找回密码
 立即注册
查看: 37|回复: 2

IAP_04_移植过程中关于中断向量表的问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-05-01 07:14:14
已绑定手机

12

主题

29

回帖

316

积分

中级会员

积分
316
发表于 2025-4-15 11:08:19 | 显示全部楼层 |阅读模式
在IAP系列的前IAP_02中我已经成功实现从STC8H8K64U中移植ISP例程到STC8H1K17。


一 编译后有2个警告

现在我在ISP例程中实现我自己的业务功能,调试后有两个警告:

截图202504151058162775.jpg

二 阅读m51文件

截图202504151059181632.jpg
截图202504151059377385.jpg


第一个重叠发生在地址0x000B-0x000D,标记为"* OVERLAP * CODE 000BH 0003H ABSOLUTE"
第二个重叠发生在地址0x00C3-0x00C5,标记为"* OVERLAP * CODE 00C3H 0003H ABSOLUTE"
这些重叠的代码段都被标记为"ABSOLUTE",这意味着它们是绝对定位的代码段,而不是可重定位的代码段。
在8051架构中,这种重叠通常与中断向量表有关。


三 查看isr.asm

想到我是用的isr.asm也是从STC8H8K64U拷贝过来的,不知道是否适用STC8H1K17,查看一下isr.asm

截图202504151103307745.jpg

这个文件定义了一个宏MAPISR,它用于在特定地址(如0x000B、0x00C3等)创建中断向量。每个中断向量都是一个长跳转指令(LJMP),跳转到LDR_SIZE + $,其中LDR_SIZE被定义为0x1000(4096)。


问题在于:
在m51文件中,我有多个重叠的代码段,它们都位于这些中断向量的地址上(如0x000B和0x00C3)。
这些重叠的代码段都被标记为"ABSOLUTE",这意味着它们是绝对定位的代码,而不是可重定位的代码。
在isr.asm中,MAPISR宏被多次调用,每次都在不同的地址上创建中断向量,包括0x000B和0x00C3,这些正是m51文件中报告重叠的地址。


四 是否可以忽略

1、这个警告实际上不是真正的错误,可以被忽略吗?
2、我可以直接使用从STC8H8K64U拷贝过来的isr.asm,不知道是否适用STC8H1K17
花有重开日,人无再少年
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-15 11:12:00 | 显示全部楼层
关于中断向量表重叠问题的分析与解决方案

在IAP系列的前IAP02中,您已成功将ISP例程从STC8H8K64U移植到STC8H1K17,但在实现自定义业务功能时,编译后出现了两个警告,并发现中断向量表存在重叠问题。以下是对该问题的详细分析与解决方案。

一、编译警告分析

编译后出现的两个警告可能与代码段的重叠有关。从您提供的m51文件信息来看,重叠发生在以下地址:

1. 地址0x000B-0x000D,标记为"OVERLAP CODE 000BH 0003H ABSOLUTE"。
2. 地址0x00C3-0x00C5,标记为"OVERLAP CODE 00C3H 0003H ABSOLUTE"。

这些重叠的代码段被标记为"ABSOLUTE",表明它们是绝对定位的代码段,而非可重定位的代码段。在8051架构中,这种重叠通常与中断向量表有关。

二、中断向量表的重叠问题

在8051架构中,中断向量表位于内存的特定地址,每个中断向量占用3个字节(一个长跳转指令LJMP)。当多个中断向量表或代码段被定位到相同的地址时,就会发生重叠。

从您提供的israsm文件来看,它定义了一个宏MAPISR,用于在特定地址(如0x000B、0x00C3等)创建中断向量。每个中断向量都是一个长跳转指令(LJMP),跳转到LDRSIZE + $,其中LDRSIZE被定义为0x1000(4096)。

问题在于,这些中断向量的地址与m51文件中标记的重叠代码段地址一致,导致编译时出现警告。

三、解决方案

针对上述问题,可以采取以下步骤进行解决:

1. 检查中断向量表的定义:
确保中断向量表的定义与目标芯片(STC8H1K17)的中断向量地址一致。
如果从STC8H8K64U移植过来的israsm文件不适用于STC8H1K17,需要根据STC8H1K17的中断向量表进行修改。

2. 调整中断向量的地址:
如果中断向量表的地址与代码段重叠,可以尝试调整中断向量的地址,避免与代码段冲突。
在8051架构中,中断向量表通常位于内存的低地址区域(如0x0000-0x002F),因此需要确保这些地址不被其他代码段占用。

3. 使用可重定位的代码段:
如果可能,将绝对定位的代码段改为可重定位的代码段,以避免地址冲突。
在编译选项中,可以设置代码段的重定位地址,确保它们不与中断向量表重叠。

4. 检查链接脚本:
确保链接脚本中正确分配了代码段和中断向量表的地址,避免重叠。
如果使用自定义的链接脚本,需要仔细检查地址分配,确保没有冲突。

5. 调试与验证:
在修改中断向量表和代码段地址后,重新编译并调试程序,确保警告消失且功能正常。
使用调试工具(如Keil或IAR)查看内存映射,确认中断向量表和代码段的地址分配正确。

四、总结

在移植过程中,中断向量表的重叠问题是一个常见但需要仔细处理的问题。通过检查中断向量表的定义、调整地址、使用可重定位的代码段以及检查链接脚本,可以有效解决该问题。希望以上分析与解决方案能帮助您顺利完成移植工作。

如有进一步问题,欢迎继续讨论。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-15 12:06:35 | 显示全部楼层
是不是要跳这个中断,又在代码中声明了对应的中断函数导致的?
可以上传工程看看
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:37 , Processed in 0.150996 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表