Engenharia de Sistemas Embarcados 2006.2 Aula 10: Salvo RTOS Funções do Salvo • Arquivos de cabeçalho próprio • Nomenclatura – Funções possuem prefixo OS ou OS_ Salvo Headers Não fazem parte do Salvo 2006.2 Engenharia de Sistemas Embarcados 2 OSInit() • OSInit() inicializa todas as estruturas do Salvo, ponteiros e contadores; Deve ser chamada antes de qualquer outra função do Salvo Comportamento Imprevisto 2006.2 Engenharia de Sistemas Embarcados 3 OSSched() • É o escalonador multitarefa do Salvo. • São executadas tarefas que estão no estado elegível • Cada chamada de OSSched()resulta na tarefa mais elegível sendo executada até a nova mudança de contexto dentro da tarefa • OSSched()deve ser chamada repetidamente para que o esquema de multitarefa continue OSSched() deve ser executada diretamente da função main() para um uso mais eficiente da pilha de chamadas e retornode função 2006.2 Engenharia de Sistemas Embarcados 4 Criando, Inicializando e Mudando Contexto de Tarefas • Criação de tarefas – – – Cria um task control block no estado parado Tarefas podem ser criadas em várias partes do programa Podem ser criadas antes ou depois de iniciada a multitarefa Criação de tarefas 2006.2 Engenharia de Sistemas Embarcados 5 Criando Tarefas • Criação de Tarefas – – – – OSCreateTask() Endereço inicial Ponteiro tcb Prioridade Criação de tarefas 2006.2 Engenharia de Sistemas Embarcados 6 Mudando Contexto de Tarefas • Mudança de Contexto – OS_Yield() mudança de contexto incondicional – Requer o rótulo único para a mudança de contexto – _OSLabel() geração de rótulos únicos; Geração de rótulo único Mudança de contexto • Exemplo – 2006.2 Tutorial 3 Engenharia de Sistemas Embarcados 7 Usando Eventos para Melhorar o Desempenho • OSCreateBinSem() => Cria um semáforo binário com o ponteiro ecb especificado e valor inicial • OSSignalBinSem() => sinaliza o semáforo binário. Se não há tarefas esperando o sinal simplesmente incrementa o valor do semáforo. Se tarefas esperam pelo semáforo aquela de maior prioridade se torna elegível • OS_WaitBinSem() => utilizado para espera de sinalização de semáforo. – Se valor for zero tarefa vai para estado de espera – Se valor for hum o semáforo é resetado para zero e a tarefa continua a execução – OS_ => indica que pode acontecer mudança de contexto na chamada da função 2006.2 Engenharia de Sistemas Embarcados 8 Usando Eventos para Melhorar o Desempenho • Atualizar porta quando necessário • Tutorial 4 2006.2 Engenharia de Sistemas Embarcados 9 Usando Eventos para Melhorar o Desempenho • Desempenho quase duas vezes maior • Tarefa TaskShow() passa 97% do tempo esperando pela sinalização de eventos 2006.2 Engenharia de Sistemas Embarcados 10 Atrasando um Tarefa • Gerar atrasos precisos em tarefas • OS_Delay() atrasos em número de ticks • Após atraso tarefa no estado elegível • Precisa do Timer do sistema Atraso em tarefas Habilitação de interrupções 2006.2 Engenharia de Sistemas Embarcados 11 Timer do Sistema • Define a resolução do da temporização do sistema • Utiliza rotina de interrupção do timer • Função OSTimer() deve ser executada de maneira regular • OS_Delay() substitui a chamada de OS_Yield() para a mudança de contexto 2006.2 Engenharia de Sistemas Embarcados Disparo do Timer 12 Sinalização de Múltiplas Tarefas • • • • OSCreateMsg() cria mensagens no Salvo OSSignalMsg() OS_WaitMsg() OS_SetPrio() – Mudança de prioridade com mudança de contexto • OSSetPrio() – Mudança de prioridade sem mudança de contexto 2006.2 Engenharia de Sistemas Embarcados 13