escalonador de processos de tempo real rtx tiny
DESCRIPTION
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 - PowerPoint PPT PresentationTRANSCRIPT
SVC GRECO
Escalonador de Processos Escalonador de Processos de Tempo Realde Tempo RealRTX TinyRTX Tiny
SVC GRECO
NecessidadeNecessidade
• Manipulação de processos• Definição de ordem de execução• Tratamento de eventos / interrupções• Sincronização / comunicação• Time-slicing
SVC GRECO
RTX TinyRTX 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
SVC GRECO
RTX TinyRTX 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).
SVC GRECO
Primitivas DisponíveisPrimitivas Disponíveis
• char os_create_task (uchar task_id);
1) Inicializa e põe a tarefa 1) Inicializa e põe a tarefa task_idtask_id na fila de na fila de processos no estado processos no estado readyready..
2) Retorna 0 se OK, e -1 se 2) Retorna 0 se OK, e -1 se task_id task_id não existe não existe ou não pode ser inicializada.ou não pode ser inicializada.
SVC GRECO
Primitivas DisponíveisPrimitivas Disponíveis
• char os_create_task (uchar task_id);• char os_delete_task (uchar task_id);
1) Pára a tarefa 1) Pára a tarefa task_idtask_id e remove da fila de e remove da fila de processos.processos.
2) Retorna 0 se OK, e -1 se 2) Retorna 0 se OK, e -1 se task_id task_id não existe não existe ou não estava na fila de processos.ou não estava na fila de processos.
SVC GRECO
Primitivas DisponíveisPrimitivas 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);
1) Pára a tarefa atual e espera pelo evento 1) Pára a tarefa atual e espera pelo evento definido em definido em tipo.tipo.
2) O parâmetro 2) O parâmetro dd não é usado e é mantido não é usado e é mantido apenas por compatibilidade com a versão apenas por compatibilidade com a versão completa do RTX Comercial.completa do RTX Comercial.
SVC GRECO
Primitivas DisponíveisPrimitivas 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);
1) O parâmetro 1) O parâmetro tipotipo pode ter os seguintes pode ter os seguintes valores:valores:
K_SIG K_SIG Espere por um sinal Espere por um sinal
K_TMO K_TMO Espere por timeout Espere por timeout
K_IVL K_IVL Espere por tempo Espere por tempo
2) Estes valores podem ser combinados. Ex: 2) Estes valores podem ser combinados. Ex: (K_SIG | K_TMO), espera um sinal pelo tempo (K_SIG | K_TMO), espera um sinal pelo tempo definido em definido em ticksticks..
3) O parâmetro 3) O parâmetro ticksticks define o número de pulsos define o número de pulsos do timer que devem ser esperados caso K_IVL do timer que devem ser esperados caso K_IVL ou K_TMO sejam usados.ou K_TMO sejam usados.
SVC GRECO
Primitivas DisponíveisPrimitivas 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, aApós a ocorrência do evento esperado, a
função pode retornar um dos seguintesfunção pode retornar um dos seguintes
valores:valores:
NOT_OKNOT_OK Parâmetro Parâmetro TipoTipo é inválido é inválido
SIG_EVENTSIG_EVENT Recepção de sinal Recepção de sinal
TMO_EVENTTMO_EVENT Acabou o tempo definido Acabou o tempo definido em em ticksticks
SVC GRECO
Primitivas DisponíveisPrimitivas 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);
1) Envia sinal à tarefa 1) Envia sinal à tarefa task_idtask_id. Se esta já estiver . Se esta já estiver esperando por um sinal, passará para o esperando por um sinal, passará para o estado estado readyready. Senão o sinal é armazenado no . Senão o sinal é armazenado no flag correspondente.flag correspondente.
2) Retorna 0 se OK, e -1 se 2) Retorna 0 se OK, e -1 se task_id task_id não existe.não existe.
3) Só pode ser usada a partir de rotinas comuns 3) Só pode ser usada a partir de rotinas comuns e não de rotinas de interrupção.e não de rotinas de interrupção.
SVC GRECO
Primitivas DisponíveisPrimitivas 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 1) Apaga o flag de sinal da tarefa task_idtask_id..
2) Retorna 0 se OK, e -1 se 2) Retorna 0 se OK, e -1 se task_id task_id não existe.não existe.
SVC GRECO
Primitivas DisponíveisPrimitivas 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);
1) Envia sinal à tarefa 1) Envia sinal à tarefa task_idtask_id. Se esta já estiver . Se esta já estiver esperando por um sinal, passará para o esperando por um sinal, passará para o estado estado readyready. Senão o sinal é armazenado no . Senão o sinal é armazenado no flag correspondente.flag correspondente.
2) Retorna 0 se OK, e -1 se 2) Retorna 0 se OK, e -1 se task_id task_id não existe.não existe.
3) Só pode ser usada a partir de uma rotina de 3) Só pode ser usada a partir de uma rotina de interrupção.interrupção.
SVC GRECO
Primitivas DisponíveisPrimitivas 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 1) Retorna o identificador da tarefa em execução no momento.execução no momento.
2) Se for usada de uma rotina de interrupção, 2) Se for usada de uma rotina de interrupção, retorna o valor da tarefa que estava retorna o valor da tarefa que estava executando antes de haver a interrupção.executando antes de haver a interrupção.
SVC GRECO
Exemplo 1: ContadoresExemplo 1: Contadores#include <rtx51tny.h>#include <rtx51tny.h>int counter0; //counter for task 0int counter0; //counter for task 0int counter1; //counter for task 1int counter1; //counter for task 1int counter2; //counter for task 2int counter2; //counter for task 2
//RTX-51 tiny começa pela tarefa 0//RTX-51 tiny começa pela tarefa 0job0 () _task_ 0 {job0 () _task_ 0 { os_create_task (1); //start task 1os_create_task (1); //start task 1 os_create_task (2); //start task 2os_create_task (2); //start task 2 while (1)while (1) {counter0++;}{counter0++;}
}}
// Esta rotina não faz nada// Esta rotina não faz nadavoid main ()void main ()
{while (1);}{while (1);}
//Esta tarefa inicia em os_create_task(1)//Esta tarefa inicia em os_create_task(1)job1 () _task_ 1 {job1 () _task_ 1 {
while (1) while (1) {counter1++;}{counter1++;}
}}
//Esta tarefa inicia em os_create_task(2)//Esta tarefa inicia em os_create_task(2)job2 () _task_ 2 {job2 () _task_ 2 {
while (1) while (1) {counter2++;}{counter2++;}
}}
SVC GRECO
Exemplo 2: ComunicaçãoExemplo 2: Comunicação#include <rtx51tny.h>#include <rtx51tny.h>int counter0; //counter for task 0int counter0; //counter for task 0int counter1; //counter for task 1int counter1; //counter for task 1int counter2; //counter for task 2int counter2; //counter for task 2int counter3; //counter for task 3int counter3; //counter for task 3
//RTX-51 tiny começa pela tarefa 0//RTX-51 tiny começa pela tarefa 0
job0 () _task_ 0 {job0 () _task_ 0 {
os_create_task (1); // start task 1os_create_task (1); // start task 1
os_create_task (2); // start task 2os_create_task (2); // start task 2
os_create_task (3); // start task 3os_create_task (3); // start task 3
while (1) {while (1) {
counter0++;counter0++;
os_wait (K_TMO, 5, 0); //Esp.timeoutos_wait (K_TMO, 5, 0); //Esp.timeout
}}
}}
job1() _task_ 1 {job1() _task_ 1 {while (1) {while (1) { counter1++;counter1++;
os_wait (K_TMO, 10, 0); //Esp.timeoutos_wait (K_TMO, 10, 0); //Esp.timeout }}}}
job2() _task_ 2 {job2() _task_ 2 {while (1) {while (1) { counter2++;counter2++; if (counter2 == 0) if (counter2 == 0)
os_send_signal (3); //Envie para 3os_send_signal (3); //Envie para 3 }} }}
job3 () _task_ 3 {job3 () _task_ 3 {while (1) {while (1) { os_wait (K_SIG, 0, 0); //Espere sinalos_wait (K_SIG, 0, 0); //Espere sinal counter3++;counter3++; }}}}
//Esta rotina não faz nada//Esta rotina não faz nadavoid main ()void main () {while (1);}{while (1);}