void os_task_tick( uint8_t id, uint16_t tickSize ) { uint8_t index; /* Search all tasks and decrement time for waiting tasks */ for ( index = 0; index != nTasks; ++index ) { TaskState_t state; state = task_list[ index ].state; if (( state == WAITING_TIME ) || ( state == WAITING_EVENT_TIMEOUT )){ /* Found a waiting task, is it ready? */ if ( task_list[ index ].clockId == id ) { if ( task_list[ index ].time <= tickSize ) { task_list[ index ].time = 0; if ( state == WAITING_EVENT_TIMEOUT ) { os_task_clear_wait_queue( index ); } task_ready_set( index ); } else { task_list[ index ].time -= tickSize; } } } else if ( state == WAITING_SEM ) { task_list[ index ].time++; } /* If the task has a message queue, decrement the delayed message timers */ if ( id == 0 ) { if ( task_list[ index ].msgQ != NO_QUEUE ) { os_msgQ_tick( task_list[ index ].msgQ ); } } } }
void os_task_signal_event( Evt_t eventId ) { uint8_t index; uint8_t eventListIndex; uint8_t shift; eventListIndex = eventId / 8; shift = eventId & 0x07; for ( index = 0; index != nTasks; index++ ) { uint8_t taskWaitingForEvent; uint8_t taskWaitStateOK; TaskState_t state; state = task_list[ index ].state; taskWaitStateOK = 0; if (( state == WAITING_EVENT ) || ( state == WAITING_EVENT_TIMEOUT )) { taskWaitStateOK = 1; } taskWaitingForEvent = task_list[ index ].eventQueue.eventList[eventListIndex] & (1<<shift); if ( taskWaitingForEvent && taskWaitStateOK ) { task_list[ index ].eventQueue.eventList[eventListIndex] &= ~(1<<shift); if ( task_list[ index ].waitSingleEvent || os_task_wait_queue_empty( index ) ) { os_task_clear_wait_queue( index ); task_ready_set( index ); } } } }
void os_task_signal_event( uint8_t evId ) { uint8_t index; uint8_t taskWaitingForEvent; for ( index = 0; index != nTasks; index++ ) { taskWaitingForEvent = task_list[ index ]->eventQueue & evId; if (( taskWaitingForEvent ) && ( task_list[ index ]->state != PENDING )) { task_list[ index ]->eventQueue &= ~evId; if ( task_list[ index ]->waitSingleEvent || ( task_list[ index ]->eventQueue == 0 ) ) { os_task_clear_wait_queue( index ); } } } }
uint8_t task_create( taskproctype taskproc, uint8_t prio, Msg_t *msgPool, uint8_t poolSize, uint16_t msgSize ) { uint8_t taskId; tcb *task; os_assert( os_running() == 0 ); os_assert( nTasks < N_TASKS ); os_assert( taskproc != NULL ); taskId = nTasks; /* Check that no other task has the same prio */ while ( taskId != 0 ) { --taskId; os_assert( task_list[ taskId ].prio != prio ); } task = &task_list[ nTasks ]; task->tid = nTasks; task->prio = prio; task->state = READY; task->savedState = READY; task->semaphore = 0; task->internal_state = 0; task->taskproc = taskproc; task->waitSingleEvent = 0; task->time = 0; if ( poolSize > 0 ) { task->msgQ = os_msgQ_create( msgPool, poolSize, msgSize ); } else { task->msgQ = NO_QUEUE; } os_task_clear_wait_queue( nTasks ); nTasks++; return task->tid; }