Revisão de linguagem C para Sistemas Embarcados

48

description

Segunda aula: tipos de dados em linguagem C, Operações aritméticas, Função main(), Rotinas de tempo

Transcript of Revisão de linguagem C para Sistemas Embarcados

Page 1: Revisão de linguagem C para Sistemas Embarcados

Tipos de dados, função main e tempo

Prof. Rodrigo Maximiano Antunes de Almeida

Universidade Federal de Itajubá

[email protected]

ELT024 Tipos de dados, função main e tempo [email protected] 1 / 48

Page 2: Revisão de linguagem C para Sistemas Embarcados

Teclado

Revisão

ELT024 Tipos de dados, função main e tempo [email protected] 2 / 48

Page 3: Revisão de linguagem C para Sistemas Embarcados

Dados Importantes

Teórica:Local ⇒ Sala I.2.1.11Horário ⇒ 15:45-17:35 (ter)

Laboratório:Local ⇒ Sala LEC I / LASERHorário ⇒

P1: 8:00-9:45 (qui) ELT025 (LASER)P2: 10:15-12:00 (qui) ELT025 (LASER)P3: 15:50-17:30 (qui) ELT025 (LECI)P1: 13:30-15:10 (ter) ELT802 (LECI)

Levar a placa + adaptador de tomadaDatas Importantes *:

Prova 01 ⇒ 17/09Prova 02 ⇒ 26/11Sub ⇒ 03/12

* Datas

Todas as datas estão sujeitas a alterações

ELT024 Tipos de dados, função main e tempo [email protected] 3 / 48

Page 4: Revisão de linguagem C para Sistemas Embarcados

Linguagem CReferência circular (rev)

A função LerTemperatura() faz um teste: se o valor for maior que umpatamar chama a função EnviaSerial() com o código 0x30.

1 #include "serial.h"

2 char LerTemperatura ( vo id ) ;3 vo id AjustaCalor ( char val ) ;

A função LerSerial() receber um valor e repassa para a funçãoAjustaCalor().

1 #include "temp.h"

2 char LerSerial ( vo id ) ;3 vo id EnviaSerial ( char val ) ;

ELT024 Tipos de dados, função main e tempo [email protected] 4 / 48

Page 5: Revisão de linguagem C para Sistemas Embarcados

Linguagem CReferência circular (rev)

#include “serial.h”

char LerTemperatura(void);void AjustaCalor(char val);

temp.h

#include “temp.h”

char LerSerial(void);void EnviaSerial(char val);

serial.h

#include “serial.h”

char LerTemperatura(void);void AjustaCalor(char val);

temp.h

ELT024 Tipos de dados, função main e tempo [email protected] 5 / 48

Page 6: Revisão de linguagem C para Sistemas Embarcados

Linguagem CReferência circular (rev)

Solução: criar uma estrutura de controle para pré compilação.

1 #ifndef TAG_CONTROLE

2 #define TAG_CONTROLE

3 // todo o conteúdo do a r qu i v o vem aqu i .

5 #endif //TAG_CONTROLE

ELT024 Tipos de dados, função main e tempo [email protected] 6 / 48

Page 7: Revisão de linguagem C para Sistemas Embarcados

Linguagem CReferência circular(rev)

#infdef TEMP_H #define TEMP_H #include “serial.h”

char LerTemperatura(void); void AjustaCalor(char val);#endif

temp.h

#infdef SERIAL_H #define SERIAL_H #include “temp.h”

char LerSerial(void); void EnviaSerial(char val);#endif

serial.h

#infdef TEMP_H

//tag já definida, //pula o conteúdo

#endif

temp.h

ELT024 Tipos de dados, função main e tempo [email protected] 7 / 48

Page 8: Revisão de linguagem C para Sistemas Embarcados

Linguagem CTipos de dados em C

Tipos de dados em C

ELT024 Tipos de dados, função main e tempo [email protected] 8 / 48

Page 9: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Toda informação que é inserida num computador é armazenada emformato binário

Cada tipo de informação contém uma quantidade diferente de bits

Cada bit pode representar informações diferentes, mesmo dentro deuma mesma variável

ELT024 Tipos de dados, função main e tempo [email protected] 9 / 48

Page 10: Revisão de linguagem C para Sistemas Embarcados

Linguagem CTipos de dados em C

Tipo Bits Bytes Faixa de valores

char 8 1 -128 à 127int 16 2 -32.768 à 32.767�oat 32 4 3,4 x 10-38 à 3,4 x 1038

double 64 8 3,4 x 10-308 à 3,4 x 10308

ELT024 Tipos de dados, função main e tempo [email protected] 10 / 48

Page 11: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Quando resolvemos codi�car uma informação num formato digital, eportanto �nito, sempre existe perda de

informaçãoresoluçãoamplitude

