Baixe o app para aproveitar ainda mais
Prévia do material em texto
Tipos de dados, func¸a˜o main() e rotinas de tempo Rodrigo Almeida Universidade Federal de Itajuba´ rodrigomax@unifei.edu.br ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 1 / 46 Revisa˜o Revisa˜o ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 2 / 46 Revisa˜o Dados Importantes Teo´rica: Local ⇒ Sala I.2.1.11 Hora´rio ⇒ 4T12 Laborato´rio (ELTP14): Local ⇒ Sala LEC II Hora´rio ⇒ P1: 5T12 P2: 5T34 P3: 6T12 P4: 6T34 Datas Importantes *: Prova 01 ⇒ 05/04 Prova 02 ⇒ 21/06 Sub ⇒ 05/07 * Datas Todas as datas esta˜o sujeitas a alterac¸o˜es ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 3 / 46 Revisa˜o Refereˆncia circular (rev) A func¸a˜o LerTemperatura() faz um teste: se o valor for maior que um patamar chama a func¸a˜o EnviaSerial() com o co´digo 0x30. 1 #include "serial.h" 2 char LerTemperatura(void); 3 void AjustaCalor(char val); A func¸a˜o LerSerial() recebe um valor e repassa para a func¸a˜o AjustaCalor(). 1 #include "temp.h" 2 char LerSerial(void); 3 void EnviaSerial(char val); ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 4 / 46 Revisa˜o Refereˆ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 ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 5 / 46 Revisa˜o Refereˆncia circular (rev) Soluc¸a˜o: criar uma estrutura de controle para pre´ compilac¸a˜o. 1 #ifndef TAG_CONTROLE 2 #define TAG_CONTROLE 3 // todo o conteu´do do arquivo vem aqui. 4 5 #endif // TAG CONTROLE ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 6 / 46 Revisa˜o Refereˆncia circular (rev) #ifndef TEMP_H #define TEMP_H #include “serial.h” char LerTemperatura(void); void AjustaCalor(char val); #endif temp.h #ifndef SERIAL_H #define SERIAL_H #include “temp.h” char LerSerial(void); void EnviaSerial(char val); #endif serial.h #ifndef TEMP_H //tag já definida, //pula o conteúdo #endif temp.h ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 7 / 46 Tipos de dados em C Tipos de dados em C ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 8 / 46 Tipos de dados em C Tipos de dados em C Toda informac¸a˜o que e´ inserida num computador e´ armazenada em formato bina´rio; Cada tipo de informac¸a˜o conte´m uma quantidade diferente de bits; Cada bit pode representar informac¸o˜es diferentes, mesmo dentro de uma mesma varia´vel. ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 9 / 46 Tipos de dados em C Tipos de dados em C Tipo Bits Bytes Faixa de valores char 8 1 -128 a` 127 int 16 2 -32.768 a` 32.767 float 32 4 3,4 x 10-38 a` 3,4 x 1038 double 64 8 3,4 x 10-308 a` 3,4 x 10308 Dependendo.... ... da arquitetura, do compilador e das configurac¸o˜es. ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 10 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Quando resolvemos codificar uma informac¸a˜o num formato digital, e portanto finito, sempre existe perda de informac¸a˜o resoluc¸a˜o amplitude ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 11 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Calcule quantas iterac¸o˜es possui cada loop: 1 float x = 0; 2 3 while (x != 4){ 4 x += 0.4f; 5 } 1 char x = 0; 2 3 while (x < 200){ 4 x++; 5 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 12 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Conversa˜o Bina´rio-decimal Dividir o nu´mero por 2 Anotar o valor do resto (0 ou 1) Se o valor e´ maior que 0 voltar ao nu´mero 1 Escrever os valores obtidos atrave´s do passo 2 de tra´s para frente. Apresentar o resultado ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 13 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Exercicio 01) Converter os nu´meros 18 513 73 60 -15 ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 14 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Nu´mero 18: 18 2 = 9, resto 0 9 2 = 4, resto 1 4 2 = 2, resto 0 2 2 = 1, resto 0 1 2 = 0, resto 1 ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 15 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal A representac¸a˜o de nu´meros negativos e´ feita atrave´s do MSB 0 = positivo 1 = negativo Me´todo de conversa˜o: complemento de dois ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 16 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Complemento de dois Definir tamanho da palavra Achar a representac¸a˜o em bina´rio positiva com a mesma magnitude Inverter todos os bits Somar um ao resultado ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 17 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Nu´meros fraciona´rios (ponto flutuante) Sa˜o divididos em expoente, mantissa e sinal Sinal ocupa apenas um bit, como nos inteiros A mantissa representa os algarismos significativos O expoente representa a magnitude Ponto fixo ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 18 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Base Hexadecimal Possui 16 “unidades”diferentes. 10 algarismos mais 6 letras Facilita escrita de valores bina´rios Fa´cil conversa˜o bin-hex ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 19 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Dec Bin Hex Dec Bin Hex 0 0000 0 8 1000 8 1 0001 1 9 1001 9 2 0010 2 10 1010 A 3 0011 3 11 1011 B 4 0100 4 12 1100 C 5 0101 5 13 1101 D 6 0110 6 14 1110 E 7 0111 7 15 1111 F ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 20 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Exercicio 02) Converter os nu´meros 1810 - 100102 51310 - 10000000012 7310 - 10010012 6010 - 1111002 -1510 - 111100012 8bits ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 21 / 46 Tipos de dados em C Conversa˜o Bina´rio, Decimal, Hexadecimal Exercicio 02) Converter os nu´meros como: 1810= 1-00102 12 = 116 00102 = 216 logo : 100102. = 1216. ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 22 / 46 Modificadores de varia´veis Modificadores de varia´veis ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 23 / 46 Modificadores de varia´veis Modificadores de tamanho e sinal Tipo Bytes Excursa˜o ma´xima unsigned char 1 0 a` 255 signed char 1 -128 a` 127 unsigned int 2 0 a` 65.535 signed int 2 -32.768 a` 32.767 long int 4 -2.147.483.648 a` 2.147.483.647 unsigned long int 4 0 a` 4.294.967.295 short int 2 -32.768 a` 32.767 ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 24 / 46 Modificadoresde varia´veis Modificadores de Acesso 1 #define X (*( near unsigned char*)0xF83) 2 void main(void){ 3 while (X!=X); 4 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 25 / 46 Modificadores de varia´veis Modificadores de Acesso Compilando o co´digo anterior temos em assembly: 1 // Starting pCode block 2 S_Teste__main code 3 _main: 4 .line 19 // Teste.c while (X!=X); 5 6 RETURN ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 26 / 46 Modificadores de varia´veis Modificadores de Acesso 1 #define X (*( volatile near unsigned char*)0xF83) 2 void main(void) 3 { 4 while (X!=X); 5 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 27 / 46 Modificadores de varia´veis Modificadores de Acesso 1 S_Teste__main code // Starting pCode block 2 _main: 3 _00105_DS_: 4 .line 19 // Teste.c while (X != X); 5 MOVLW 0x83 // primeira parte do enderec¸o 6 MOVWF r0x00 7 MOVLW 0x0f // segunda parte do enderec¸o 8 MOVWF r0x01 9 MOVFF r0x00 , FSR0L 10 MOVFF r0x01 , FSR0H 11 MOVFF INDF0 , r0x00 // realiza primeira leitura 12 MOVLW 0x83 // primeira parte do enderec¸o 13 MOVWF r0x01 14 MOVLW 0x0f // segunda parte do enderec¸o 15 MOVWF r0x02 16 MOVFF r0x01 , FSR0L 17 MOVFF r0x02 , FSR0H 18 MOVFF INDF0 , r0x01 // realiza segunda leitura 19 MOVF r0x00 , W 20 XORWF r0x01 , W 21 BNZ _00105_DS_ // faz o teste para igualdade 22 RETURN ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 28 / 46 Modificadores de varia´veis Modificadores de Acesso 1 #define PORTB (*( near unsigned char*)0xF83) 2 3 void main(void){ 4 unsigned char val; 5 6 val = PORTB; 7 8 // aguarda mudanc¸a ; 9 while (val!=PORTB); 10 11 // valor acabou de mudar 12 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 29 / 46 Modificadores de varia´veis Modificadores de Acesso Utilizac¸a˜o de const: 1 #define X (*( volatile const near unsigned char*)0xF83) 2 // inicio do programa 3 void main(void) 4 { 5 X = 3; 6 } A compilac¸a˜o resulta em erro: 1 Teste.c: error 33: Attempt to assign value to a constant ←↩ variable (=) ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 30 / 46 Modificadores de varia´veis Modificadores de Posicionamento Existem dois modificadores de posicionamento near far Na˜o sa˜o padronizadas pela ISO C(99) Indicam ao compilador a regia˜o em que a varia´vel deve ser colocada near - regia˜o de acesso mais ra´pido far - regia˜o de acesso normal ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 31 / 46 Modificadores de varia´veis Modificador de persisteˆncia A persisteˆncia de uma varia´vel pode ser assegurada com o modificador static Padronizada pela ISO C(99) Garante que na˜o havera´ perda de informac¸a˜o na varia´vel Uma regia˜o de memo´ria e´ reservada apenas para a varia´vel em questa˜o 1 // cria um contador persistente que e´ 2 // incrementado a cada chamada de func¸~ao 3 int ContadorPersistente(int reseta){ 4 char variavel_persistente; 5 if (reseta) { variavel_persistente = 0;} 6 else { return (variavel_persistente ++);} 7 return -1; 8 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 32 / 46 Modificadores de varia´veis Modificador de persisteˆncia 1 // cria um contador persistente que e´ 2 // incrementado a cada chamada de func¸~ao 3 4 int ContadorPersistente(int reseta){ 5 static char variavel_persistente; 6 7 if (reseta){ 8 variavel_persistente = 0; 9 }else{ 10 return (variavel_persistente ++); 11 } 12 return -1; 13 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 33 / 46 Operac¸o˜es Aritime´ticas Operac¸o˜es Aritime´ticas ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 34 / 46 Operac¸o˜es Aritime´ticas Operac¸o˜es Aritme´ticas 1 void main (void){ 2 char var8; 3 int var16; 4 long int var32; 5 float pont16; 6 double pont32; 7 var8 = var8 + var16; // 1 8 var8 = var8 + var8; // 2 9 var16 = var8 * var8; // 3 10 var32 = var32 / var16; // 4 11 var32 = pont32 * var32; // 5 12 pont16 = var8 / var16; // 6 13 pont16 = pont32 * var32; // 7 14 pont16 = 40 / 80; // 8 15 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 35 / 46 Func¸a˜o main() Func¸a˜o main() ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 36 / 46 Func¸a˜o main() Func¸a˜o main() 0x58 Testa A 0x57 30 0x56 A recebe 0x55 Limpa A 0x59 ... 0x8D Porta B 0x8C Salva em 0x8B 50 0x8A A recebe 0x8E ... 0x03 0x55 0x02 Pulo 0x01 0x8A 0x04 ... 0x00 Pulo Endereço Instrução ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 37 / 46 Func¸a˜o main() Func¸a˜o main() O meio de indicar o ponto de in´ıcio de um programa depende do compilador. Geralmente apenas a criac¸a˜o da func¸a˜o main ja´ e´ suficiente para o compilador O linker aloca a func¸a˜o main() em algum lugar dispon´ıvel na memo´ria O linker atualiza o vetor de reset colocando um pulo para a func¸a˜o main 1 void main (void) 2 { 3 // aqui entra o co´digo do programa 4 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 38 / 46 Func¸a˜o main() Func¸a˜o main() Atenc¸a˜o! Para sistemas embarcados a func¸a˜o main e´ a primeira a ser executada, portanto na˜o pode receber paraˆmetro nenhum. Como ela na˜o e´ chamada por nenhuma outra func¸a˜o, ela e´ a u´ltima a ser executada. Deste modo na˜o existe a possibilidade de retornar nenhum valor. Deve ser declarada como: 1 void main (void) 2 { 3 // Insira o co´digo aqui. 4 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 39 / 46 Func¸a˜o main() Func¸a˜o main() Geralmente os sistemas embarcados sa˜o feitos para serem continuamente executados As rotinas devem ser c´ıclicas O sistema so´ para quando desligado Atenc¸a˜o! Nesta situac¸a˜o utiliza-se loops infinitos. ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 40 / 46 Func¸a˜o main() Func¸a˜o main() 1 void main (void) { 2 for (;;){ 3 // aqui entra o 4 // co´digo principal 5 } 6 } 1 void main (void) { 2 while(1){ 3 // aqui entra o 4 // co´digo principal 5 } 6 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 41 / 46 Rotinas de Tempo Rotinas de Tempo ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 42 / 46 Rotinas de Tempo Rotinas de Tempo E´ muito comum necessitar que o microcontrolador fique um tempo sem fazer nada. Uma maneira de atingir esse objetivo e´ utilizar um lac¸o for. 1 unsigned char i; 2 for(i=0; i < 10; i++); Atenc¸a˜o! Notar que na˜o estamos utilizando os colchetes depois do for. ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 43 / 46 Rotinas de Tempo Rotinas de Tempo 1 // co´digo em assembly equivalente do: for(i=0; i<10; i++); 2 MOVF r0x00 , W // inicializa W com 0 (1 ciclo) 3 SUBLW 0x0a // coloca 10 (0x0a) no registro W (1 ciclo) 4 MOVWF r0x00 // muda o valor de W para F (1 ciclo) 5 _00107_DS_: // label (etiqueta) 6 DECFSZ r0x00 , F // decrementa e se F>0 executa (1 ciclo) 7 BRA _00107_DS_ //"pula" para o lugar 00107 DS (2 ciclos) ECOP04 Tipos de dados, func¸a˜o main() e rotinasde temporodrigomax@unifei.edu.br 44 / 46 Rotinas de Tempo Rotinas de Tempo Sa˜o gastos 3 passos para inicializac¸a˜o, cada um de 1 ciclo. Cada iterac¸a˜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 sa˜o necessa´rias 2 ∗ 109 ∗ x instruc¸o˜es. ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 45 / 46 Rotinas de Tempo Rotinas de Tempo 1 unsigned char i, j, k; 2 for(i=0; i < 34; i++){ //3+34∗(30 ,003+3) = 1,020 ,207 3 for(j=0; j < 100; j++){ //3+100∗(297 + 3) = 30 ,003 4 for(k=0; k < 98; k++); // 3+98∗(3) = 297 instruc¸~oes 5 } 6 } ECOP04 Tipos de dados, func¸a˜o main() e rotinas de temporodrigomax@unifei.edu.br 46 / 46 Revisão Tipos de dados em C Modificadores de variáveis Operações Aritiméticas Função main() Rotinas de Tempo
Compartilhar