我一直在研究一些RTOS MicroC项目,每当我实现某些功能时,它在任务之外工作得很好,但每当我完成任务时它就不会做任何事情。我知道我可能无法得到答案,但任何提示从哪里开始寻找将是一个很大的帮助,提前谢谢。
a_sem = OSSemCreate(1);
static void AppTask1(void *p_arg)
{
(void) p_arg;
INT8U perr;
while (1)
{
OSSemPend(a_sem, 0, &perr);
planeAngles();// Functon that works outside the task
OSSemPost(a_sem);
OSTimeDly(OS_TICKS_PER_SEC/20);
}
}
static void AppTask2(void *p_arg)
{
(void) p_arg;
INT8U perr;
while (1)
{
OSSemPend(a_sem, 0, &perr);
servoTurns(); // Functon that works outside the task
OSSemPost(a_sem);
OSTimeDly(OS_TICKS_PER_SEC/20);
}
}
答案 0 :(得分:2)
两个任务都在等待信号量,但不清楚信号量最初是 给出的位置。似乎任何任务都不会从OSSemPend
调用返回。
答案 1 :(得分:1)
代码中的某处,在创建AppTask1
和AppTask2
之前,您应该有一行代码:
OSSemCreate(a_sem, 1, &perr);
您正在创建一个信号量a_sem
,其初始值为1
,因此调用OSSemPend
的第一个任务将成功获取信号量。
此外,你不应该永远阻止OSSemPend
。等待一段时间,然后检查错误状态:
OSSemPend(a_sem, 10, &perr);
if(perr == OS_ERR_NONE)
{
/* You have the semaphore */
}
else
{
/* Error! Maybe a timeout */
}