延迟任务永远不会 returns 返回
Delayed task never returns back
从 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 处于"delayed" 状态等待,tTask1 处于"suspended" 状态等待。
OS 定时器相关函数,例如 taskDelay(),要求内核获得定时器滴答的通知。如果内核没有收到这些滴答通知,它就不能做任何与时间相关的事情。使用 VxWorks,我相信你应该调用 tickAnnounce() 来通知内核一个 tick。
但是在您的 task1() 函数中,您调用了 sysClkConnect() 并注册了您的 timerHandler() 例程。 timerHandler() 只会增加应用程序的 tickCount,它不会将滴答通知给内核。所以内核无法知道节拍的发生,因此它将无法跟踪时间并且 taskDelay() 函数将无法工作。
我想您可以从 timerHandler() 例程中调用 tickAnnounce(),这可能会解决问题。但对我来说,您正在用您的应用程序的某些东西替换系统滴答处理程序似乎很奇怪。您的应用程序不应该使用另一个计时器,或者 OS 提供的软件计时器服务,而不是重新利用系统时钟吗?
从 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 处于"delayed" 状态等待,tTask1 处于"suspended" 状态等待。
OS 定时器相关函数,例如 taskDelay(),要求内核获得定时器滴答的通知。如果内核没有收到这些滴答通知,它就不能做任何与时间相关的事情。使用 VxWorks,我相信你应该调用 tickAnnounce() 来通知内核一个 tick。
但是在您的 task1() 函数中,您调用了 sysClkConnect() 并注册了您的 timerHandler() 例程。 timerHandler() 只会增加应用程序的 tickCount,它不会将滴答通知给内核。所以内核无法知道节拍的发生,因此它将无法跟踪时间并且 taskDelay() 函数将无法工作。
我想您可以从 timerHandler() 例程中调用 tickAnnounce(),这可能会解决问题。但对我来说,您正在用您的应用程序的某些东西替换系统滴答处理程序似乎很奇怪。您的应用程序不应该使用另一个计时器,或者 OS 提供的软件计时器服务,而不是重新利用系统时钟吗?