首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RTOS MicroC任务

RTOS MicroC任务
EN

Stack Overflow用户
提问于 2014-08-10 02:53:51
回答 2查看 240关注 0票数 2

我一直在做一些实时操作系统MicroC项目,当我实现了一些函数时,它在任务外工作得很好,但每当我放入任务时,它就什么也做不了。我知道我可能不会得到这个问题的答案,但任何从哪里开始寻找的提示都会有很大的帮助,提前谢谢。

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-08-10 03:44:26

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

票数 2
EN

Stack Overflow用户

发布于 2014-08-10 05:02:08

在代码中的某处,在创建AppTask1AppTask2之前,您应该有一行如下所示的代码:

代码语言:javascript
复制
OSSemCreate(a_sem, 1, &perr);

您正在创建一个初始值为1的信号量a_sem,以便第一个调用OSSemPend的任务将成功获取该信号量。

此外,你不应该永远在OSSemPend上阻塞。请稍等片刻,然后检查错误状态:

代码语言:javascript
复制
OSSemPend(a_sem, 10, &perr);
if(perr == OS_ERR_NONE)
{
    /* You have the semaphore */
}
else
{
    /* Error! Maybe a timeout */
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25221941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档