Você está na página 1de 14

LARISSA MEIRELES (1-2120482)

WELBER ELI SANTOS TEIXEIRA (1-2112684)

PROJETO CONCEITUAL DO PROTÓTIPO DE SEII

PROF.: RAFAEL DE PAULA COSMO

VITÓRIA
2023
2

INTRODUÇÃO
Como se pode observar cotidianamente, devido à evolução tecnológica,
cada vez mais sistemas computacionais são utilizados para facilitar tarefas do
dia a dia. Eles são utilizados para diferentes propósitos, como entretenimento,
comunicação, controle de eletrodomésticos e veículos, entre vários outros.
Estes sistemas são chamados de sistemas computacionais embarcados, já
que exemplos práticos de utilização destes são em fornos de microondas,
videogames, impressoras, mp3 players, câmeras fotográficas digitais e
telefones celulares. O uso de processadores e sistemas integrados em
silício (SoC) dedicados a este propósito estão em franca expansão.
Segundo alguns dados estimados por pesquisas em alta tecnologia, mais
de 90% dos microprocessadores fabricados mundialmente são destinados a
máquinas que usualmente não são chamadas de computadores. Dentre alguns
destes dispositivos estão aparelhos celulares, fornos microondas, automóveis,
aparelhos de DVD e PALM´s. O que diferencia este conjunto de dispositivos de
um computador “convencional” (PC – Desktop, Notebook), conhecido por todos
é o seu projeto baseado em um conjunto dedicado e especialista constituído
por Hardware, Software e Periféricos – um Sistema Embarcado.
Um Sistema Embarcado, Embedded System, pela sua natureza
especialista, pode ter inúmeras aplicações. Pode-se ter sistema embarcado
para controle de freios de um veículo automóvel, em que esse sistema deve
gerenciar certos periféricos de controle como um sensor. Em outra aplicação,
um sistema embarcado através de suas funções de aquisição de dados,
captura informações dos sensores de temperatura e umidade, e envia estes
dados a um display ou para um computador via comunicação serial. Os
Sistemas Embarcados encontram-se cada vez mais presentes em nosso dia a
dia, e com uma utilização e importância crescente, tornam-se necessários
estudos nas áreas de projeto em hardware, software e interfaceamento com
base em sistemas embarcados.
O desafio no desenvolvimento de sistemas embarcados, especialmente
naqueles que são portáteis, é conseguir combinar características de forma a
obter um sistema que apresente pouco tempo e baixo custo de produção, uma
vez que esses aspectos têm enorme impacto na eletrônica de consumo; baixo
3

consumo de energia, já que geralmente os sistemas dependem de uma bateria;


e tempo de computação satisfatório.
Esta crescente complexidade exige que os sistemas sejam projetados em
um alto nível de abstração. Em algum momento do projeto, esta especificação
em alto nível deverá ser mapeada diretamente para o sistema final, que é um
conjunto de hardware e software. Assim, é necessária a automatização do
projeto, através do uso de ferramentas EDA (Eletronic Design Automation),
para fazer com que estas descrições em um alto nível sejam automaticamente
transformadas para o hardware real.

Figura 1 – Sistemas embarcados

CONCEITO
Sistemas embarcados são sistemas eletrônicos microprocessados que,
após serem programados, possuem uma função específica que geralmente
não pode ser alterada. Uma impressora, por exemplo, mesmo possuindo um
processador que poderia ser utilizado para qualquer tipo de atividade, tem sua
funcionalidade restrita apenas à impressão de páginas. Um computador de
propósito geral, no entanto, pode ser utilizado num instante como um ambiente
de entretenimento, em outro como estação de trabalho, ou até mesmo um
telefone.
4

Os sistemas embarcados estão presentes em praticamente todos os


