|
楼主 |
发表于 2018-4-10 11:35:30
|
显示全部楼层
18就简单多了,因为中断入口是固定的。下面的isr_high就是你的高优先级中断程序
先说一下18系列中断进入的方法吧,以高优先级中断为例,当中断发生后,MCU会将PC指针强制指到0x08地址(此地址没有任何方法更改)。在0x08处只有一条汇编指令"GOTO isr_high"。执行后MCU跳转到isr_high函数所在地址,开始执行函数里的内容。
这里只说用XC8(PICC18)编译器的方法。
1.在设置了Code offset后,编译器会自动在(code offset + 0x08)处放置"GOTO isr_high",在(code offset + 0x18)处放置"GOTO_isr_low"。所以在APP中,对于中断程序也好,入口向量也好,不需要做任何更改。
2.当bootloader在FLASH最末尾时,如果又不需要上电后先执行bootloader,那其实你什么都不需要做,Code offset都不需要设置。
3.当bootloader在FLASH最开头时,因为中断入口是固定的,你必须手工加入两条跳转语句,在0x08处放置"GOTO code offset + 0x08",在0x18处放置"GOTO code offset + 0x18"。这样当中断触发时才能正常进入中断程序
我的实现方法是在0x08和0x18处建两个数组,数组内容翻译成机器码就是GOTO语句
- #define dCODE_OFFSET 0x0040 //偏移量
- //中断地址
- #define dISRH_ADD_HIGH (((dCODE_OFFSET+0x08)/2)>>8)
- #define dISRH_ADD_LOW (((dCODE_OFFSET+0x08)/2)&0xFF)
- #define dISRL_ADD_HIGH (((dCODE_OFFSET+0x18)/2)>>8)
- #define dISRL_ADD_LOW (((dCODE_OFFSET+0x18)/2)&0xFF)
- volatile const unsigned char vgotoisrh[4] __at(0x0008) = {dISRH_ADD_LOW, 0xef, dISRH_ADD_HIGH, 0xf0}; //GOTO code offset + 0x08
- volatile const unsigned char vgotoisrl[4] __at(0x0018) = {dISRL_ADD_LOW, 0xef, dISRL_ADD_HIGH, 0xf0}; //GOTO code offset + 0x18
复制代码
你的那个报错是因为改了中断入口造成的,其实是多余的。 |
|