Kernel com requisitos temporais

475 visualizações

Publicada em

Desenvolvimento de um primeiro modelo de kernel que atende a requisitos temporais. Breve introdução sobre real time.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
475
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
8
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Kernel com requisitos temporais

  1. 1. ELT048 - SOERequisitos temporaisRodrigo AlmeidaUniversidade Federal de Itajubá
  2. 2. Revisão● Kernel cooperativo● Troca de processos● Métodos de escalonamento
  3. 3. Exemplo● Exemplo de kernel cooperativo● O código apresentado pode ser compilado emqualquer compilador C● O kernel é composto por três funções:● KernelInit(): Inicializa as variáveis internas● KernelAddProc(): Adiciona processos no pool● KernelLoop(): Inicializa o gerenciador deprocessos– Esta função possui um loop infinito pois ela sóprecisa terminar quando o equipamento/placa fordesligado.
  4. 4. //return code#define SUCESSO 0#define FALHA 1#define REPETIR 2#define POOLSIZE 10//function pointer declarationtypedef char(*ptrFunc)(void);//process structtypedef struct {ptrFunc function;} process;process* pool[POOLSIZE];Exemplo
  5. 5. char kernelInit(void){ini = 0;fim = 0;return SUCESSO;}char kernelAddProc(process* newProc){//checking for free spaceif ( ((fim+1)%POOLSIZE) != ini){pool[fim] = newProc;fim = (fim+1)%POOLSIZE;return SUCESSO;}return FALHA;}Exemplo
  6. 6. void kernelLoop(void){for(;;){//Do we have any process to execute?if (ini != fim){//check if there is need to rescheduleif (pool[start]->Func() == REPETIR){kernelAddProc(pool[ini]);}//prepare to get the next process;ini = (ini+1)%POOLSIZE;}}}Exemplo
  7. 7. void tst1(void){printf("Process 1n");return REPETIR;}void tst2(void){printf("Process 2n");return SUCESSO;}void tst3(void){printf("Process 3n");return REPETIR;}● Os processosExemplo
  8. 8. void main(void){//declaring the processesprocess p1 = {tst1};process p2 = {tst2};process p3 = {tst3};kernelInit();//Test if the process was added successfullyif (kernelAddProc(p1) == SUCESSO){printf("1st process addedn");}if (kernelAddProc(p2) == SUCESSO){printf("2nd process addedn");}if (kernelAddProc(p3) == SUCESSO){printf("3rd process addedn");}kernelLoop();}Exemplo
  9. 9. Console Output:---------------------------1st process added2nd process added3rd process addedIte. 0, Slot. 0: Process 1Ite. 1, Slot. 1: Process 2Ite. 2, Slot. 2: Process 3Ite. 3, Slot. 3: Process 1Ite. 4, Slot. 0: Process 3Ite. 5, Slot. 1: Process 1Ite. 6, Slot. 2: Process 3Ite. 7, Slot. 3: Process 1Ite. 8, Slot. 0: Process 3...---------------------------Exemplo
  10. 10. Requisitos temporaisNa maioria dos sistemas embarcados énecessário garantir que algumas funçõessejam executadas com uma certa frequência.Alguns sistema podem até mesmo falhar casoestes requisitos não sejam atingidos.
  11. 11. Requisitos temporais● Tempo real● Velocidade● Instantâneadade
  12. 12. Real time● Capacidade de umsistema em garantira peridiocidade deuma tarefa● O importante é odeterminismo naexecução, não avelocidadebusiness2community.com
  13. 13. Real time● Capacidade de umsistema em garantira peridiocidade deuma tarefa● Determinismo
  14. 14. Real time● Hard real time ● Soft real time
  15. 15. Requisitos temporais● Para implementar um sistema que trabalhecom requisitos temporais:1)Deve existir um relógio que trabalhe com umafrequência precisa.2)O kernel deve ser informado da frequência, ouperíodo, de execução de cada processo.3)A soma dos tempos de cada processo deve“caber” no tempo disponível do processador.
  16. 16. ●1acondição:● É necessário um timer que possa gerar umainterrupção.●2acondição:● Adicionar as informações na estrutura doprocesso●3acondição:● Testar, testar e testar.● Em caso de falha:– Chip mais rápido– OtimizaçãoRequisitos temporais
  17. 17. ● Agendamento dos processos:● A utilização de um timer finito para medição detempo pode causar overflow● Exemplo: agendamento de 2 processos para10 e 50 segundos (1 bit = 1ms)Agendamento
  18. 18. ● E se os dois processos forem agendadospara o mesmo tempo?Agendamento
  19. 19. ● Suponha que o primeiro processo fosseexecutado:● Do diagrama de tempo abaixo o processo P2está atrasado 10(s) ou foi agendado paraacontecer daqui 55(s)?Agendamento
  20. 20. ● Solução:● Utilizar um contador temporizado decrescentepara cada processo ao invés de um valor deagendamento.● Problema:● Cada um dos contadores devem serdecrementados na rotina de interrupção.● Isso é um problema pra sua aplicação?Agendamento
  21. 21. Kernel com requisitos temporais
  22. 22. ● A primeira modificação é adicionar● Um contador para cada processo● Uma variável para armazenar o período deexecução//process structtypedef struct {ptrFunc function;int period;int start;} process;Kernel com requisitos temporais
  23. 23. ● Deve ser criada uma função de interrupçãopara decrementar cada um dos contadoresdos processos● Os detalhes intrínsecos do processo decriação e manipulação de interrupções estáfora do escopo desta aula.● Por facilidade será utilizado o DeviceinitializationKernel com requisitos temporais
  24. 24. Device initialization
  25. 25. Device initialization
  26. 26. Rotina de Interrupção
  27. 27. Rotina de Interrupção//colocar no MCUinit.c na função isrVrti()#include “kernel.h”__interrupt void isrVrti(void){KernelClock();//limpar a flag de interrupçãoCRGFLG = 0x80;}
  28. 28. Rotina de Interrupção//colocar no kernel.c#define MIN_INT -30000void KernelClock(void){unsigned char i;i = ini;while(i!=fim){if((pool[i].start)>(MIN_INT)){pool[i].start--;}i = (i+1)%SLOT_SIZE;}}//colocar no kernel.hvoid KernelClock(void);
  29. 29. ● A função de adição de processos deveinicializar corretamente as variáveischar AddProc(process* newProc){//checking for free spaceif ( ((fim+1)%POOLSIZE) != ini){pool[fim] = newProc;//increment start timer with periodpool[fim].start += newProc.period;fim = (end+1)%POOLSIZE;return SUCESSO;}return FALHA;}Kernel com requisitos temporais
  30. 30. ● A função de execução do kernel apresentauma mudança maior.● O processo de escalonamento muda de ummodelo FIFO (aula anterior) para umescalonador baseado no menor tempo deinicio.Kernel com requisitos temporais
  31. 31. if (ini != fim){//Procurando o processo com menor tempo de inicioj = (ini+1) % POOLSIZE;next = ini;while(j!=fim){if (pool[j].start < pool[next].start){next = j;}j = (j+1)%POOLSIZE;}//trocando as posições no pooltempProc = pool[next];pool[next] = pool[ini];pool[ini] = tempProc;while(pool[ini].start>0){//ótimo lugar para economia de energia}if ( (pool[ini]->function)() == REPETIR ){AddProc(&(pool[ini]));}ini = (ini+1)%POOLSIZE;}
  32. 32. Exercício● Montar um relógio binário onde cada ledpisca numa frequência diferente12341 segundo2 segundos4 segundos8 segundos //Ligar o 1o ledPORTB = PORTB | 0x01;//Desligar o 1o ledPORTB = PORTB & ~0x01;//Piscar o 1o ledPORTB = PORTB ^ 0x01;

×