ambientes, cobrindo uma ampla gama de funcionalidades: antenas
retransmissoras, televisões, fornos de micro-ondas, controles PID’s industriais,
sistemas de gerenciamento de aviação, esteiras transportadoras etc.
Atualmente, quase todo dispositivo que funcione com eletricidade possui um
sistema embarcado coordenando seu funcionamento.
Outra característica da maioria dos sistemas embarcados é a restrição de
recursos, tanto computacionais: memória e processamento, quanto físicos:
número de terminais e interfaces de exibição/entrada de dados. Grande parte
desta restrição se deve a questões de custo, consumo de energia ou robustez.
Isto leva ao desenvolvimento de alguns sistemas que não possuam nenhum
botão ou luz indicativa.
Por se tratar de sistemas com funções específicas e com recursos de
interface e computacionais bastante limitados, as rotinas e técnicas de
programação são diferentes daquelas usadas em computadores
convencionais. Os sinais e informações se modificam ao longo do tempo,
independentemente da entrada de dados pelo usuário. Alguns periféricos
necessitam de constante atualização para que mantenham seu funcionamento.
A necessidade de se verificar constantemente os dados e atualizar as saídas
apresenta também restrições temporais, algumas vezes conflitantes entre si, e
que devem ser atendidas para que o sistema funcione corretamente.
Outra questão específica destes sistemas é que cada microcontrolador
apresenta uma arquitetura de hardware e um conjunto de periféricos diferentes.
Mesmo dois projetos que utilizam o mesmo microcontrolador, mas possuem um
arranjo eletrônico diferente dos componentes externos, apresentam diferenças
suficientes para que os códigos não possam ser compartilhados. Como cada
projeto visa atender requisitos muito específicos, esta variabilidade é bastante
comum. Isto exige que os programadores entendam as relações básicas entre
os componentes da placa utilizada para desenvolver códigos funcionais.
Todo sistema embarcado é composto por uma unidade de processamento,
que é um circuito integrado, fixado a uma placa de circuito impresso. Possuem
uma capacidade de processamento de informações vinda de um software que
está sendo processado internamente nessa unidade, logo o software está
5

embarcado na unidade de processamento. Todo software embarcado é


classificado de firmware.

Figura 2 – Lógica de um sistema embarcado usando um microprocessador como


unidade de processamento.

HISTÓRIA
O termo sistema embarcado tem sua origem no fim da década de 1960.
Nessa época o que existia era um pequeno programa de controle funcional de
telefones. Logo este pequeno programa escrito em assembler estava sendo
usado em outros dispositivos, entretanto de forma customizada, não específica
para dado dispositivo, na realidade eram adaptados os sinais de entrada e
saída definidos no programa, para as características do dispositivo, porém sem
modificar qualquer linha de código do programa feito.
Posteriormente com o advento de microprocessadores especialistas, foi
possível desenvolver software específico para os variados tipos de
processador. Os programas eram escritos em linguagem de máquina. Na
década de 1970 começavam a surgir bibliotecas de códigos direcionados para
sistemas embarcados específicos com processadores específicos. Atualmente
os sistemas embarcados podem ser programados em linguagens de alto nível
e possuem sistemas operacionais.

LINGUAGEM “C” UTILIZADA NO PROJETO


6

C (pronunciado como a letra c: /’se/) é uma linguagem de propósito geral,


imperativa, com suporte à programação estruturada e recursão, possuindo
variáveis de tipos definidos. O modo como foi projetada permite gerar códigos
de máquina bastante eficientes, considerando as arquiteturas mais comuns de
processadores. Além disso, apresenta ferramentas que facilitam o acesso a
hardware. Por esses motivos, tem sido utilizada como substituta para
aplicações que utilizavam a linguagem assembly.
Ela foi inicialmente desenvolvida por Dennis Ritchie, entre 1969 e 1973, na
empresa AT&T Bell Labs. O primeiro grande projeto com essa linguagem, e
que ajudou muito a sua popularização, foi a reimplementação do sistema
operacional Unix.
Ela herdou muitas características da linguagem B, que era utilizada nos
minicomputadores da época dentro dos laboratórios da Bell Labs. Por ser
sucessora da linguagem B, chamaram-na simplesmente de linguagem C.
A linguagem C foi padronizada pelo instituto de padrões americanos, ANSI,
em 1989, e pela ISO, desde 1990, sendo conhecida respectivamente como
C89 ou C90. Uma revisão menor foi feita em 1995 pela ISO.
Em 1999 a ISO realizou mudanças na linguagem, como a possibilidade de
comentários em uma única linha, melhor suporte a cálculos de ponto flutuante
(IEEE754) e funções inline. A ANSI adotou esse padrão em 2000. É comum
referenciarmos este padrão como C99.
O padrão em vigor é de 2011, sob o nome ISO/IEC 9899:2011. Este
documento apresenta uma interface comum para criação de threads, um
melhor suporte aos diferentes padrões de codificação de caracteres, macros
para operação com números imaginários, entre outras novidades.
A modularização é um recurso muito importante apresentado nas
linguagens de programação, onde um programa pode ser dividido em sub-
rotinas específicas. A linguagem C possibilita a modularização por meio das
funções.
As funções permitem que um determinado código possa ser reutilizado em
diversos locais sem a necessidade de se copiar todo o algoritmo diversas
vezes. Além disso, por meio dos parâmetros, é possivel executar o código com
diferentes valores de entrada. Para melhor organizar o código é comum reunir
7

