1 / 15

Escalonador de Processos de Tempo Real RTX Tiny

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

Download Presentation

Escalonador de Processos de Tempo Real RTX Tiny

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Escalonador de Processos de Tempo RealRTX Tiny

  2. Necessidade • Manipulação de processos • Definição de ordem de execução • Tratamento de eventos / interrupções • Sincronização / comunicação • Time-slicing

  3. 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

  4. 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).

  5. 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.

  6. 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.

  7. 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);

  8. 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);

  9. 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

  10. 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);

  11. 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.

  12. 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);

  13. 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.

  14. 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++;}}

  15. 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 } }

More Related