Exemple #1
0
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 );
            }
        }
    }
}
Exemple #2
0
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 );
            }
        }
    }
}
Exemple #3
0
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 );
            }
        }
    }
}
Exemple #4
0
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;
}