as funções com mesma funcionalidade num mesmo arquivo, criando uma


biblioteca.

A biblioteca, portanto, é um conjunto de funcionalidades reunidas de modo


a facilitar a utilização por parte do programador. Estas funcionalidades podem
ser agrupadas de diversas maneiras.
Além das funções, a biblioteca pode conter definições de tipos, valores,
macros e até armazenar valores dentro de si.
A tabela 1 apresenta o histórico do desenvolvimento dessa linguagem de
programação. As linguagens BCPL e B constam na tabela por serem as
linguagens que influenciaram no desenvolvimento da linguagem C.

LINGUAGEM ANO DESENVOLVIDA POR


BCPL 1966 Martin Richards
B 1970 Ken Thompson, Dennis Ritchie
C 1972 Dennis Ritchie
K&R C 1978 Brain Kernighan and Dennis Ritchie
ANSI C 1989 Comitê da ANSI
ANSI/ISO C 1990 Comitê da ISO
ANSI/ISO C/NA1 1995 Comitê da ISO
C99 1999 Comitê da ISO
C11 2011 Comitê da ISO

Tabela 1: Histórico do desenvolvimento da linguagem C

Devido à popularidade que atingiu na época, a linguagem C influenciou


várias linguagens atuais, incluindo C++, D, Go, Rust, Java, JavaScript, Limbo,
LPC, C#, Objective-C, Perl, PHP, Python e Verilog. Estas linguagens possuem
grande parte de suas estruturas de controle e outras caraterísticas básicas
muito similares à C, com uma estrutura sintática muito parecida.
Vários fabricantes e comunidades de software livre possuem ferramentas
de compilação em linguagem C para quase todas as arquiteturas de
processadores e sistemas operacionais existentes. Os fabricantes de
8

processadores e microcontroladores em geral também disponibilizam


ferramentas de compilação para seus chips.'
Todas essas vantagens, tanto de facilidade de acesso ao hardware,
quanto de disponibilidade e portabilidade, consagraram a linguagem C como a
ferramenta ideal para programação em sistemas embarcados.

BIBLIOTECA
Uma biblioteca em linguagem C é um conjunto de funcionalidades reunidas
de modo a facilitar a utilização por parte do programador. Estas funcionalidades
podem ser agrupadas de diversas maneiras.
A biblioteca funciona como modo de organização do código. À medida que
o projeto cresce em complexidade, manter todas as funções num mesmo
arquivo pode dificultar uma futura manutenção ou atualização do programa.
Outra vantagem do uso de uma biblioteca é a capacidade de reutilização
de código. Uma vez criada a biblioteca matemática, seu código pode ser
utilizado em vários outros projetos. De fato, algumas funcionalidades são tão
básicas que as bibliotecas que suprem essa necessidade são padronizadas e
disponibilizadas diretamente com o compilador de linguagem C. Essas
bibliotecas formam o conjunto das bibliotecas padrão, ou standard libs.
Para a primeira versão da linguagem C, havia 15 bibliotecas padronizadas,
que proviam desde funções matemáticas, como seno e cosseno, passando
pela manipulação de tempo e strings até o controle de alocação de memória ou
geração de números aleatórios. Em 1995, três novas bibliotecas foram
adicionadas, em geral para gerenciar operações com caracteres. Em 1999,
seis novas bibliotecas, a maioria para operações numéricas, foram inseridas.
Em 2011, foram adicionadas mais cinco, totalizando 29. A relação destas
bibliotecas pode ser encontrada na tabela 2.
Em geral, a biblioteca é composta de um arquivo de cabeçalho, ou header,
com extensão .H, e um arquivo de código, com extensão .C. O arquivo .H
funciona como um índice ou resumo, explicando quais funcionalidades foram
implementadas no arquivo de código. Em geral, são disponibilizados apenas os
protótipos de função e definição de tipos no header. As funções são
implementadas no arquivo .C, bem como o armazenamento de informações.
9

