bootloader中断向量表怎么重映射

[复制链接]
2398|11
 楼主| heweibig 发表于 2021-9-11 21:18 | 显示全部楼层 |阅读模式
PIC24F的片子,在bootloader程序和app程序中都有中断,那在切换到app程序中时怎么重映射中断向量表呢
juventus9554 发表于 2021-9-11 21:20 | 显示全部楼层
可以先参考一下16bit的bootloader,使用MCC可以直接选择要REMAP的中断到Applicaiton。
https://www.microchip.com/SWLibraryWeb/product.aspx?product=16-bit-Bootloader

xxrs 发表于 2021-9-11 21:22 | 显示全部楼层
也可以参考AN1157
https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en533906
 楼主| heweibig 发表于 2021-9-11 21:23 | 显示全部楼层
你可以大概讲解一下app中断向量表跳转过程吗,看AN1157我的个人理解是,bootloader的gld文件中先写好bootloader和app的中断向量表,然后在app程序中调用中断时按地址调用,一种是按void __attribute__((__interrupt__,address(0x3000 + 0x0EC),__no_auto_psv__)) _USB1Interrupt(void)调用,另一种是按void __attribute__ ((address(0x3000 + 0x0EC))) ISRTable()进行跳转的。
huangchui 发表于 2021-9-11 21:25 | 显示全部楼层
简单的理解就是bootloader将自己的IRQ向量表中要转出去的IRQ,放一个GOTO xxx汇编指令,这个xxx就是Application IRQ的入口地址,所以Bootloader需要知道Application的IRQ表的地址(MCC支持图形化配置相关的地址),这个方法并不需要改gld文件,也是新的16bit bootloader的实现方式。当然如果MCU支持AIVT也可以用直接切中断向量表,这个在application中切就可以了(https://microchipdeveloper.com/faq:2702)

下面是讲解16bit interrupt的文档可以参考。
https://microchipdeveloper.com/16bit:exceptions
http://ww1.microchip.com/downloads/en/DeviceDoc/39707a.pdf
 楼主| heweibig 发表于 2021-9-11 21:27 | 显示全部楼层
我用过切换AIVT的方法 ,但是app的中断还是没起来
huangchui 发表于 2021-9-11 21:36 | 显示全部楼层
boot的主程序是这样的:
 楼主| heweibig 发表于 2021-9-11 21:38 | 显示全部楼层
int main(void)

{

    bool Init;

    INTCON2bits.ALTIVT = 1;

    SYSTEM_Initialize();

    if(_RB5 == 1)  //button press

    {

        INTCON2bits.ALTIVT = 0;

        __asm__("goto 0x3000");

    }

    Init = Initialize();



    while(1)

    {   

        if (Init)

        ProcessCommand();

        else

        {

        }

    }

    return 1;

}
 楼主| heweibig 发表于 2021-9-11 21:40 | 显示全部楼层
在我的boot程序里导入不带中断的app程序运行是正常的
 楼主| heweibig 发表于 2021-9-11 21:43 | 显示全部楼层
换了带中断的程序就不运行了
 楼主| heweibig 发表于 2021-9-11 21:46 | 显示全部楼层

唉,还是没有什么结果,算了,多谢大家啦
semonwong 发表于 2022-7-4 10:29 | 显示全部楼层
你好,有结果了吗??我现在也是这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

869

主题

13089

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部