2015-12-04 3 views
0

Задача, порожденная оболочкой (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

Функции, связанные с таймером OS, такие как taskDelay(), требуют, чтобы ядро ​​получало уведомление о таймере. Ядро не может делать ничего связанного, если оно не получает эти уведомления о тике. С VxWorks я считаю, что вы должны позвонить tickAnnounce(), чтобы уведомить ядро ​​тика.

Но в вашей функции task1() вы вызываете sysClkConnect() и регистрируете процедуру timerHandler(). timerHandler() только увеличивает tickCount вашего приложения и не уведомляет ядро ​​галочки. Таким образом, ядро ​​не может знать, что галочка произошла, поэтому он не сможет отслеживать время, а функция taskDelay() не будет работать.

Я думаю, вы могли бы вызвать tickAnnounce() из вашей процедуры timerHandler(), и это может решить проблему. Но мне кажется странным, что вы заменяете обработчик тика системы чем-то для своего приложения. Должно ли ваше приложение использовать другой таймер или, возможно, службу таймера программного обеспечения, предоставляемую ОС, вместо того, чтобы повторно использовать системные часы?

+0

Хорошо, я сейчас пытаюсь. Я хочу использовать вспомогательные часы, потому что я буду запускать их с высокой скоростью. – zontragon

+0

Хорошо, я вижу проблему сейчас. Я использовал sysClkConnect вместо sysAuxClkConnect. Большое спасибо. – zontragon

Смежные вопросы