pragma interrupt high_isr nosave详细功能解释

[复制链接]
1041|4
手机看帖
扫描二维码
随时随地手机跟帖
Latin_newday|  楼主 | 2017-10-24 16:05 | 显示全部楼层 |阅读模式
编译环境为:Mplab x IDE v3.45  编译器为:Mplab c18 v3.42
#pragma code high_vecotr=0x08//高优先级中断入口
void interrupt_at_high_vector(void)
{
_asm  GOTO high_isr  _endasm
}
#pragma code

#pragma interrupt high_isr nosave=TBLPTR, TBLPTRU, TABLAT, section("MATH_DATA"), section(".tmpdata")
void high_isr(void)
{
}

#pragma interrupt high_isr nosave=TBLPTR, TBLPTRU, TABLAT, section("MATH_DATA"), section(".tmpdata")
程序运行过程偶尔出现错误,怀疑中断影响。
在MPLAB C18 C编译器用户指南上看section(".tmpdata")为非中断函数的编译器临时变量,此处定义为nosave,怀疑有问题。
但是取消nosave后面任意字段,都无法进入高优先级中断了。

有熟悉这块的能解释下这句吗?之前用picc18都没有这个。

Latin_newday|  楼主 | 2017-10-25 10:23 | 显示全部楼层
改成#pragma interrupt high_isr都进不了高优先级中断,
貌似#pragma interrupt high_isr nosave=TBLPTR, TBLPTRU, TABLAT, section("MATH_DATA"), section(".tmpdata")是必须要的
有人能解释下吗?

使用特权

评论回复
Latin_newday|  楼主 | 2017-10-26 18:23 | 显示全部楼层
可以进高级优先级中断,由于我用CCP产生30us软件匹配中断,但是取消后面no save字段后,
CCP匹配中断标志置一到跳转到中断处理花费26us,然后中断程序再跑10us,时基溢出,结果导致匹配计时变成6.5ms
完全不符合初衷。

虽然严重怀疑no save section(".tmpdata") 不保存临时变量导致错误,但是去掉后程序完全不能正常工作,还不如之前的偶然失效。
没办法解决,到处打补丁,偶然故障依旧

使用特权

评论回复
Latin_newday|  楼主 | 2017-11-2 13:23 | 显示全部楼层
仔细看了下Maplab C18使用手册,好像是中断函数临时变量和普通函数临时变量存放在不同区域,故可以不用另外再做保存。
看来是其它的问题,先结贴吧!

使用特权

评论回复
Naig| | 2020-7-3 11:36 | 显示全部楼层
原来是这样

使用特权

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

本版积分规则

个人签名:学而时习之,不亦说乎! QQ:156725123

7

主题

238

帖子

4

粉丝