NOME DEFINIDA EM DESCRIÇÃO


<assert.h> Auxilia no teste e depuração do programa.
<complex.h> C99 Funções para manipulação de números complexos.
<ctype.h> Funções para manipulação de caracteres.
<errno.h> Definições dos códigos de erros reportados pelas bibliotecas.
Conjunto de funções para controlar o comportamento dos
<fenv.h> C99
números com ponto flutuante.
Define contantes com macros para explicitar as propriedades
<float.h>
dos números flutuantes.
Define tipos de variáveis inteiras com tamanhos definidos e
<inttypes.h> C99
como formatá-las para impressão/leitura.
Macros para expressar tokens padronizados. Para programar
<iso646.h> 95
com caracteres do tipo ISO 646.
Define contantes com macros para explicitar as propriedades
<limits.h>
dos números inteiros.
Utilizada para garantir acentuação correta de acordo com o
<locale.h>
padrão de acentuação do sistema.
<math.h> Define as funções matemáticas mais comuns.
<setjmp.h> Declara as macros setjmp e longjmp.
<signal.h> Define funções para tratamento de eventos/sinais.
<stdalign.h> C11 Especifica o alinhamento dos objetos/variáveis na memória.
<stdarg.h> Para funções com quantidade de argumentos variáveis.
Para simplificar operações atômicas em objetos compartilhados
<stdatomic.h> C11
entre threads.
<stdbool.h> C99 Define o tipo booleano.
<stddef.h> Define um conjunto extenso de macros.
<stdint.h> C99 Define tipos de variáveis inteiras com tamanhos definidos.
<stdio.h> Funções para entrada e saída de dados.
Cria funções para conversão numérica, geração de números
<stdlib.h>
aleatórios, alocação de memórias e controle de processos.
<stdnoreturn.h> C11 Estruturas para especificar funções que nunca retornam.
<string.h> Funções para manipulação de strings.
<tgmath.h> C99 Funções matemáticas para tipos genéricos.
<threads.h> C11 Funções para gerenciamento de múltiplas threads.
<time.h> Funções para manipulação de hora e data.
<uchar.h> C11 Funções para manipulação de caracteres padrão Unicode.
<wchar.h> 95 Funções para manipulação de string com caracteres Unicode.
<wctype.h> 95 Funções para classificar e converter caracteres Unicode.

Tabela 2: Bibliotecas padrão da linguagem C


10

PROCESSO DE COMPILAÇÃO
O processo de compilação pode ser visualizado como a tradução de um
texto. Se estivermos utilizando um compilador de linguagem C, a linguagem
original é a C e a linguagem final é geralmente um código binário entendido
pelo processador.
O arquivo de entrada contém o programa escrito pelo programador,
também conhecido como código fonte. Este arquivo pode ser editado em
qualquer ferramenta de edição de texto.
O arquivo de saída, ou código de máquina, indica ao processador como
executar os comandos que foram definidos no arquivo texto. O arquivo binário
depende da arquitetura de processador utilizado. O mesmo código em C gerará
arquivos diferentes para processadores diferentes.
O processo de compilação é realizado em quatro etapas que, em geral,
são sequenciais: pré-compilação, compilação, assemblagem e linkagem,
conforme apresentado na figura 3.

Figura 3: Processo de compilação de um programa em C

A etapa de pré-compilação é responsável por ler o código fonte e realizar


substituições no código ou operações de configuração do compilador. Esta
etapa processa os comandos incluídos no código especificamente para esta
função, como #define, #include, #ifndef, #endif, #pragma, entre outros. Os
comentários também são removidos nesta etapa. Em geral, os comandos
aceitos na etapa de pré-compilação são iniciados pelo símbolo de hash “#”. Os
11

arquivos .C e .H são processados e arquivos temporários são gerados com as


