|
一个任务异常挂起(有相关的定位数据),求进一步的定位方法
[复制链接]
操作系统:VxWorks,CPU:MPC860,IDE:Tornado2.0
现象:
1.程序(此程序很大有几十个任务运行)运行一段时间后异常复位,每次复位之间的时间间隔无规律,有时半个小时,有时2个小时,有时5,6个小时。
2.通过打印了解到,是由于一个任务tlongtimer被异常挂起(suspended)了,该任务1S执行一次,主要执行两个函数:A(先),B(后),即:
tlongTimer
{
A;
B;
delay(1s);
}
又由于需要,A和B两个函数都用了两个二进制信号量(Mutex1,Mutex2)与其他的函数进行互斥,即
A
{
semtake(Mutex1);
semtake(Mutex2);
..................
semGive(Mutex2);
semGive(Mutex1);
}
B
{
semtake(Mutex1);
semtake(Mutex2);
..................
semGive(Mutex2);
semGive(Mutex1);
}
这里我个人认为有必要介绍一下另外一个任务的情况:tShortTimer,10ms执行一次,它的优先级和tLongTimer一样,它主要执行一个函数C,但C只用了Mutex2与A和B进行互斥,即
C
{
semTake(Mutex2);
....
semGive(Mutex2);
}
3.当出现tlongtimer被挂起后,我用tt命令查看了它的调用栈,发现被挂起之前最后调用的函数是A的semGive,或者B的semGive,至于是semGive哪个信号量,不知道(有方法可以定位出来吗?)
4.再用ti命令查看tLongtimer的TCB信息,打印出N个(大概30多个,有什么R31,R3....,当然有SP和PC)寄存器的值(我不知道绝大部分的寄存器代表什么意思,所以无法定位,有资料可以看吗?),同时还打印出出现异常时该任务的PC地址,我用lkaddr查了一下,该地址对应的函数就是semGive。
我的问题:
收集到这些数据后,我感觉离异常的根因很近了,但又觉得很远。
1.是不是因为采用了二进制信号量?因为我看VxWorkx的帮助文档,说二进制信号量主要用于同步,而互斥信号量用于互斥,但我个人觉得二进制信号量这样用应该也可以起到互斥的作用。
2.是不是tLongtimer的堆栈信息被其他的任务或自身的函数改写了?导致信号量的ID为无效值,所以semGive失败?
定位到这里,我不知道该如何定位下去了,还需要采集其他数据吗?如何采集(用什么命令)?还有什么好的定位策略吗?
这个鸟问题烦了我10多天了,请各位大虾帮忙拯救我
|
|