2

我一直在从事一些 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);
    }
}
4

2 回答 2

2

两个任务都在一个信号量上等待,但不清楚该信号量最初是在哪里给出的。似乎这两个任务都不会从OSSemPend调用中返回。

于 2014-08-09T19:44:25.667 回答
1

在您的代码中的某处,在创建之前AppTask1AppTask2创建之前,您应该有这样一行代码:

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 */
}
于 2014-08-09T21:02:08.343 回答