15
SVC GRECO Escalonador de Escalonador de Processos Processos de Tempo Real de Tempo Real RTX Tiny RTX Tiny

Escalonador de Processos de Tempo Real RTX Tiny

Embed Size (px)

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 Presentation

Citation preview

Page 1: Escalonador de Processos  de Tempo Real RTX Tiny

SVC GRECO

Escalonador de Processos Escalonador de Processos de Tempo Realde Tempo RealRTX TinyRTX Tiny

Page 2: Escalonador de Processos  de Tempo Real RTX 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

Page 3: Escalonador de Processos  de Tempo Real RTX Tiny

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

Page 4: Escalonador de Processos  de Tempo Real RTX Tiny

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

Page 5: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 6: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 7: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 8: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 9: Escalonador de Processos  de Tempo Real RTX Tiny

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

Page 10: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 11: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 12: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 13: Escalonador de Processos  de Tempo Real RTX Tiny

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.

Page 14: Escalonador de Processos  de Tempo Real RTX Tiny

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

}}

Page 15: Escalonador de Processos  de Tempo Real RTX Tiny

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