nrk_status_t nrk_activate_task (nrk_task_type * Task) { uint8_t rtype; void *topOfStackPtr; topOfStackPtr = (void *) nrk_task_stk_init (Task->task, Task->Ptos, Task->Pbos); //printf("activate %d\n",(int)Task->task_ID); // printNum(Task->prio); // printNum(Task->preemption_level); if (Task->FirstActivation == TRUE) { rtype = nrk_TCB_init (Task, topOfStackPtr, Task->Pbos, 0, (void *) 0, 0); Task->FirstActivation = FALSE; } else { if (nrk_task_TCB[Task->task_ID].task_state != SUSPENDED) return NRK_ERROR; //Re-init some parts of TCB nrk_task_TCB[Task->task_ID].OSTaskStkPtr = (NRK_STK *) topOfStackPtr; } //nrk_task_TCB[Task->task_ID].task_state = READY; // Remove from suspended or waiting if extended // OSSchedLock(); // If Idle Task then Add to ready Q //if(Task->task_ID==0) nrk_add_to_readyQ(Task->task_ID); //nrk_add_to_readyQ(Task->task_ID); //printf( "task %d nw %d \r\n",Task->task_ID,nrk_task_TCB[Task->task_ID].next_wakeup); //printf( "task %d nw %d \r\n",Task->task_ID,Task->offset.secs); if (nrk_task_TCB[Task->task_ID].next_wakeup == 0) { nrk_task_TCB[Task->task_ID].task_state = READY; nrk_add_to_readyQ (Task->task_ID); } return NRK_OK; }
nrk_status_t nrk_activate_task(nrk_task_type * Task) { uint8_t rtype; NRK_TCB *tempTCB; void *topOfStackPtr; nrk_queue *curNode; nrk_queue *newNode;//////////// = malloc(sizeof(nrk_queue)); nrk_int_disable(); topOfStackPtr = (void *) nrk_task_stk_init (Task->task, Task->Ptos, Task->Pbos); //printf("activate %d\n",(int)(Task->task_ID)); if (Task->FirstActivation == TRUE) { rtype = nrk_TCB_init(Task, topOfStackPtr, Task->Pbos, 0, (void *) 0, 0); Task->FirstActivation = FALSE; tempTCB = Task->taskTCB; } else { //////// if (nrk_task_TCB[Task->task_ID].task_state != SUSPENDED) //////// return NRK_ERROR; //////// //Re-init some parts of TCB //////// nrk_task_TCB[Task->task_ID].OSTaskStkPtr = (NRK_STK *) topOfStackPtr; tempTCB = Task->taskTCB; if ((tempTCB->task_state != SUSPENDED)||(tempTCB==NULL)) return NRK_ERROR; //Re-init some parts of TCB tempTCB->OSTaskStkPtr = (NRK_STK *) topOfStackPtr; } //nrk_task_TCB[Task->task_ID].task_state = READY; // Remove from suspended or waiting if extended // OSSchedLock(); // If Idle Task then Add to ready Q //if(Task->task_ID==0) nrk_add_to_readyQ(Task->task_ID); //nrk_add_to_readyQ(Task->task_ID); //printf( "task %d nw %d \r\n",Task->task_ID,nrk_task_TCB[Task->task_ID].next_wakeup); //printf( "task %d nw %d \r\n",Task->task_ID,Task->offset.secs); //Paja: in CS - check //inserting new node in ready_queue if (Task->Type!=IDLE_TASK) { //paja nrk_int_disable(); curNode = _free_node; newNode=&mallocQueue[tasksNumber-2]; //malloc simulation newNode->Next = NULL; if (_free_node==NULL) { //paja:check _free_node = newNode; newNode->Prev = NULL; } else { while (curNode->Next != NULL) curNode = curNode->Next; curNode->Next = newNode; newNode->Prev = curNode; } //paja nrk_int_enable(); } ////////////// if (nrk_task_TCB[Task->task_ID].next_wakeup == 0) { ////////////// nrk_task_TCB[Task->task_ID].task_state = READY; ////////////// nrk_add_to_readyQ (Task->task_ID); ////////////// } if (tempTCB->next_wakeup == 0) { tempTCB->task_state = READY; nrk_add_to_readyQ(Task->task_ID, tempTCB); //PAJA } nrk_int_disable(); return NRK_OK; }