cacio jg
OS Newbie
Karma: 1
Mensagens: 12
|
 |
« Responder #2 : Março 02, 2010, 12:10:49 » |
|
Se me permitem 'intrometer'.
Acho que é absolutamente possivel construir um SO para circuitos embarcados (Na verdade é um velho projeto meu).
Mas devemos nos ater a ideia de que um circuito embarcado é um circuito 'monotarefa', ele é criado para uma tarefa especifica (se não poderiamos simplesmente usar um PC), por isso um SO para um PIC seria um sistema operacional totalemente direcionado para aquele circuito.
Ou seja, do meu ponto de vista, teriamos que apenas nos 'basear' em OS de PC, mas nunca tentar 'adaptar' o SO de PC num PIC. E nesta linha de 'basear-se' num OS de PC, mas nunca adapta-lo, teriamos sim um meio de fazer um SO para PIC:
Uma maneira simples de implementar seria usar a memoria interna do PIC para gerar a 'BIOS'. Nela nos inicializamos o PIC, criamos uma rotina de controle da RAM interna do PIC, ligamos alguma das maquinas de comunidação do PIC, e criamos uma sequencia de rotinas que seriam 'as funções do sistema'.
Essas funções seriam chamadas através de uma tabela de GOTO's calculados. Vou tentar dar um exemplo, imaginemos que a maquina usada seja a Serial, então o pic recebe um byte pela maquina serial, move para a primera alocação da RAM interna, e esperar para receber outro byte (que pode ser um argumento do 'comando', ou um sinalizador de 'fim de transmissão').
Depois vamos a decodificação, onde o PIC lê a primeira alocação da RAM interna, e adiciona esse valor os PCL (Program Counter Low), e com isso usamos a tabela de gotos calculados para pular para a função que queremos.
Dentro da função, podemos chamar novamente a função de leitura da memoria, para ler outros enredeços da RAM do PIC, para usar esse valores como argumentos da função.
eu criei a um tempo atrás uma rotina que permite ler todas os endereços de todos os bancos da RAM do PIC16F628A. Mas imagino que para o que você quer, terá que usar um PIC 'maior'.
deixe-me dar um código de exemplo do texto acima(em assembly PIC Mid-range, usando a USART para comunicar, e supondo que o byte enviado seja o byte 0):
movf rcreg,0 movwf operando ; operando é o endereço 0 da RAM, do banco 0. * * *
movf operando,0 addwf PCL ;tabela de goto tabela goto motor1 goto motor2 goto hab_porta * * *
motor1 bsf portb,7 ; supondo que o bit 7 do portb 'ligue' o motor, habilitando a alimentação através de ;um transistor ou de um 'jogo' de portas lógicas movf argumento,0 ; supondo que um segundo byte foi enviado, e gravado no end 1 banco 0 da RAM ; esse byte poderia ter dois valores, um que indicar rotação horaria e outro para anti-horaria. movwf PCL ; cria um novo pulo goto horario; vai para rotina de giro horario goto anti-horario; rotina de giro anti-hoarario * *
e assim o programa seguiria, um terceria byte poderia ser enviado para o pic para dizer o numero de passos que o motor deve dar. Desta maneira o controlador só teria que enviar ao sistema a sequencia de bytes 0,0,15 para o motor 1 girar no sentido horario 15 passos.
Do mesmo modo todas as outras funções do sistema podem ser implementadas, como leitura e escrita da memoria externa (que você disse que teria) etc.
ufa acho que ajudei, qualquer coisa pergunte.
|