ELT024 Tipos de dados, função main e tempo [email protected] 11 / 48

Page 12: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Exemplos:

1 f l o a t x = 0 ;2 whi le ( x != 4)3 {4 printf ( "i" ) ;5 x += 0.4 f ;6 }

1 char x = 0 ;2 whi le ( x < 200)3 {4 printf ( "i" ) ;5 x++;6 }

ELT024 Tipos de dados, função main e tempo [email protected] 12 / 48

Page 13: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Conversão Binário-decimal

Dividir o número por 2

Anotar o valor do resto (0 ou 1)

Se o valor é maior que 0 voltar ao número 1

Escrever os valores obtidos através do passo 2 de trás para frente.

Apresentar o resultado

ELT024 Tipos de dados, função main e tempo [email protected] 13 / 48

Page 14: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Exercicio 01) Converter os números

18

513

73

60

-15

ELT024 Tipos de dados, função main e tempo [email protected] 14 / 48

Page 15: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Número 18:

182 = 9, resto 092 = 4, resto 142 = 2, resto 022 = 1, resto 012 = 0, resto 1

ELT024 Tipos de dados, função main e tempo [email protected] 15 / 48

Page 16: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

A representação de números negativos é feita através do MSB0 = positivo1 = negativo

Método de conversão: complemento de dois

ELT024 Tipos de dados, função main e tempo [email protected] 16 / 48

Page 17: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Complemento de doisDe�nir tamanho da palavraAchar o representação em binário positiva com a mesma magnitudeInverter todos os bitsSomar um ao resultado

ELT024 Tipos de dados, função main e tempo [email protected] 17 / 48

Page 18: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Números fracionários (ponto �utuante)São divididos em expoente, mantissa e sinalSinal ocupa apenas um bit, como nos inteirosA mantissa representa os algarismos signi�cativosO expoente representa a magnitude

Ponto �xo

ELT024 Tipos de dados, função main e tempo [email protected] 18 / 48

Page 19: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Base HexadecimalPossui 16 "unidades"diferentes.10 algarismos mais 6 letrasFacilita escrita de valores bináriosFácil conversão bin-hex

ELT024 Tipos de dados, função main e tempo [email protected] 19 / 48

Page 20: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Dec Bin Hex Dec Bin Hex

0 0000 0 8 1000 81 0001 1 9 1001 92 0010 2 10 1010 A3 0011 3 11 1011 B4 0100 4 12 1100 C5 0101 5 13 1101 D6 0110 6 14 1110 E7 0111 7 15 1111 F

ELT024 Tipos de dados, função main e tempo [email protected] 20 / 48

Page 21: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Exercicio 02) Converter os números

1810 - 10010251310 - 100000000127310 - 100100126010 - 1111002-1510 - 11110012_8bits

ELT024 Tipos de dados, função main e tempo [email protected] 21 / 48

Page 22: Revisão de linguagem C para Sistemas Embarcados

Linguagem CConversão Binário, Decimal, Hexadecimal

Exercicio 02) Converter os númeroscomo: 1810= 1-00102

12 = 11600102 = 216

logo :

100102. = 1216.

ELT024 Tipos de dados, função main e tempo [email protected] 22 / 48

Page 23: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de tamanho e sinal

Modi�cadores de tamanho e sinal

ELT024 Tipos de dados, função main e tempo [email protected] 23 / 48

Page 24: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de tamanho e sinal

Tipo Bytes Excursão máxima

unsigned char 1 0 à 255signed char 1 -128 à 127unsigned int 2 0 à 65.535signed int 2 -32.768 à 32.767long int 4 -2.147.483.648 à 2.147.483.647unsigned long int 4 0 à 4.294.967.295short int 2 -32.768 à 32.767

ELT024 Tipos de dados, função main e tempo [email protected] 24 / 48

Page 25: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Acesso

Modi�cadores de Acesso

ELT024 Tipos de dados, função main e tempo [email protected] 25 / 48

Page 26: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Acesso

1 #define X (* ( near unsigned char *) 0xF83 )2 vo id main ( vo id )3 {4 whi le ( X!=X ) ;5 }

ELT024 Tipos de dados, função main e tempo [email protected] 26 / 48

Page 27: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Acesso

Compilando o código anterior temos em assembler:

1 // S t a r t i n g pCode b l o ck2 S_Teste__main code

3 _main :4 . line 19 // Teste . c wh i l e (X!=X) ;

6 RETURN

ELT024 Tipos de dados, função main e tempo [email protected] 27 / 48

Page 28: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Acesso

1 #define X (* ( v o l a t i l e near unsigned char *) 0xF83 )2 vo id main ( vo id )3 {4 whi le ( X!=X ) ;5 }

ELT024 Tipos de dados, função main e tempo [email protected] 28 / 48

Page 29: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Acesso

