Exemple #1
0
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;
}