网络回答1:
看看英文版的24H编译器用户手册吧。。。
PSV是一个不超过32K的由编译器管理的程序空间,其实就是在程序空间存放一些只读的CONSTANT数据,用户代码要通过特定的PSV寄存器来间接访问它们。
比如:const int __attribute__((space(auto_psv))) var_pav_sample = 0x30;
auto_psv会使能编译器准备这些额外的代码,以满足用户的PSV数据访问需求。
对一般用户设计程序而言,中断程序必须指明是否需要编译器准备这部分代码,负责默认情况下编译器会增加psv访问的代码段,同时提醒用户确定使用auto_psv还是no_auto_psv,一般给中断程序指定no_auto_psv,一定要使用某些只读的数据,也可以提前在RAM里准备好,毕竟中断程序的应答能力和效率是首要的。
网络回答2:
dsPIC30F6014中断问题
2010-11-11 09:15
中断服务程序如下:
void __attribute__((__interrupt__)) _T1Interrupt (void)
{
IFS0bits.T1IF = 0;
......
}
当使用MPLAB C30的2.04 版本编译时,没有任何警告信息。
但使用MPLAB C30的3.00 版本编译时,显示警告信息如下:
SinusoidalBLDC.c: In function '_T1Interrupt':
SinusoidalBLDC.c:159: warning: PSV model not specified for '_T1Interrupt';
assuming 'auto_psv' this may affect latency
且该警告影响了程序的正常运行,请大虾们指点是怎么回事,该怎么修改?
你可以看一下MPLAB C30 3.00 版本的released notes
void __attribute__((__interrupt__,auto_psv)) _T1Interrupt (void)
{
IFS0bits.T1IF = 0;
......
}
加上“,auto_psv”,果然好了。
参考C30 release notes 第7部分 Migrating to Version 3.00。
说明:随着可管理的PSV 指针和CodeGuard PSV 常量部分的引入,ISRs不再认为PSVPAG默认设置。为此引入了两个属性(attribute)auto_psv 和 no_auto_psv,以便在中断函数里使能或禁止 PSVPAG管理。如果ISR 引用了const 变量或字符串常量(字符串常量在程序空间里),则应当加上auto_psv 属性,例如:
void __attribute__((interrupt, auto_psv)) myISR()
{
/* This function can reference const variables and
string literals with the constants-in-code memory model. */
}
而no_auto_psv 属性则用于指明ISR不引用auto_psv 常量.
如果没有指明两种属性中的任何一种,C30 将采用auto_psv并插入必要的指令以确保运行时正确的操作。同时也会给出一个警告信息,例如:
warning: PSV model not specified for '_T1Interrupt';
assuming 'auto_psv' this may affect latency
这主要是提醒程序员通过指定no_auto_psv属性以缩短中断响应时间。 |