150 likes | 244 Views
Escalonador de Processos de Tempo Real RTX Tiny. Necessidade. Manipulação de processos Definição de ordem de execução Tratamento de eventos / interrupções Sincronização / comunicação Time-slicing. RTX Tiny. Produzido pela Keil, Inc. Subconjunto do RTX comercial Características técnicas
E N D
Necessidade • Manipulação de processos • Definição de ordem de execução • Tratamento de eventos / interrupções • Sincronização / comunicação • Time-slicing
RTX Tiny • Produzido pela Keil, Inc. • Subconjunto do RTX comercial • Características técnicas • Escalonamento round-robin sem prioridades • 7 primitivas de sistema • Permite até 16 tarefas • Usa máximo de 64 bytes de RAM • Usa o Timer 0 • 900 bytes de código
RTX Tiny • Características técnicas (continuação) • Latência de interrupção < 20 ciclos • Tempo usado na mudança de contexto é de 100 a 700 ciclos, dependendo se a pilha está muito carregada. • Timer 0 programado para interromper a cada 10ms (padrão que pode ser alterado). • Time slicing de 5 pulsos do Timer 0 (padrão que pode ser alterado).
Primitivas Disponíveis • char os_create_task (uchar task_id); 1) Inicializa e põe a tarefa task_id na fila de processos no estado ready. 2) Retorna 0 se OK, e -1 se task_id não existe ou não pode ser inicializada.
Primitivas Disponíveis • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); 1) Pára a tarefa task_id e remove da fila de processos. 2) Retorna 0 se OK, e -1 se task_id não existe ou não estava na fila de processos.
Primitivas Disponíveis 1) Pára a tarefa atual e espera pelo evento definido em tipo. 2) O parâmetro d não é usado e é mantido apenas por compatibilidade com a versão completa do RTX Comercial. • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); • char os_wait (uchar tipo, uchar ticks, uint d);
Primitivas Disponíveis 1) O parâmetro tipo pode ter os seguintes valores: K_SIG Þ Espere por um sinal K_TMO Þ Espere por timeout K_IVL Þ Espere por tempo 2) Estes valores podem ser combinados. Ex: (K_SIG | K_TMO), espera um sinal pelo tempo definido em ticks. 3) O parâmetro ticks define o número de pulsos do timer que devem ser esperados caso K_IVL ou K_TMO sejam usados. • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); • char os_wait (uchar tipo, uchar ticks, uint d);
Primitivas Disponíveis • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); • char os_wait (uchar tipo, uchar ticks, uint d); Após a ocorrência do evento esperado, a função pode retornar um dos seguintes valores: NOT_OK Þ Parâmetro Tipo é inválido SIG_EVENT Þ Recepção de sinal TMO_EVENT Þ Acabou o tempo definido em ticks
Primitivas Disponíveis 1) Envia sinal à tarefa task_id. Se esta já estiver esperando por um sinal, passará para o estado ready. Senão o sinal é armazenado no flag correspondente. 2) Retorna 0 se OK, e -1 se task_id não existe. 3) Só pode ser usada a partir de rotinas comuns e não de rotinas de interrupção. • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); • char os_wait (uchar tipo, uchar ticks, uint d); • char os_send_signal (uchar task_id);
Primitivas Disponíveis • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); • char os_wait (uchar tipo, uchar ticks, uint d); • char os_send_signal (uchar task_id); • char os_clear_signal (uchar task_id); 1) Apaga o flag de sinal da tarefa task_id. 2) Retorna 0 se OK, e -1 se task_id não existe.
Primitivas Disponíveis 1) Envia sinal à tarefa task_id. Se esta já estiver esperando por um sinal, passará para o estado ready. Senão o sinal é armazenado no flag correspondente. 2) Retorna 0 se OK, e -1 se task_id não existe. 3) Só pode ser usada a partir de uma rotina de interrupção. • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); • char os_wait (uchar tipo, uchar ticks, uint d); • char os_send_signal (uchar task_id); • char os_clear_signal (uchar task_id); • char isr_send_signal (uchar task_id);
Primitivas Disponíveis • char os_create_task (uchar task_id); • char os_delete_task (uchar task_id); • char os_wait (uchar tipo, uchar ticks, uint d); • char os_send_signal (uchar task_id); • char os_clear_signal (uchar task_id); • char isr_send_signal (uchar task_id); • char os_running_task_id (void); 1) Retorna o identificador da tarefa em execução no momento. 2) Se for usada de uma rotina de interrupção, retorna o valor da tarefa que estava executando antes de haver a interrupção.
Exemplo 1: Contadores // Esta rotina não faz nada void main () {while (1);} #include <rtx51tny.h> int counter0; //counter for task 0 int counter1; //counter for task 1 int counter2; //counter for task 2 //RTX-51 tiny começa pela tarefa 0 job0 () _task_ 0 { os_create_task (1); //start task 1 os_create_task (2); //start task 2 while (1) {counter0++;}} //Esta tarefa inicia em os_create_task(1) job1 () _task_ 1 {while (1) {counter1++;}} //Esta tarefa inicia em os_create_task(2) job2 () _task_ 2 {while (1) {counter2++;}}
Exemplo 2: Comunicação //Esta rotina não faz nada void main () {while (1);} job3 () _task_ 3 { while (1) { os_wait (K_SIG, 0, 0); //Espere sinal counter3++; } } #include <rtx51tny.h> int counter0; //counter for task 0 int counter1; //counter for task 1 int counter2; //counter for task 2 int counter3; //counter for task 3 //RTX-51 tiny começa pela tarefa 0 job0 () _task_ 0 { os_create_task (1); // start task 1 os_create_task (2); // start task 2 os_create_task (3); // start task 3 while (1) { counter0++; os_wait (K_TMO, 5, 0); //Esp.timeout } } job1() _task_ 1 {while (1) { counter1++; os_wait (K_TMO, 10, 0); //Esp.timeout }} job2() _task_ 2 {while (1) { counter2++; if (counter2 == 0) os_send_signal (3); //Envie para 3 } }