mudanças necessárias.
A compilação é a etapa mais complexa. A tradução efetiva do código C
para assembly é realizada nesta etapa. Assembly é uma linguagem de baixo
nível que representa de modo simbólico os comandos da linguagem de
máquina. No entanto, ela ainda não é utilizável pois não se encontra em
formato binário, além de não estar devidamente localizada na memória do
processador. Nesta etapa também é executado o processo de otimização do
código.
A otimização tem como objetivo reduzir a quantidade de código para
diminuir o tamanho do arquivo final ou alterar o fluxo do programa para que
este possa ser executado mais rapidamente. Em geral, esses dois objetivos
são opostos, de modo que um programa menor provavelmente será mais
demorado. Deve-se tomar cuidado com o processo de otimização, pois o
compilador faz suposições que podem não ser verdadeiras para o ambiente
embarcado, principalmente se estivermos operando com periféricos.
No fim da compilação para cada arquivo .C é gerado um arquivo
intermediário em assembly.
A linkagem é o processo de reunir todos os arquivos intermediários,
resultantes da compilação, num único arquivo. Neste momento, todas as
referências são processadas e um arquivo final é montado contendo todo o
código. As bibliotecas pré-compiladas, como as bibliotecas padrão da
linguagem C (stdlib), são incorporadas estaticamente ao programa neste
momento. O processo de linkagem dinâmica é pouco utilizado no ambiente
embarcado, pois geralmente existe apenas um programa que fará uso da
biblioteca, não havendo necessidade de compartilhá-la dinamicamente.
A assemblagem é a última etapa. Ela é responsável por transcrever o
código intermediário em assembly para linguagem de máquina, substituindo as
referências relativas por referências fixas de endereçamento e posicionamento
na memória. O resultado desta etapa é o arquivo binário.
Dependendo do compilador utilizado, é possível que ele gere um arquivo
binário com a extensão .s19. Este arquivo contém o código de máquina, mas
em formato de texto. Isto facilita o processo de transmissão do arquivo para um
gravador que vai convertê-lo em binário e armazená-lo no chip, pois, além do
12

código, ele contém valores de conferência para garantir que os dados não
foram alterados na transmissão.

EXEMPLOS E APLICAÇÕES
Os sistemas embarcados estão inseridos em milhares de dispositivos
comuns utilizados no dia a dia como em eletrodomésticos, aparelhos de áudio
e vídeo, celulares, carrinho com controle remoto e outros. A Seguir alguns
exemplos de aplicações:

 SETOR AUTOMOBILÍSTICO
Um veículo top de linha é um excelente exemplo de um complexo sistema
literalmente “embarcado”. Centenas de sensores fornecem informações sobre
todo o funcionamento do veículo. Várias unidades de processamento
independentes atuam em regiões diferentes e se comunicam entre si, captando
os sinais destes sensores e fazendo com que as ações referentes a cada caso
sejam tomadas.

Figura 4 – Sistemas embarcados em um veículo: Sensor de proximidade, ângulo e


atuador para freios. Todos os sistemas se comunicam entre si através de uma central
para controle do diagnóstico do veículo.
13

 AQUISIÇÃO DE DADOS – DATA LOGGER


A aquisição de dados é um exemplo de aplicação mais utilizada em
Sistemas embarcados. Consistem de sistemas que através de sensores
(temperatura, umidade, pH e outros) capturam as variáveis ambientes a serem
analisadas e são gravadas em memória para consultas posteriores. O Sistema
além de monitorar o ambiente, com adição de atuadores ao projeto, pode ter a
capacidade de controlar as variáveis ambiente com base em um critério
estabelecido pelo projetista do sistema.

Figura 5 – Data Logger para Temperatura do ar.

 SISTEMAS DE CONTROLE
Controles em malha fechada com realimentação em tempo real. Geralmente são
aplicações mais robustas, com placas dedicadas e múltiplos sensores de entrada e saída.
Muitas vezes fornecem pouca interação com o usuário, mostrando sinalizações através
de LEDs. Usados nos motores de automóveis, processos químicos, controle de vôo,
usinas nucleares, aplicações aeroespaciais e monitoramento e controle de variáveis
ambiente (temperatura, umidade, pH do ar).
14

Figura 6 – Sistema de Controle Industrial com Supervisório

 PROCESSAMENTO DE SINAIS
Onde envolve um grande volume de informação a ser processada
em curto espaço de tempo. Os sinais a serem tratados são digitalizados
através de conversores Analógico/Digital, processados e novamente
convertidos em sinais analógicos por conversores Digital/Analógico.
Casos de tratamento de áudio, filtros, modems, compressão de vídeo,
radares e sonares, etc. Existem os DSP (Digital Signal Processor –
Processador Digital de Sinais) os microcontroladores dotados deste
recurso são os Blackfin da Analog Devices e o DsPIC da Microchip.

Figura 7 – Ambiente de desenvolvimento DSP para o dsPIC

Você também pode gostar