延迟任务永远不会返回

时间:2015-12-04 15:22:39

标签: scheduled-tasks real-time scheduling vxworks rtos

从shell(t2)生成的任务实例化一个新任务(tTask1)。 t2的优先级为100,tTask1的优先级为120,比t2更优惠。 t2正在运行,直到它的第一个延迟状态,并且再也没有回来,因此tTask1保持暂停状态并且无法再次恢复。我找不到导致问题的原因。这是我的代码:

include "vxWorks.h"
#include <iostream.h>
#include "taskLib.h"
#include "sysLib.h"


VX_TASK(tTask1,20000);
int tickCount = 0;
int oldTickValue = 0;

#define SCHEDULER_ERROR -1
#define SCHEDULER_WORKING 0


void subTask()
{
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        std::cout << "sub Task " << i << std::endl;
    }
}

bool isTickChanged() {
    uint32_t newTickValue;
    bool flag;
    flag = false;
    newTickValue = tickCount;
    std::cout << "newTickValue = " << newTickValue << std::endl;
    if (newTickValue != oldTickValue)
    {
        if (1U < (newTickValue - oldTickValue))
        {
            std::cout << "scheduler error = " << newTickValue << std::endl;
        }
        else
        {
            std::cout << "scheduler is working = " << newTickValue << std::endl;
        }

        flag = true;
        oldTickValue = newTickValue; 
    }
    return flag;
}

void timerHandler()
{
    ++tickCount;
}

void task1()
{
    std::cout << "task 1 begin" << std::endl;
    sysAuxClkEnable();
    sysAuxClkRateSet(10);            
    sysClkConnect( reinterpret_cast<FUNCPTR>(timerHandler), NULL );
    std::cout << "Aux Clock Rate = " <<  sysAuxClkRateGet( ) << std::endl;

    while(1)
    {
        if (isTickChanged())
        {               
            std::cout << "task 1 tick changed" << std::endl;
            subTask();
            taskSuspend(0);
        }

    }
}

void sch(void)
{
    int myTaskId;
    myTaskId = VX_TASK_INSTANTIATE(tTask1, 120,  VX_FP_TASK|VX_SUPERVISOR_MODE|VX_DEALLOC_STACK|VX_STDIO|VX_DEALLOC_EXC_STACK|VX_DEALLOC_TCB|VX_SPE_TASK, 20000, (FUNCPTR) task1, 0,0,0,0,0,0,0,0,0,0);
    FOREVER {
        taskResume(myTaskId);
        taskDelay(10);
    }


}

和输出如下:

-> sp sch
Task spawned: id = 0x1897c00, name = t2
value = 25787392 = 0x1897c00
-> task 1 begin
Aux Clock Rate = 10
newTickValue = 0
newTickValue = 0
newTickValue = 0
newTickValue = 0
newTickValue = 0
newTickValue = 0
newTickValue = 0
newTickValue = 0
newTickValue = 1
scheduler working = 1
task 1 tick changed
sub Task 0
sub Task 1
sub Task 2

t2正处于“延迟”状态,tTask1正处于“暂停”状态。

1 个答案:

答案 0 :(得分:1)

与OS定时器相关的函数(例如taskDelay())要求内核注意到计时器滴答。如果内核没有获得这些滴答通知,则内核无法做任何与时间相关的事情。使用VxWorks,我相信你应该调用tickAnnounce()以通知内核一个tick。

但是在task1()函数中,调用sysClkConnect()并注册timerHandler()例程。 timerHandler()只增加你的应用程序的tickCount,它不会通知内核的tick。因此,内核无法知道发生了勾号,因此无法跟踪时间,taskDelay()函数也无法正常工作。

我猜你可以从你的timerHandler()例程调用tickAnnounce(),这可能会解决问题。但是对我来说,你正在用你的应用程序替换系统tick处理程序似乎很奇怪。你的应用程序不应该使用另一个计时器,或者操作系统提供的软件计时器服务,而不是重新利用系统时钟吗?