发新帖我要提问
12
返回列表
打印
[STM8]

怎样在IAR里重定位中断向量表?

[复制链接]
楼主: dadodo
手机看帖
扫描二维码
随时随地手机跟帖
21
dadodo|  楼主 | 2010-8-3 18:42 | 只看该作者 回帖奖励 |倒序浏览
都当宝贝似的藏着啊

使用特权

评论回复
22
crazybee| | 2010-8-4 10:10 | 只看该作者
23
crazybee| | 2010-8-4 10:11 | 只看该作者
IAR中如何在C程序中定义section,以及在icf中初始化段

使用特权

评论回复
24
liuxiaoyun1210| | 2012-7-13 15:07 | 只看该作者
18# crazybee 修改LINK中的icf文件,将Rom地址从0x8000改成0x9000,
define region NearFuncCode = [from 0x9000 to 0x9FFF];
define region FarFuncCode = [from 0x9000 to 0x9FFF];
define region HugeFuncCode = [from 0x9000 to 0x9FFF];
这样重定位中断向量表就可以吗?

使用特权

评论回复
25
lillian999| | 2015-12-24 18:11 | 只看该作者
香水城 发表于 2010-8-2 16:45
晕,要问的是如何生成中断向量表,结果却问如何重定位中断向量表,差太远了,

生成包含了从主中断跳 ...

“只需要在你的Bootloader项目中,在中断向量表中填写绝对地址即可,而不需要让编译器自动分配”,请问这个具体怎么实现的,在哪里修改?有没有官方demo。我现在用的是STM32F411.多谢!

使用特权

评论回复
26
mintspring| | 2015-12-24 21:31 | 只看该作者
把bootLoader放在0000开始的扇区,并截获所有中断和跳转,然后每次开机启动都会先运行BootLoader,BootLoader先校验程序区是否正确,如果正确,则转到程序区运行,在程序区里重新开辟一个中断向量表,Bootloader里面截获的

使用特权

评论回复
27
mintspring| | 2015-12-24 21:32 | 只看该作者
A:BOOT 项目里操作:
1.把BOOT程序跟应用程序分两个项目编写
2.在BOOT程序里最重要的是中断向量表重定向,icf文件就不用设置了(BOOT里不能开中断)
中断向量表重定向设置方法代码如下:
__root const long reintvec[]@".intvec"=
{ 0x82008080,0x82009004,0x82009008,0x8200900c, //当应用程序地址不是0x9000时则要相应改掉除第一个0x82008080以外的数值
0x82009010,0x82009014,0x82009018,0x8200901c,
0x82009020,0x82009024,0x82009028,0x8200902c,
0x82009030,0x82009034,0x82009038,0x8200903c,
0x82009040,0x82009044,0x82009048,0x8200904c,
0x82009050,0x82009054,0x82009058,0x8200905c,
0x82009060,0x82009064,0x82009068,0x8200906c,
0x82009070,0x82009074,0x82009078,0x8200907c,
};
3.然后BOOT程序的跟一般程序一样编写通信协议及FLASH操作代码就行了,还有一点要记住,BOOT程序里不要开中断哦!
这种方法缺点就是会浪费约128个字节的FLASH空间,如果有高手能把这些空间省下来,请指点哦!
B:应用程序项目里操作:
在应用程序项目里必须在icf文件修改,修改如下:
把下面三行
define region NearFuncCode = [from 0x8000 to 0xFFFF];
define region FarFuncCode = [from 0x8000 to 0xFFFF];
define region HugeFuncCode = [from 0x8000 to 0xFFFF];
改为
define region NearFuncCode = [from 0x9000 to 0xFFFF];
define region FarFuncCode = [from 0x9000 to 0xFFFF];
define region HugeFuncCode = [from 0x9000 to 0xFFFF];
就可以了,应用程序就可以开中断了,IAP就是这么简单吧!
当然我这里是用0x9000地址作为应用程序区的首地址,至于各位BOOT大小是多小就按不同的数值设置
但是必须记得在BOOT的中断向量重定向表也必须要相应修改哦!
解析下BOOT重定向表内的0x82008080为什么是这个数值:因为重定向表跟中断表重叠了,编译器就先分配重定向表,在接着的地址0x008080处,
再分配一份中断向量表,所以其实是两份中断向量表,所以BOOT重定向表内的0x82008080就是为了要跳到真正的BOOT程序入口,
因为在0x8080处才是真正跳转到__iar_program_start入口。

使用特权

评论回复
28
天灵灵地灵灵| | 2015-12-24 22:42 | 只看该作者
需要在编译器的target opition---tagret下修改内部RAM的起始地址

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则