|
我是在飞思卡尔S12XE系列下进行移植到,移植后测试也通过了。第一天在里面加了1个写SD卡的任务(30秒)和1个Mobus的任务(从机),跑了一晚也都能正常运行;
第二天再加上了2个Can发送到任务,一个100ms,一个200ms,这次跑了1个小时多点就挂掉了;以为是can发送到问题,第二天晚上只开写SD卡和2个发送任务,也能够运行一晚上。第三天就又全开用仿真器一直仿,发现停下来的时候SP指针居然在中断向量表段;又仿了一次,发现SP指针跑到未使用的ROM空间去了。也就是说跑飞了,而且是Modbus造成的,可能跟它用的中断有关。分析了好几天也想不出问题出在哪里,还请前辈们多指点下,谢谢了!!
程序中我在Modbus用到3个中断,一个串口,1个1.5ms的时钟,1个3.5ms 的时钟,这两个时钟只在串口中断里面打开,然后进中断后会关闭。串口中断和1.5ms中断中没进行任何处理(也试过在这两个中断中加上 OSIntEnter(),但坚持时间更短),3.5ms的中断如下
#pragma CODE_SEG __NEAR_SEG NON_BANKED
#pragma NO_RETURN
void interrupt 67 Inter_T35(void) {
// #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// OS_CPU_SR cpu_sr;
//#endif
#ifdef BANKED
asm
{
ldaa PPAGE; //save ppage to stack PPAGE->A
psha; /*出栈,A->SP*/
}
#endif
//DisableInterrupts;
OSIntEnter();
OS_SAVE_SP();
PITTF_PTF1=1; // clear channel 1 flag
PITCE_PCE1=0;
PITINTE_PINTE1=0;
// OS_ENTER_CRITICAL();
这里是一个任务处理函数,里面有OSSemPost(Modbus_OKptr)给Modbus任务用
// OS_EXIT_CRITICAL();
OSIntExit();
//EnableInterrupts;
asm
{
#ifdef BANKED
pula; /*SP->A*/
staa PPAGE; /* restore ppage from stack ,A->PPAGE*/
nop;
#endif
rti; /*interrupt return*/
}
|
|