1 S_Teste__main code // S t a r t i n g pCode b l o ck2 _main :3 _00105_DS_ :4 . line 19 // Teste . c wh i l e (X != X) ;5 MOVLW 0x83 // p r im e i r a p a r t e do ende reço6 MOVWF r0x00

7 MOVLW 0x0f // segunda pa r t e do ende reço8 MOVWF r0x01

9 MOVFF r0x00 , FSR0L

10 MOVFF r0x01 , FSR0H

11 MOVFF INDF0 , r0x00 // r e a l i z a p r im e i r a l e i t u r a12 MOVLW 0x83 // p r im e i r a p a r t e do ende reço13 MOVWF r0x01

14 MOVLW 0x0f // segunda pa r t e do ende reço15 MOVWF r0x02

16 MOVFF r0x01 , FSR0L

17 MOVFF r0x02 , FSR0H

18 MOVFF INDF0 , r0x01 // r e a l i z a segunda l e i t u r a19 MOVF r0x00 , W

20 XORWF r0x01 , W

21 BNZ _00105_DS_ // f a z o t e s t e para i g u a l d a d e22 RETURN

ELT024 Tipos de dados, função main e tempo [email protected] 29 / 48

Page 30: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Acesso

Utilização de const:

1 #define X (* ( v o l a t i l e const near unsigned char *) 0xF83 )2 // i n i c i o do programa3 vo id main ( vo id )4 {5 X = 3 ;6 }

A compilação resulta em erro:

1 Teste . c : error 33 : Attempt to assign value to a constant ←↩variable (=)

ELT024 Tipos de dados, função main e tempo [email protected] 30 / 48

Page 31: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Posicionamento

Modi�cadores de Posicionamento

ELT024 Tipos de dados, função main e tempo [email protected] 31 / 48

Page 32: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cadores de Posicionamento

Existem dois modi�cadores de posicionamentonear

far

Não são padronizadas pela ISO C(99)Indicam ao compilador a região em que a variável deve ser colocada

near - região de acesso mais rápidofar - região de acesso normal

ELT024 Tipos de dados, função main e tempo [email protected] 32 / 48

Page 33: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cador de persistência

Modi�cador de persistência

ELT024 Tipos de dados, função main e tempo [email protected] 33 / 48

Page 34: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cador de persistência

A persistência de uma variável pode ser assegurada com o modi�cadorstatic

Padronizada pela ISO C(99)

Garante que não haverá perda de informação na variável

Uma região de memória é reservada apenas para a variável em questão

1 // c r i a um contado r p e r s i s t e n t e que é2 // inc rementado a cada chamada de função3 i n t ContadorPersistente ( i n t reseta ) {4 char variavel_persistente ;5 i f ( reseta ) { variavel_persistente = 0;}6 e l s e { re tu rn ( variavel_persistente++); }7 re tu rn −1;8 }

ELT024 Tipos de dados, função main e tempo [email protected] 34 / 48

Page 35: Revisão de linguagem C para Sistemas Embarcados

Linguagem CModi�cador de persistência

1 // c r i a um contado r p e r s i s t e n t e que é2 // inc rementado a cada chamada de função3 i n t ContadorPersistente ( i n t reseta )4 {5 s t a t i c char variavel_persistente ;6 i f ( reseta )7 {8 variavel_persistente = 0 ;9 }

10 e l s e11 {12 re tu rn ( variavel_persistente++);13 }14 re tu rn −1;15 }

ELT024 Tipos de dados, função main e tempo [email protected] 35 / 48

Page 36: Revisão de linguagem C para Sistemas Embarcados

Linguagem COperações Aritiméticas

Operações Aritiméticas

ELT024 Tipos de dados, função main e tempo [email protected] 36 / 48

Page 37: Revisão de linguagem C para Sistemas Embarcados

Linguagem COperações Aritiméticas

