21530|24

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怎样在IAR里重定位中断向量表? [复制链接]

                                 网上看的例子是COSMIC下的,不知道IAR怎么搞。
此帖出自stm32/stm8论坛

最新回复

向量表当然可以映射了,你可以定义链接控制文件stm32f10x_flash.icf文件。如下是在IAR下的链接文件 /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000;             //这个地方就是向量表的位置,修改这个地方也可以重定向向量表。不过也要注意地址范围啊!! /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;  //ROM起始地址 define symbol __ICFEDIT_region_ROM_end__   = 0x080FFFFF;  //ROM结束地址 define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;  //RAM起始地址 define symbol __ICFEDIT_region_RAM_end__   = 0x20017FFF;  //RAM结束地址 /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400;  //栈大小 。 define symbol __ICFEDIT_size_heap__   = 0x200;  //堆大小 /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__]; define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__]; define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };  //这里要注意CSTACK在启动文件中也有说它是栈段。你可以查看一下。对齐是8字节 define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { }; initialize by copy { readwrite }; do not initialize  { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region   { readonly }; place in RAM_region   { readwrite,                         block CSTACK, block HEAP };  详情 回复 发表于 2013-4-13 22:03
点赞 关注
 

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 STM8还能重定位中断向量表?
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼上,不是写中断服务程序。
看下面的图就明白想要做什么了,呵呵。
未命名.jpg
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 4楼这张图哪里来的?
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
版主也不知道图的来路?ST官方的啊
只是官方资料给的例子是COSMIC下的,想在IAR用,不知道怎么做
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 


下面是例子的代码,MAIN_USER_RESET_ADDR是常量0x9000ul,这样中断向量被重定位到0x9000开始的地方。
这段代码应该和编译器直接有关,所以想知道IAR怎么实现同样的功能。

/*        Redirected interrupt vector table
*        Copyright (c) 2008 STMicroelectronics
*/

#include "main.h"

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
        unsigned char interrupt_instruction;
        interrupt_handler_t interrupt_handler;
};

@far @interrupt void NonHandledInterrupt (void)
{
        /* in order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction
        */
        return;
}

extern void _stext();     /* startup routine */
struct interrupt_vector const UserISR_IRQ[32] @ MAIN_USER_RESET_ADDR;

//redirected interrupt table
struct interrupt_vector const _vectab[] = {
    {0x82, (interrupt_handler_t)_stext}, /* reset */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 1)}, /* trap  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 2)}, /* irq0  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 3)}, /* irq1  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 4)}, /* irq2  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 5)}, /* irq3  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 6)}, /* irq4  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 7)}, /* irq5  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 8)}, /* irq6  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+ 9)}, /* irq7  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+10)}, /* irq8  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+11)}, /* irq9  */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+12)}, /* irq10 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+13)}, /* irq11 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+14)}, /* irq12 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+15)}, /* irq13 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+16)}, /* irq14 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+17)}, /* irq15 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+18)}, /* irq16 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+19)}, /* irq17 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+20)}, /* irq18 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+21)}, /* irq19 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+22)}, /* irq20 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+23)}, /* irq21 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+24)}, /* irq22 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+25)}, /* irq23 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+26)}, /* irq24 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+27)}, /* irq25 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+28)}, /* irq26 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+29)}, /* irq27 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+30)}, /* irq28 */
    {0x82, (interrupt_handler_t)(UserISR_IRQ+31)}, /* irq29 */
};
此帖出自stm32/stm8论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

8
 
今天用了一个笨办法来测试自编bootloader。
先在IAR下创建2个工程bootldr和main。
bootldr程序执行完所需bootloader代码后,跳转至0x9000,工程按默认方式编译,ROM开始地址0x8000。
main是主应用程序,编译时设定ROM开始地址为0x9000。
然后就是笨办法来了,手工修改bootldr的hex文件中0x8004-0x807F的中断向量表,比如0x8004处跳转至0x9004,全部修改完成后将bootldr和main两个hex文件一起烧入芯片,运行一下看看结果,很正常,哈哈,自编的bootloader成功啦
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
版主也不知道图的来路?ST官方的啊
只是官方资料给的例子是COSMIC下的,想在IAR用,不知道怎么做
dadodo 发表于 2010-7-31 18:30

官方的?那份文档?
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
是这个文档:AN2659  STM8 in-application programming (IAP) using a customized user-bootloader

对了版主主
:04 0000 05 0000B191B5

这个是IARSTM8 输出的HEX文件最后部分,请问 05 这里指什么意思呢? 查了HEX格式资料说是“开始线性地址” 不知道在这里是什么意思?
此帖出自stm32/stm8论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                  这个也算不是中断向量重新映射,是模拟方案而已!呵呵!上面的问题哪位知道的也说说啊!
此帖出自stm32/stm8论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

12
 
我就说4楼是断章取义嘛,为什么你只看图而不看有关的说明:

AN2659_Vector_Redir.GIF (30.26 KB)

AN2659_Vector_Redir.GIF

此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
上面那些我都看过了,可能我问题没说清楚,我的意思是在IAR里如何设置或程序中怎么处理才能编译生成包含了从主中断跳转至应用程序的中断向量表。
在8楼我已实现了自编bootloader的功能,但那是手工修改hex文件的结果。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 修改对应LINK文件就可以实现,具体看一下IAR的手册!
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

15
 
上面那些我都看过了,可能我问题没说清楚,我的意思是在IAR里如何设置或程序中怎么处理才能编译生成包含了从主中断跳转至应用程序的中断向量表。
在8楼我已实现了自编bootloader的功能,但那是手工修改hex文件的结果 ...
dadodo 发表于 2010-8-2 00:50

生成包含了从主中断跳转至应用程序的中断向量表,这个很容易,只需要在你的Bootloader项目中,在中断向量表中填写绝对地址即可,而不需要让编译器自动分配。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

16
 
晕,要问的是如何生成中断向量表,结果却问如何重定位中断向量表,差太远了,

生成包含了从主中断跳转至应用程序的中断向量表,这个很容易,只需要在你的Bootloader项目中,在中断向量表中填写绝对地址即可, ...
IAR中在哪里填写绝对地址?IAR跟STM8一起开始学的,还没用熟,请版主指点。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

17
 
修改对应LINK文件就可以实现,具体看一下IAR的手册!
修改LINK文件是移动整个中断向量表在ROM中的地址,而中断向量表中的跳转地址还是编译器自动分配的。
此帖出自stm32/stm8论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

18
 
                                 晕,手册没有去看了吧,呵呵,  “而不需要让编译器自动分配” 这个版主主已经说明了吧,不过LINK有个BUG,我已经给IAR发过EMAIL了,回复已经确定了是BUG,说一下版本修正!
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 楼上,你遇到的是哪个bug?
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

20
 
                                 不影响,你使用的啊!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后2天:ADI 超低功耗 MCU MAX326xx 系列介绍
直播时间:3月20日(本周四) 上午10:00
活动奖励:双肩包、充电宝、小夜灯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表