Sistemas Embarcados Programação Embarcada Instituto Federal de Pernambuco Coordenação de Informática/IFPE Anderson L. S. Moreira anderson.moreira@recife.ifpe.edu.br http://alsm.cc
Sistemas Embarcados Direitos de Licença Attribution ShareAlike 3.0 Você é livre para Copiar, distribuir, mostrar, e adaptar o trabalho Para fazer trabalhos derivados Para fazer uso comercial do trabalho Seguindo certas condições Atribuição. Você deve dar os devidos créditos ao autor original. Compartilhar. Se você altera, transformar ou construir em cima deste trabalho, você deverá distribuir o trabalho resultante somente sobre uma licença idêntica a está. Para qualquer reuso ou distribuição, você deve deixar claro aos outros os termos de licença deste trabalho. Qualquer destas condições podem ser modificadas se você tiver permissão do autor original. Se uso e outros direitos não são afetados pelas regras acima. License text: http://creativecommons.org/licenses/by-sa/3.0/legalcode 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 2
C EM SISTEMAS EMBARCADOS Sistemas Embarcados 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 3
Sistemas Embarcados C em sistemas embarcados C é uma linguagem de programação para sistemas embarcados dada a sua simplicidade e eficiência. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 4
Sistemas Embarcados C em sistemas embarcados C não foi originalmente criada para sistemas embarcados, e sim especificamente para mainframes e PC em 1972; Este tipicamente manipulam dados em arquivos como dos tipos inteiro, caracter, etc; Em contraste, sistemas embarcados manipulam bits; Essa aula discute a construção de manipulação de bits na linguagem C. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 5
Sistemas Embarcados C em sistemas embarcados A tabela a seguir mostra o uso das linguagens de programação em todos os tipos de sistema. Muitas pessoas questionam que C não esconde muitos detalhes de baixo nível para o desenvolvedor. Porém um mestre em C é um programador excelente em qualquer linguagem http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 6
Sistemas Embarcados Exercícios # Questão Resposta 1 C e a linguagem relacionada C++ representam as principais linguagens de sistemas embarcados em 80% (segundo pesquisa de 2013). 2 C foi originalmente desenvolvida para sistemas embarcados. 3 A linguagem Assembly é a linguagem principal para metade dos sistemas embarcado. 4 Fluência em C é raramente útil fora do ambiente de sistemas embarcados Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 7
TIPOS DE DADOS EM C Sistemas Embarcados 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 8
Sistemas Embarcados Tipos de dados em C Muitos tipos de dados em C são comumente utilizados para representar inteiros em programas de sistemas embarcados. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 9
Sistemas Embarcados Tipos de dados em C A variável cujo valor só pode variar de 0 a 100 poderia ser melhor declarada como: unsigned char; Uma variável cujo valor só pode variar de -999 a 999 pode ser melhor declarada como: signed short; Usando o menor tipo possível garante que o espaço limitado em sistemas embarcados é conservado; 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 10
Sistemas Embarcados Tipos de dados em C Notem que os tipos de dados unsigned representam números inteiros positivos, enquanto tipos signed representam números inteiros positivos e negativos; Se uma variável é usada para representar uma série de bits (em vez de um número), então um tipo unsigned deve ser usado. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 11
Sistemas Embarcados Tipos de dados em C Memória unsigned char numa = 7; unsigned long numb = 7; numa = numa + 1; numb = numb +1; 94 95 96 00000111 00001000 numa 00000111 numb 97 00000000 ULA char: Apenas 1 byte long: 4 bytes char: apenas 1 byte por operação long: 4 operações de byte (move bytes para ULA, faz a conta, move de volta) 98 99 00000000 00000000 00001000 00000111 00000111 00000000 00000000 00000000 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 12
Sistemas Embarcados Tipos de dados em C Sistemas Embarcados comumente lidam com itens de dados de 1-bit. C NÃO tem o tipo de dados 1-bit!!!; Tipos de dados de 1-bit são tipicamente representados usando o tipo unsigned char como: unsigned char mybitvar; O programador apenas associa a variável 0 ou 1, exe.: mybitvar = 1, mesmo se esta possa ter valores inteiros acima de 255 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 13
Sistemas Embarcados Tipos de dados em C O programador apenas atribui a variável com 0 ou 1, exe.:, mybitvar = 1, embora a variável poderia ser atribuída com números inteiros até 255; Verificar se tal variável é 1 ou 0 é geralmente feito sem comparação explícita de 1 ou 0, ao invés disso, é feito como se (mybitvar) se (!mybitvar) 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 14
Sistemas Embarcados Tipos de dados em C 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 15
Sistemas Embarcados Tipos de dados em C Em C existem tipos de dados float e double para representar pontos flutuantes como 98,6 ou 6,02 x 10 23 ; Muitos programadores de sistemas embarcados evitam utilizar tipos de dados extensos; Justamente para manter pequeno, baixo custo e pouco consumo; Mas estes tipos devem ser usados em ambiente de software. Então vale o bom senso e a necessidade. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 16
Sistemas Embarcados Tipos de dados em C Uma boa prática de programação em SE é nomear as variáveis com o prefixo em minúscula, indicando o tipo de dado: uc, us e ul unsigned char, short e long; sc, ss e sl signed char, short e long; b para bit; char é chamado desta forma por causa que é comumente usado em programação para desktop para representar um valor inteiro de 8 bits ASCII. char é realmente um inteiro! Em C a opção signed pode ser omitida: char I1 = signed char I1 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 17
Sistemas Embarcados Tipos de dados em C Infelizmente, embora a largura dos tipos citados são bastante comuns, C define de fato as larguras pelo mínimo das larguras. Pode de modo que um compilador pode por exemplo criar um long como 64 bits; Assim, um programador nunca deve assumir a largura exata: Um programa não deve incrementar uma "unsigned char" e esperar que ele passe além de 255 para 0, pois o char poderia ser de 16 bits. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 18
Sistemas Embarcados Tipos de dados em C Outra triste realidade é que C permite que uma variável para ser declarado como um mero tipo int, a largura é dependente do compilador. Devido à imprevisibilidade do int, evite usar o tipo arbitrariamente. Seguindo estas convenções, melhora a portabilidade do código, que é a capacidade de recompilar código para um outro microprocessador sem alterações indesejáveis no comportamento do programa. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 19
Sistemas Embarcados Tipos de dados em C A representação de cada um dos tipos de dados é binária. Para um 8-bits unsigned char uci1: 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 20
Sistemas Embarcados Tipos de dados em C Tipos de dados signed em C usa duas representações complementares. Nível de bit char = 127 Representação interna: 01111111 Se for -128 = 10000000-1 = 11111111 Lembrando das aulas de arquitetura (representação de números negativos): -1 00000001 (magnitude 1) 11111110 (complementar) 11111110 + 1 = 11111111 (add 1) -128 10000000 (magnitude 128) 01111111 (complementar) 01111111 + 1 10000000 (add 1) 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 21
Sistemas Embarcados Tipos de dados em C Escolhendo o tipo apropriado Propósito Armazenar a idade de uma pessoa em anos Armazenar a velocidade de um avião Armazenar a carga restante de uma bateria em joules Armazenar em metros a elevação acima/abaixo do nível do mar da terra Declaração da Variável unsigned char age; //~<0, ~>255 unsigned short speed; //~<0, ~>64k unsigned long energy; //~<0, ~> 4Gig signed short elevation; //pode ser < 0, ~>32k ou <-32k 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 22
Sistemas Embarcados Exercícios # Questão Resposta 1 Quantos bits é um unsigned char? 8 2 Quantos bits é um signed char? 8 3 Como é 15 em 8-bits binário? 00001111 4 Como são os bits armazenados na memória para unsigned char x = 5? 5 Como são os bits armazenados na memória para unsigned char x = 199? 00000101 11000111 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 23
Sistemas Embarcados Exercícios # Questão Resposta 6 Defina uma variável volts que tem uma extensão de -100 até +100 (inteiros apenas). Finalize com ; 7 Defina uma variável altura que irá manter a altura de um humano em metros. 8 Defina uma variável birthyear que irá manter o ano de nascimento de uma pessoa. Extensão de 1 D.C até hoje. 9 Defina uma variável distmoon que irá manter a distância em quilômetros da lua até a terra em um determinado dia. 10 Defina uma variável botao que irá indicar quando um botão é pressionado ou não. signed char volts; unsigned char altura; unsigned short birtyear; unsigned long distmoon; unsigned char botao; 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 24
RIMS E/S Sistemas Embarcados 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 25
Sistemas Embarcados Definição de variáveis de E/S implícita no RIMS No RIMS, cada entrada e saída do microcontrolador (E/S) é implicitamente definida como uma variável global: unsigned char A0; unsigned char A1;..., unsigned char B0; etc. Um item tem intenção de representar um bit simples, como B0 em RIMS que apresenta apenas dois valores 1 ou 0; RIMS define duas variáveis globais adicionais: A representa uma entrada de 8-bits como um número decimal B é uma saída de 8-bits 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 26
Sistemas Embarcados Definição de variáveis de E/S implícita no RIMS Variáveis globais implicitamente definida são lugares no ambiente de programação de microcontroladores, habilitando acesso a pinos de E/S como também a recursos do microcontrolador. No caso do RIMS o arquivo RIMS.h contém as definições de A e B. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 27
Sistemas Embarcados Definição de variáveis de E/S implícita no RIMS bits agrupados nativos como A e B permite ao programador tratar as E/S do RIMS de 8 bits como números decimais de 8-bits ; A pode representar um número 12 que vem de um sensor de temperatura como um número binário de 8- bits 00001100; O programador pode usar A em uma comparação aritmética como A > 15 ou como um cálculo newtemp = A+5. O programador pode escrever um número B como B = 15 que irá causar o aparecimento no RIMS como 00001111; Pode escrever também B = A. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 28
Sistemas Embarcados Definição de variáveis de E/S implícita no RIMS Como B é uma variável global, o programa pode ler e escrever diretamente nesta; No entanto a entrada A é automaticamente escrita pelo microcontrolador e nunca deverá ser escrita por um programa, apenas lida; No RIMS escrever em A resulta em um runtime error 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 29
Sistemas Embarcados Observação A palavra reservada const, acrônimo para constante, pode preceder qualquer declaração de variável, como: const unsigned char i1 = 5 ; O valor de uma variável constante NÃO podem ser alteradas pelo código posteriormente e, portanto, pode ajudar a evitar erros futuros; Uma constante variável deve ser inicializada quando declarada. No exemplo 5 é uma constante e i1 é uma constante variável. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 30
Sistemas Embarcados Definição de variáveis de E/S implícita no RIMS CUIDADO: Os microcontroladores diferem em como eles tratam variáveis de entrada e saída, especialmente por causa da maioria dos microcontroladores permite cada pino ser configurado tanto como entrada como saída. O programador deve ler cuidadosamente o datasheet ou as instruções. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 31
Sistemas Embarcados Exercícios # Questão Resposta 1 Inicialize o primeiro pino de saída do RIMS para 1. B0=1; 2 Inicializa as 8 saídas de bits do RIMS para o decimal 0. B=0; 3 Inicializa a primeira saída do RIMS para a última entrada do RIMS B0=A7; 4 Inicializa as saídas do RIMS com as entradas menos 1. Trate como um número decimal. B=A-1; 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 32
Sistemas Embarcados Exercícios # Questão Resposta 5 Inicialize A7 com 1. Não é possível 6 Inicializa as 8 saídas de bits do RIMS para o decimal 0. X = B7; 7 Escreva uma expressão (sem parênteses) que avalia se verdadeiro se A5 é 1. if ( A5 ou A5 ==1 ) { x = B0; } 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 33
HEXADECIMAL Sistemas Embarcados 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 34
Sistemas Embarcados Hexadecimal Comumente um item 8-bit unsigned não é usado como um número, mas sim como oito bits distintos.; Por exemplo, se as oito saídas do RIMS estão conectadas a oito lâmpadas e o programador quer acender todas, este pode escrever B = 255 (por causa que 255 é 11111111); No entanto, 255 não convém diretamente a intenção do programador. O programador pode escrever B = b11111111 ou algo semelhante, mas C infelizmente não tem suporte a binário. Mas, felizmente, C suporta as constantes hexadecimais, que estão mais próximos do ideal. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 35
Sistemas Embarcados Hexadecimal Hexadecimal ou hex é um número de base 16 onde cada dígito pode ter o valor de 0, 1,..., 8, 9, A, B, C,..., F. A é 10, B é 11, C é 12 e assim vai... 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 36
Sistemas Embarcados Exercícios 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 37
Sistemas Embarcados Exercícios 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 38
Sistemas Embarcados Exercícios 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 39
Sistemas Embarcados Exercícios 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 40
Sistemas Embarcados Hexadecimal Na linguagem C, uma constante em hex é precedido por 0x. 0xFF representa b11111111 Cada digito hexadecimal corresponde a 4 bits (nibble) B = 0xFF inicializa todas as saídas do RIMS para 1 0xFF é mais claro que 255; B = 0xAA inicializa todas as saídas para 10101010 (170d) 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 41
Sistemas Embarcados Hexadecimal Boas práticas em SE! Sempre usem hexadecimal do que os números decimais quando tenham a intenção de escrever um padrão; Mesmo quando o padrão em decimal para binário é conhecido para evitar futuras confusões: Para inicializar todas as saídas com zero B = 0x00 melhor que B = 0. B0 com 1 e B1-B7 com 0 use B = 0x01 1 byte 8 bits 1 palavra 16 bits 1 palavra dupla 32 bits 1 palavra quadrupla 64 bits 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 42
Sistemas Embarcados Hexadecimal binário (62) 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 43
Sistemas Embarcados Hexadecimal binário (62) 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 44
Sistemas Embarcados Hexadecimal binário (62) 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 45
Sistemas Embarcados Hexadecimal binário (62) bits desejados hexa (62) 240 não condiz com os bits desejados 0xFF é melhor 1 digito hex para cada 4 dígitos binário (por causa 2^4 é 16) 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 46
Sistemas Embarcados Exercícios # Questão Resposta 1 Inicialize o primeiro pino de saída do RIMS para 1 B0=1; 2 Inicialize o primeiro pino de saída do RIMS para 1 e os demais para 0. B=0x01; 3 Inicialize o último pino do RIMS para 1 e os demais para 0. B=0x80; 4 Inicializa todas as saídas do RIMS para 1. B=0xFF; 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 47
Sistemas Embarcados Exercícios # Questão Resposta 5 Inicialize as saídas do RIMS para 01010101 B=0x55; 6 Preencha o espaço em branco da expressão para detectar que todas as 8 entradas do RIMS são 1s. A == 7 Qual expressão detecta que o primeiro pino do RIMS é 1? 0xFF; A0 ou A0==1; 8 Qual expressão detecta que A0 é a única entrada do RIMS é 1? A==0x01; 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 48
Sistemas Embarcados Simples exemplo hexadecimal 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 49
Sistemas Embarcados Esquemático 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 50
Sistemas Embarcados Uma possível solução 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 51
Sistemas Embarcados Exercício Considere um display de 7 segmentos de um SE com um discador que está conectado e pode inicializar as entradas de A3...A0 com os binários de 0 a 9 e para as saídas de B6...B0. Responda: Qual saída de B deverá ser inicializada para o caso 3? B0 B2 B3 B5 B6 Para qual valor deverá ser B inicializado para o caso 3? 0x6D Complete caso seja o esquema utilizando a função case. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 52
Sistemas Embarcados Exercício de Nota Escreva um programa em C no RIMS que repetidamente executa B = 7. Note que as saídas B2, B1 e B0 tornam-se 1, porque 7 = 00000111 (perceba que 7 aparece na abaixo dos pinos de saída no RIMS). Depois, inicialize os switches de entrada A3=1, A2=0, A1=0 e A0=1 com as outras entradas em 0 e note que 9 aparece. Por que? Escreva e execute um programa no RIMS que inicializa B igual a A + 1; Escreva um programa no RIMS que inicializa B=300. O que acontece? E porque? Um carro tem um sensor que inicializa A com o peso do passageiro (se o passageiro pesar 59 kg, A7...A0 = 00111011). Isso é importante pois alguns carros só acionam o airbag com pelo mínimo. Escreva um programa no RIMS que habilita o sistema de airbag do carro (B0=1) se o peso do passageiro for igual ou maior que 48 kg. Também ligue uma luz Airbag off (B1=1) se peso > 2,5 kg mas peso < 48 kg. 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 53
Sistemas Embarcados Dúvidas? 16 de maio de 2015 anderson.moreira@recife.ifpe.edu.br 54
Sistemas Embarcados Programação Embarcada Instituto Federal de Pernambuco Coordenação de Informática/IFPE Anderson L. S. Moreira anderson.moreira@recife.ifpe.edu.br