从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正处于“暂停”状态。
答案 0 :(得分:1)
与OS定时器相关的函数(例如taskDelay())要求内核注意到计时器滴答。如果内核没有获得这些滴答通知,则内核无法做任何与时间相关的事情。使用VxWorks,我相信你应该调用tickAnnounce()以通知内核一个tick。
但是在task1()函数中,调用sysClkConnect()并注册timerHandler()例程。 timerHandler()只增加你的应用程序的tickCount,它不会通知内核的tick。因此,内核无法知道发生了勾号,因此无法跟踪时间,taskDelay()函数也无法正常工作。
我猜你可以从你的timerHandler()例程调用tickAnnounce(),这可能会解决问题。但是对我来说,你正在用你的应用程序替换系统tick处理程序似乎很奇怪。你的应用程序不应该使用另一个计时器,或者操作系统提供的软件计时器服务,而不是重新利用系统时钟吗?