RTX-51 中断向量重定位问题

最近在C8051Fxxx上增加boot功能,由于boot占用的从0开始的Flash地址空间,所以应用程序也需要修改相应的起始地址。测试时,发现不带RTX-51的程序可以正常引导启动,但是包含RTX51的应用程序无法加载。于是分析编译后的map文件,发现RTX51的CODE占用了boot空间。于是打开conf_tny.A51文件,发现以下代码:
CSEG	AT	0BH 
JMP TIMERINT

于是修改定时器的中断向量为0x100BH.重新编译后还是无法正常加载。

最后在KEIL的官网找到了答案

http://www.keil.com/support/docs/1640.htm


MCU中断向量分布在复位(0x0000)以后,按规则排布,若改变编译器设置,如51,可改变程序在FLASH中的位置,可改变中断向量起始点,如改到这样0X1000,即:就是将0X0000地址内容映射到0X1000,把0X1000作为一个虚拟的复位地址,编译后,中断向量安装在0X1000后。但是,硬件跳转是不能改变的。就是说中断发生后,仍然进入以0X0000为复位地址的向量表。但是,这个向量表中,不再是直接跳转到中断服务程序,而是需要手动跳转到虚拟中断向量表,再由虚拟中断向量表跳转到中断服务程序。但是其原始向量表可能为空,所以需要加入程序判进行手动跳转到新向量表。
       所以编译的时候,将APP程序中断向量表虚拟,BOOT程序使用原始的向量表。所以任何时候中断发生后,将执行BOOT中断服务程序。在BOOT中断服务程序中判断当前程序是执行BOOT区还是APP区,如果是执行APP区,就跳转到APP中断服务程序即可(入口向量已经规则地排布在0X1000以后)。


我的做法是,boot放在Flash0x0000~0x1000.程序不使用中断,但是将APP用到的虚拟中断向量表映射。boot的STARTUP.A51虚拟中断映射如下:

?C_C51STARTUP   SEGMENT   CODE
?STACK          SEGMENT   IDATA

                RSEG    ?STACK
                DS      1

                EXTRN CODE (?C_START)
                PUBLIC  ?C_STARTUP

		CSEG    AT      0x2b
		LJMP    0x102b

		CSEG    AT      0x4b
		LJMP    0x104b

		CSEG    AT      0x23
		LJMP    0x1023

		CSEG    AT      0x1b
		LJMP    0x101b

		CSEG    AT      0x0b
		LJMP    0x100b
                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

                RSEG    ?C_C51STARTUP


APP程序,若使用了Tiny51,需要修改前面提到的conf_tny.A51,让后修改BL51Locate  的code Range 0x1000~0xFFFF。当然Startup.A51起始地址也要修改为0x1000.


  boot下载hex文件是根据编译后hex的地址写Flash。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值