1 vo id main ( vo id )2 {3 char var8 ;4 i n t var16 ;5 long i n t var32 ;6 f l o a t pont16 ;7 double pont32 ;8 var8 = var8 + var16 ; // 19 var8 = var8 + var8 ; // 2

10 var16 = var8 * var8 ; // 311 var32 = var32 / var16 ; // 412 var32 = pont32 * var32 ; // 513 pont16 = var8 / var16 ; // 614 pont16 = pont32 * var32 ; // 715 pont16 = 40 / 80 ; // 816 }

ELT024 Tipos de dados, função main e tempo [email protected] 37 / 48

Page 38: Revisão de linguagem C para Sistemas Embarcados

Linguagem CFunção main()

Função main()

ELT024 Tipos de dados, função main e tempo [email protected] 38 / 48

Page 39: Revisão de linguagem C para Sistemas Embarcados

Linguagem CFunção main()

0x58 Testa A0x57 300x56 A recebe0x55 Limpa A

0x59 ...

0x8D Porta B0x8C Salva em0x8B 500x8A A recebe

0x8E ...

0x03 0x550x02 Pulo0x01 0x8A

0x04 ...

0x00 PuloEndereço Instrução

ELT024 Tipos de dados, função main e tempo [email protected] 39 / 48

Page 40: Revisão de linguagem C para Sistemas Embarcados

Linguagem CFunção main()

O como indicar o ponto de início de um programa depende docompilador.

Geralmente apenas a criação da função main já é su�ciente para ocompilador

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çãomain

1 vo id main ( vo id )2 {3 // aqu i e n t r a o cód igo do programa4 }

ELT024 Tipos de dados, função main e tempo [email protected] 40 / 48

Page 41: Revisão de linguagem C para Sistemas Embarcados

Linguagem CFunção main()

Atenção!

Para sistemas embarcados a função main é a primeira a ser executada,portanto não pode receber parâmetro nenhum. Como ela é a ultima a serexecutada, também não existe a possibilidade de retornar algum valor.Deve ser declarada como:

1 vo id main ( vo id )2 {3 // I n s i r a o cód igo aqu i .4 }

ELT024 Tipos de dados, função main e tempo [email protected] 41 / 48

Page 42: Revisão de linguagem C para Sistemas Embarcados

Linguagem CFunção main()

Geralmente os sistemas embarcados são feitos para seremcontinuamente executados

As rotinas devem ser cíclicas

O sistema só para quando desligado

Atenção!

Nesta situação utiliza-se loops in�nitos.

ELT024 Tipos de dados, função main e tempo [email protected] 42 / 48

Page 43: Revisão de linguagem C para Sistemas Embarcados

Linguagem CFunção main()

1vo id main ( vo id )2{3 f o r ( ; ; )4 {5 // aqu i e n t r a o6 // cód igo p r i n c i p a l7 }8}

1vo id main ( vo id )2{3 whi le (1 )4 {5 // aqu i e n t r a o6 // cód igo p r i n c i p a l7 }8}

ELT024 Tipos de dados, função main e tempo [email protected] 43 / 48

Page 44: Revisão de linguagem C para Sistemas Embarcados

Linguagem CRotinas de Tempo

Rotinas de Tempo

ELT024 Tipos de dados, função main e tempo [email protected] 44 / 48

Page 45: Revisão de linguagem C para Sistemas Embarcados

Linguagem CRotinas de Tempo

É muito comum necessitar que o microcontrolador �que um tempo semfazer nada. Uma maneira de atingir esse objetivo é utilizar um laço for.

1 unsigned char i ;2 f o r ( i=0; i < 10 ; i++);

Atenção!

Notar que não estamos utilizando os colchetes.

ELT024 Tipos de dados, função main e tempo [email protected] 45 / 48

Page 46: Revisão de linguagem C para Sistemas Embarcados

Linguagem CRotinas de Tempo

1 // cód igo em as s emb l e r e q u i v a l e n t e do : f o r ( i =0; i <10; i++) ;2 MOVF r0x00 , W // i n i c i a l i z a W com 0 ←↩

(1 c i c l o )3 SUBLW 0x0a // co l o c a o v a l o r 10 (0 x0a ) no r e g i s t r o W ←↩

(1 c i c l o )4 MOVWF r0x00 //muda o v a l o r de W para F ←↩

(1 c i c l o )5 _00107_DS_ :6 DECFSZ r0x00 , F // decrementa F , se F>0 execu ta o próx imo ←↩

(1 c i c l o )7 BRA _00107_DS_ //" pu l a " para o l u g a r _00107_DS_ ←↩

(2 c i c l o s )

ELT024 Tipos de dados, função main e tempo [email protected] 46 / 48

Page 47: Revisão de linguagem C para Sistemas Embarcados

Linguagem CRotinas de Tempo

São gastos 3 passos para inicialização, cada um de 1 ciclo.

Cada iteração gasta 2 passos, um de 1 ciclo e um de 2 ciclos

Para um PIC a 8 MHz cada ciclo gasta 0,5 us

Se desejamos um tempo de x segundos são necessárias 2 ∗ 109 ∗ xinstruções.

ELT024 Tipos de dados, função main e tempo [email protected] 47 / 48

Page 48: Revisão de linguagem C para Sistemas Embarcados

Linguagem CRotinas de Tempo

1 unsigned char i , j , l ;2 f o r ( i=0; i < 34 ; i++) //3+34*(30 ,003+3) = 1 ,020 ,207 i n s t r u ç õ e s3 {4 f o r ( j=0; j < 100 ; j++) //3+100*(297 + 3) = 30 ,003 i n s t r u ç õ e s5 {6 f o r ( k=0; k < 98 ; k++); // 3+98*(3) = 297 i n s t r u ç õ e s7 }8 }

ELT024 Tipos de dados, função main e tempo [email protected] 48 / 48