Задача, порожденная оболочкой (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 ждет в «подвешенном» состоянии.
Хорошо, я сейчас пытаюсь. Я хочу использовать вспомогательные часы, потому что я буду запускать их с высокой скоростью. – zontragon
Хорошо, я вижу проблему сейчас. Я использовал sysClkConnect вместо sysAuxClkConnect. Большое спасибо. – zontragon