示例#1
0
uint8_t run_active_tasks()
{ //currently assumes no 'wait' events
   uint8_t i = 0;
   uint8_t linked = 0;
   uint8_t next = 0;

   //disable sw timer
   do{
      i = next;

      if( (taskList[i].counter == 1) || (linked == 1)){         
         taskList[i].counter = 0; //disable this task until it's reset

         if(taskList[i].command[OPCODE] == WAIT_EVENT){
            //determine start of next group
            next = get_next_task_group(i); //returns 0 if there are no more groups
            taskList[i].command[WAIT_INDEX] = i; //when this WAIT event is complete, it will write this value into the ready queue
            //store 
         }else{
            next = (i+1) % NUMBER_TASKS;
            //update linked status
            linked = taskList[i].linkflag; //update
               if((linked == 0) && (taskList[i].reload == 1)){
                  // last task in this group (or not linked at all). Start reset if needed
                  reset_task(i);
               }
         }
         
         //execute_command(&taskList[i].command); //run this task

      }else{
         next = (i+1) % NUMBER_TASKS;
      }
   }while(next != 0);
   //enable sw timer
}
//
//  flash PORTD.5 at 1hz
//
void task7(void)
{
    PORTD ^= (1<<5);
    task_timers[7] = 50;        //every 500ms  
    reset_task(7);
}
//
//  flash PORTD.4 at 2hz
//
void task6(void)
{
    PORTD ^= (1<<4);
    task_timers[6] = 25;        //every 250ms
    reset_task(6);
}
void task5(void)
{
  reset_task(5);
}
void task4(void)
{
  reset_task(4);
}
void task3(void)
{
  reset_task(3);
}
void task2(void)
{
  reset_task(2);
}
void task1(void)
{
  reset_task(1);
}
void task0(void)
{
  reset_task(0);
}