小弟遇到一个棘手的问题,希望各位大侠给点意见。谢谢。
使用LPC2478芯片,UC/OS 2系统。目前有两个task不能同步。暂时名为TASK1和TASK2吧。简要代码及功能描述如下:
ucos() /*主函数,开task1和task2,其中task1的优先级比task2要高,两者的堆栈都是512*/
{
check_process_semp = OSMutexCreate(6,&err); /*互斥锁优先级比task1和task2都高*/
OSTaskCreateExt(TASK1,
(void *)0,
&TASK1_STACK[TASK1_STACK_SIZE-1],
TASK1_PRIO,
TASK1_ID,
&TASK1_STACK[0],
TASK1_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK2,
(void *)0,
&TASK2_STACK[TASKG_STACK_SIZE-1],
TASK2_PRIO,
TASK2_ID,
&TASK2_STACK[0],
TASK2_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
task1
{
while(1)
{
OSMutexPend(check_process_semp,0,&c_p_err); /*请求互斥锁*/
check_process(); /*共享资源*/
OSMutexPost(check_process_semp); /*释放互斥锁*/
OSTimeDly(2000); /*10秒*/
}
}
task2
{
while(1)
{
OSMutexPend(check_process_semp,0,&c_p_err); /*请求互斥锁*/
other_process(); /*另一个函数*/
check_process(); /*共享资源*/
OSMutexPost(check_process_semp); /*释放互斥锁*/
OSTimeDly(2000);
}
}
TASK1的作用是每个一段时间检查一次共享资源的状态,task2的作用是更新共享资源,在更改完成后,检查一次共享资源的状态。
other_process为更新共享资源函数,check_process()程序为检查共享资源状态的。两个函数都存在从串口中读数据,从rtc(中断方式)取当前时间的过程。
目前
1. 单个task运行时(堆栈为512),可以连续运行数个小时(>=5)不出任何问题。
2. 当两个task同时运行时(堆栈为512),先task1运行一次,然后task2运行一次,接着axd在 “PrefetchAbort B”死掉。
3. 如果将两个task的堆栈改为5120(扩大十倍),两个task可以运行1-2个小时(task1-task2-task1交替运行),然后在“PrefetchAbort B”死掉。
请各位大侠出出主意,应该从哪个方面入手调试呢?是检查task1 task2内的指针是不是越界了,还是检查什么别的?
这是小弟发的第一个贴,打包票给分,请大家别被结贴率0%吓到。