[STM8]

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

[复制链接]
12067|27
手机看帖
扫描二维码
随时随地手机跟帖
dadodo|  楼主 | 2010-7-31 13:22 | 显示全部楼层 |阅读模式
网上看的例子是COSMIC下的,不知道IAR怎么搞。
香水城| | 2010-7-31 13:25 | 显示全部楼层
STM8还能重定位中断向量表?

使用特权

评论回复
stm8s103| | 2010-7-31 13:52 | 显示全部楼层
dadodo|  楼主 | 2010-7-31 14:01 | 显示全部楼层
楼上,不是写中断服务程序。
看下面的图就明白想要做什么了,呵呵。
未命名.jpg

使用特权

评论回复
香水城| | 2010-7-31 17:25 | 显示全部楼层
4楼这张图哪里来的?

使用特权

评论回复
dadodo|  楼主 | 2010-7-31 18:30 | 显示全部楼层
香主也不知道图的来路?ST官方的啊
只是官方资料给的例子是COSMIC下的,想在IAR用,不知道怎么做

使用特权

评论回复
dadodo|  楼主 | 2010-7-31 18:39 | 显示全部楼层
本帖最后由 dadodo 于 2010-7-31 18:40 编辑

下面是例子的代码,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 */
};

使用特权

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

使用特权

评论回复
香水城| | 2010-7-31 23:10 | 显示全部楼层
本帖最后由 香水城 于 2010-7-31 23:11 编辑
香主也不知道图的来路?ST官方的啊
只是官方资料给的例子是COSMIC下的,想在IAR用,不知道怎么做
dadodo 发表于 2010-7-31 18:30


我不可能看过所有文档,更何况你断章取义呢,:lol

官方的?那份文档?

使用特权

评论回复
crazybee| | 2010-8-1 11:11 | 显示全部楼层
是这个文档:AN2659  STM8 in-application programming (IAP) using a customized user-bootloader

对了香版主
:04 0000 05 0000B191B5

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

使用特权

评论回复
crazybee| | 2010-8-1 22:35 | 显示全部楼层
:( 这个也算不是中断向量重新映射,是模拟方案而已!呵呵!上面的问题哪位知道的也说说啊!

使用特权

评论回复
香水城| | 2010-8-1 22:37 | 显示全部楼层
我就说4楼是断章取义嘛,为什么你只看图而不看有关的说明:
AN2659_Vector_Redir.GIF

使用特权

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

使用特权

评论回复
crazybee| | 2010-8-2 16:38 | 显示全部楼层
修改对应LINK文件就可以实现,具体看一下IAR的手册!

使用特权

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


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

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

使用特权

评论回复
dadodo|  楼主 | 2010-8-3 01:24 | 显示全部楼层
晕,要问的是如何生成中断向量表,结果却问如何重定位中断向量表,差太远了,:L

生成包含了从主中断跳转至应用程序的中断向量表,这个很容易,只需要在你的Bootloader项目中,在中断向量表中填写绝对地址即可, ...
香水城 发表于 2010-8-2 16:45


IAR中在哪里填写绝对地址?IAR跟STM8一起开始学的,还没用熟,请香主指点。

使用特权

评论回复
dadodo|  楼主 | 2010-8-3 01:26 | 显示全部楼层
修改对应LINK文件就可以实现,具体看一下IAR的手册!
crazybee 发表于 2010-8-2 16:38


修改LINK文件是移动整个中断向量表在ROM中的地址,而中断向量表中的跳转地址还是编译器自动分配的。

使用特权

评论回复
crazybee| | 2010-8-3 12:44 | 显示全部楼层
晕,手册没有去看了吧,呵呵,  “而不需要让编译器自动分配” 这个香版主已经说明了吧,不过LINK有个BUG,我已经给IAR发过EMAIL了,回复已经确定了是BUG,说一下版本修正!

使用特权

评论回复
dadodo|  楼主 | 2010-8-3 14:51 | 显示全部楼层
楼上,你遇到的是哪个bug?

使用特权

评论回复
crazybee| | 2010-8-3 16:03 | 显示全部楼层
不影响,你使用的啊!

使用特权

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

本版积分规则

29

主题

1286

帖子

5

粉丝