Sistemas embarcados
Prof. Décio Rennó
O que é um
sistema
embarcado?
Sistema embarcado?
Sistema dedicado
Microprocessado
Hardware simplificado
Baixo custo
Recursos escassos
O que é um sistema embarcado?
• Sistema dedicado
O que é um sistema embarcado?
• Microprocessado
Microprocessador
O que é um sistema embarcado?
• Hardware simplificado
• Baixo custo
• Recursos escassos
Sistemas embarcados
• Desafios:
• Mão de obra Computação
qualificada
• Conhecimento em
várias áreas Comunicação Eletrônica
• Projeto em times Sistemas
• Hardware x Software Embarcados
• Normas
• Concorrência
Segurança Confiabilidade
Projeto de sistemas embarcados
Circuito eletrônico
Documentação
Software
Sistemas embarcados
Raspberry Pi Smart Phone
FPGA
Aplicações
Planejamento do
curso
Referências bibliográficas
• Programação de Sistemas Embarcados.
Almeida, R.M.A., Moraes, C.H.V, Seraphim
T.F.P., Elsevier 2016
• C completo e total. Herbert Schildt. Makron
Books. 3a Edição. 1997.
• Datasheets e manuais
Laboratório
Harware e software utilizados
Kit de desenvolvimento
Módulo Exsto com processador PIC18f4520
Simulador
PICSimLab (PICGenios)
Ferramentas a serem utilizadas:
• MPLABX (versão 6.10+)
• Compilador XC8 (versão 2.41+)
• PICSimLab (versão 0.9.1)
Requisitos
• Linguagem C
• Estruturas de decisão: if/switch
• Estruturas de repetição: for
• Vetores
• Funções
• Circuitos
• Tensão x Corrente x Resistência
• Fontes de Tensão
• Divisor de tensão
Linguagem C
Linguagens utilizadas
Linguagem C
Linguagem C++
Assembly
Python
HTML
Java
Comparativo
Linguagem C Linguagem ASM Linguagem
de máquina
ldaa 10 // carrega 10 no acum. a
x = 10; staa x // salva o valor do acum. a em x 0x83 0x0a
y = 20; ldaa 20 // carrega o valor 20 no acum. a 0x84 0x00
z = x*y; staa y // salva o valor do acum. a em y 0x83 0x14
ldaa x // carrega o acum. a com valor de x 0x84 0x01
ldab y // carrega o acum. b com valor de y 0x83 0x00
mulab // mult. acum. a por b, salva em a 0x93 0x01
staa z // salva o valor do acum. a em z 0x5f
0x83 0x02
Programação em Bare-metal
Programando em baixo nível (nível de hardware)
Sem uso de abstrações
Sem sistema operacional
O código está muito próximo da eletrônica
Compilação em C
Etapas da compilação
• Pré processamento
• Compilador
• Assemblador
• Linker
Etapas da compilação
Código fonte
Hello.c Outros códigos
objetos
Pré processor
Código
Pré-processado
Compilador Linker EXECUTÁVEL
Código
Assembly
Assembler
Arquivos da
Código objeto biblioteca
Hello.o
O pré processador
Código fonte
Hello.c Outros códigos
objetos
Pré processor
Código
Pré-processado
Compilador Linker EXECUTÁVEL
Código
Assembly
Assembler
Arquivos da
Código objeto biblioteca
Hello.o
O pré processador
Uma ferramenta de substituição de textos
#define – Substitui uma macro
#include – Inclui um texto de outro arquivo
#if – Testa uma condição para compilar
Outros...
O pré processador
Exemplos de diretivas do pré processador
O Compilador e Assemblador
Código fonte
Hello.c Outros códigos
objetos
Pré processor
Código
Pré-processado
Compilador Linker EXECUTÁVEL
Código
Assembly
Assembler
Arquivos da
Código objeto biblioteca
Hello.o
O Compilador e Assemblador
Transforma texto em código de máquina
O arquivo gerado é chamado de código objeto
O Linker
Código objeto
Código objeto Linker EXECUTÁVEL
Código objeto
Arquivos da
biblioteca
Programando em C
Linguagem C
• Coleção de funções
Criadas pelo programador
Utilizadas através de biblioteca
• Os programas em linguagem C possuem
Diretivas de pré processamento
Definição de variáveis
Definição de funções
Etc.
As diretivas de pré-processamento
• Mensagens do programador ao
compilador com tarefas para antes ou
no momento da compilação
# • as diretivas são iniciadas pelo caractere
# (hash)
• as diretivas mais comuns são #include
e #define
Diretivas de pré-compilação
• A diretiva #define permite que o código fonte seja
modificado antes de ser compilado.
#define CONST 15
void main(void){
printf("%d", CONST * 3);
}
//no processo de compilação
void main(void){
printf("%d", 15 * 3);
//é possível: printf("%d", 45);
}
Compilação condicional
Verificando um #define Exemplo de uso:
antes de compilar void ImprimirTemp(char valor){
#ifdef LCD
#ifdef nome Imprime_LCD(valor);
#else
if (valor > 30) led = 1;
#else
else led = 0;
#endif //LCD
#endif }
Compilação condicional
Com selecionar entre Serial e LCD:
Outro exemplo
#include <stdio.h>
void MostraSaidaPadrao(){ #define SERIAL
#ifdef SERIAL void main(void){
char *msg = "SERIAL"; MostraSaidaPadrao();
#else }
char *msg = "LCD";
#endif #include <stdio.h>
printf(“%s”,msg); //#define SERIAL
} void main(void){
MostraSaidaPadrao();
}
Includes
• Especifica ao compilador novas funções,
tipos e macros que estão disponíveis em
outros arquivos
#include <nome do arquivo>
#include "nome do arquivo"
A diferença entre os Includes
Header files: são os arquivos com extensão .h que contém as definições
de tipos, dados e declarações de várias funções já prontas
#include <nome do arquivo>
• O arquivo é procurado no diretório definido pelo
compilador C
#include "nome do arquivo":
• O arquivo é procurado no diretório do programa criado.
Os Includes não podem repetir
Na grande maioria dos casos é necessário fazer uma verificação para
garantir que o include não seja chamado duas ou mais vezes
Cuidado #ifndef STDIO_H
#define STDIO_H
//Protótipos, definições, …
Imagem: www.graphicsfactory.com #endif // Fim do STDIO_H
Funções
Blocos de comandos a serem executados
• A função pode, ou não, receber valores.
• As funções podem, se necessário retornar um valor.
• A função “main” é onde começa o programa.
• Não há ordem obrigatória para codificar as funções
Definição de funções
Exemplo:
A definição da função possui: int main(int argc, char *argv[]){
return 0;
O tipo de dado que ela retorna
}//end main
O nome da função
void funcao01(char var){
O que ela recebe ...
}//end funcao01
O que ela faz
void funcao02(void){
...
}//end funcao02
Função main
Função main
• Indica o ponto de início de um programa
• O linker aloca a função main() em algum
lugar disponível na memória
• O linker atualiza o vetor de reset colocando
um pulo para a função main()
Função main
• Em sistemas embarcados a função main é a primeira a
ser executada, portanto não pode receber parâmetro e
não retorna nada.
• Deve ser declarada como:
void main(void){
//aqui entra o código do programa
}
Função main
• Geralmente os sistemas embarcados são feitos
para serem executados continuamente
• As rotinas/funções devem ser pensadas para serem
executadas ciclicamente
• O sistema só para quando desligado
• Nesta situação devemos utilizar loops infinitos
Loop infinito?
Função main
Exemplos de loop infinito em software embarcado
void main (void){ void main (void){
for(;;){ while(1){
//aqui entra o //aqui entra o
//código principal //código principal
//e nunca termina //e nunca termina
} }
} }
Até a próxima