Você está na página 1de 39

SISTEMAS EMBUTIDOS

BCC 425

Prof: Gabriel Garcia

Baseado nos materiais de Aline Fidêncio e Eduardo Luz


Linguagens de Programação
e
Ambiente de Desenvolvimento
Programação para Sistemas Embutidos

O que precisamos saber?


Programação para Sistemas Embutidos

O que precisamos saber?

É melhor conhecer tudo sobre o Hardware!

Propósito

Como os dados são transmitidos: interface com sensores,


atuadores, etc.

Se existe um SO e como ele roda os programas.

Limitações: memória, velocidade, possibilidade de upgrade.

Tratamento de erros (Mars Rover)


Programação para Sistemas Embutidos
Programação para Sistemas Embutidos

O que precisamos saber?


Programação para Sistemas Embutidos

O que precisamos saber?

É melhor conhecer tudo sobre o Software!

Compiler/Linker/Assembler?(esperamos que sim)

Como a memória é endereçada?

Como debuggar o código?

Como os testes serão feitos?


Linguagens de Programação
Ambiente de Desenvolvimento
Ambiente de Desenvolvimento

Pré-processador

Faz alguns processamentos simples antes do compilador.

É executado automaticamente todas as vezes que o


programa é compilado.

Os comandos a serem executados são dados através de


diretivas do pré-processador (Em C → #).
Ambiente de Desenvolvimento

Pré-processador

A diretiva #include

Usada para incluir no programa, informações que estão em


outro arquivo.
Ambiente de Desenvolvimento

Pré-processador

A diretiva #define

Usada para fazer a substituição de macros. Mas é


frequentemente usada para dar nomes simbólicos a
constantes.
Ambiente de Desenvolvimento
Pré-processador

Diretivas de Compilação Condicional

Fazem com que o pré-processador não envie trechos do


programa para o compilador.
Ambiente de Desenvolvimento

Pré-processador
Ambiente de Desenvolvimento

Compilador

Classicamente, diz-se que o compilador traduz um


programa de uma linguagem alto-nı́vel para uma
linguagem de máquina, especı́fica para o hardware.

Mas, na verdade, o compilador gera um código assembly


a partir da saı́da do pré-processador.
Ambiente de Desenvolvimento
Assembler

Transforma um código Assembly em linguagem de


máquina.
Ambiente de Desenvolvimento

Linker

Transforma um ou mais object files gerados pelo


compilador em um único arquivo executável, arquivo
objeto ou em uma biblioteca.

Loader

Copia uma imagem carregável do executável gerado para


a memória, o conectando com qualquer outro programa já
carregado e atualizando endereços quando preciso.
Ambiente de Desenvolvimento
De código fonte a processo
Arquivos Executáveis

O SO espera que os arquivos executáveis tenham um


formato especı́fico

Header info
Localização dos Códigos
Localização dos Dados

Códigos & Dados

Tabela de Sı́mbolos
Lista de nomes de tudo que é definido no seu programa e
onde eles estão definidos.
Lista de nomes de tudo que está definido em algum outro
lugar e que é usado em seu programa.
Object File

Informações gerais sobre o arquivo, tais como tamanho,


código binário, tamanho dos dados e nome do arquivo do
qual foi gerado.

Instruções em binário compatı́vel com a arquitetura da


máquina.

Tabela de sı́mbolos

Dois tipos comuns de formato:


Common Object File Format - COFF
Executable and Linking Format - ELF
Formatos COFF e ELF

Ambos são muito similares, permitindo basicamente as


mesmas funcionalidades.

Ambos podem especificar tanto object code (arquivos


gerados pelo compilador), quanto executáveis (arquivos
gerados pelo linker ).

O link entre esses dois formatos é que ambos contém


seções.
.text: contém código binário executável.
.data: contém dados inicializados (int a = 7).
.bss: contém dados não inicializados (int v[10]).
Linker Command File

Depois de múltiplos códigos fonte terem sido compilados e


montados no formato ELF, o linker deve combinar esses
arquivos e as seções presentes nesses arquivos em um
único programa.

Esse processo gera uma única imagem executável para o


SE.

Usa-se comandos de linker (diretivas) para controlar como


o linker combina as seções e aloca os segmentos dentro
do SE.

As diretivas do linker são mantidas dentro de um arquivo


de comandos → linker command file
Linker Command File

Tanto o formato do arquivo quanto as diretivas variam de


linker para linker.

Duas das diretivas suportadas pela maioria dos linkers


são: MEMORY e SECTION.
Linker Command File
Memory Directive
Pode ser usada para descrever o mapeamento da
memória.
O mapeamento da memória lista diferentes tipos de
memórias (RAM, ROM e flash) junto com a faixa de
endereços que podem ser acessados.
O desenvolvedor deve estar familiarizado com os
endereços fı́sicos da memória antes de criar o arquivo de
comandos.
Linker Command File

Memory Directive

A diretiva MEMORY define os tipos de memória fı́sica


disponı́veis no sistema e a faixa de endereços ocupada por
cada bloco fı́sico de memória.
Linker Command File

Memory Directive
Linker Command File

Section Directive

O linker combina seções de entrada com mesmo nome em


uma única seção de saı́da, tendo esse nome como padrão.

As seções criadas pelo programador aparecem em uma


seção independente dentro do object file.

Além disso, o linker mapea as seções em determinados


endereços da memória.

Se o desenvolvedor quiser alterar esse comportamento


padrão do linker, ele pode usar a diretiva SECTION.
Linker Command File

Section Directive

Quais seções devem ser combinadas em uma seção de


saı́da.

Quais seções de saı́da devem ser agrupadas e alocadas


continuamente na memória.

Onde cada seção deve ser alocada.

Outras informações...
Linker Command File

Section Directive
Linker Command File

Section Directive
Linker Command File

Section Directive
Linker Command File

Section Directive
Linker Command File

Por que criar seções customizadas?

Atualização: o software pode ser atualizado quando


armazenado em memória não volátil.

Limitações de Memória: um sistema possui diferentes


tipos de memória, cada uma com suas limitações de
tamanho → estratégia para dividir o programa em múltiplas
seções e aloca-lás em diferentes memórias.

Proteção dos Dados: dados que não devem ser


modificados podem ser gravados na ROM, por exemplo.
Transferência do Programa para o SE

Uma imagem executável criada para um SE pode ser


transferida do servidor para o sistemas das seguintes
formas:

Programar a imagem diretamente na EEPROM ou flash.

Baixar a imagem através de conexão serial (RS-232) ou


ethernet.

Baixar a imagem utilizando uma interface JTAG ou BDM.


Transferência do Programa para o SE
Transferência do Programa para o SE

Embedded Loader + Boot Image

Programado na ROM.

Trabalha em conjunto com um utilitário de transferência de


dados instalado no servidor.

Parte da ROM contém também a imagem de boot.

No mı́nimo, essa imagem de boot contém o código que


deve ser executado ao ligar-se o sistema.

A imagem de boot prepara o sistema para executar o


loader. (BIOS)
Embedded Monitor
Boot + Loader + Debug
Carregamento e Execução do Programa pelo SE
Referência

Real-Time Concepts for Embedded Systems - Qing Li,


Caroline Yao
FIM

Você também pode gostar