Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 -...

21
Programa¸ ao em linguagem C EA870 - FEEC - Unicamp Introdu¸ ao ` a linguagem C, para programa¸ ao de microcontroladores HC11, utilizando o compilador ICC11 Segunda Edi¸ ao Murillo Fernandes Bernardes [email protected] http://www.fee.unicamp.br/˜bernarde/ Abril de 2003 “He who asks is a fool for five minutes, but he who does not ask remains a fool forever” Prov´ erbio Chinˆ es c 2003 Murillo Fernandes Bernardes

Transcript of Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 -...

Page 1: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C

EA870 - FEEC - Unicamp

Introducao a linguagem C, para programacao de microcontroladores HC11,utilizando o compilador ICC11

Segunda Edicao

Murillo Fernandes [email protected]

http://www.fee.unicamp.br/˜bernarde/

Abril de 2003

“He who asks is a fool for five minutes, but he who does not ask remains a fool forever”Proverbio Chines

c©2003 Murillo Fernandes Bernardes

Page 2: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Sumario

1 Introducao 11.1 Historico do C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 ICC11 12.1 Sintaxe da linha de comando . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Processo de compilacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.3 C run-time (crt.s) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

3 Visao Geral de um programa em C 33.1 Funcoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

4 Tipos de Dados 44.1 Representacao Hexadecimal, decimal, octal, ASCII e caracteres de Escape . 54.2 Declaracao de variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4.2.1 Variaveis Locais x Globais . . . . . . . . . . . . . . . . . . . . . . . . 54.3 Cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

5 Expressoes 65.1 Expressoes Aritmeticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75.2 Expressoes Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75.3 Expressoes de manipulacao de bits . . . . . . . . . . . . . . . . . . . . . . . 8

6 Controle de Fluxo 86.1 IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86.2 Operador Ternario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86.3 Switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96.4 While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96.5 Do - While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96.6 For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96.7 Break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106.8 Continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106.9 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

7 Vetores 11

8 Ponteiros 118.1 Declaracao de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128.2 Referencia a ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128.3 Aritmetica de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128.4 Ponteiro para funcao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

9 Tratamento de Interrupcoes 149.1 Acesso a posicoes especıficas . . . . . . . . . . . . . . . . . . . . . . . . . . . 149.2 Endereco da Rotina de Servico . . . . . . . . . . . . . . . . . . . . . . . . . 149.3 Consistencia da pilha e Retorno de Interrupcao . . . . . . . . . . . . . . . . 159.4 Exercıcio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

10 Assembly in-line 1610.1 Utilizando variaveis do C no assembly . . . . . . . . . . . . . . . . . . . . . 16

Page 3: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

11 Funcoes pre-definidas no ICC11 1611.1 putchar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1711.2 printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

12 Referencias Bibliograficas 18

Prefacio

O uso do microcontrolador HC11 e da linguagem C de forma definitiva e bem recente emEA870, tem apenas um ano. E eu estava nesta turma, sofrendo na pele a descoberta donovo, tanto pelos alunos, quanto pelos tutores e professores.

No semestre seguinte fui tutor, e senti a necessidade de fazer um pouco para tentarajudar “nessa descoberta”, entao escrevi a primeira edicao desta apostila, e ministrei duaspequenas aulas introdutorias de C, passando aos alunos uma visao rapida e geral, que foiaprofundada na pratica durante o restante da disciplina.

Esta segunda edicao foi escrita no meu segundo semestre como tutor, e tenta acrescen-tar alguns pontos que faltaram na primeira edicao, para ser uma fonte mais completa deinformacao aos alunos.

O objetivo desta apostila e realmente de ajudar os alunos na programacao em C parao curso de EA870, tornando o aprendizado mais facil, rapido e menos traumatico.

A programacao mais proxima do “alto nıvel”facilita a bastante a realizacao e o enten-dimento das atividades propostas, mas de forma alguma acaba com a necessidade de seconhecer o hardware. Na realidade os exercıcios agora propostos tentam levar a um maiorconhecimento do HC11, de suas interfaces de Entrada e Saıda, temporizadores, interrupcoes,etc.

Espero que todos “se divirtam”. Nem tanto, mas que possam aproveitar ao maximoesta oportunidade (que para muitos sera unica). Se possıvel va alem, acrescente um poucomais “do novo”, do original, do criativo.

Campinas, abril de 2003

Murillo Fernandes Bernardes

Page 4: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 2 ICC11

1 Introducao

Estamos comecando uma nova fase do curso de EA870, a utilizacao da linguagem C, no lugardo uso do assembly. Alguns podem ate reclamar que quando estavam se acostumando mudatudo, tem que aprender uma linguagem nova, mas com certeza o uso do “C”vai facilitarbastante o trabalho.

Este tutorial tem o intuito de ser apenas um “pontape”inicial no aprendizado da lin-guagem C, sendo que a maior parte do aprendizado ocorrera no dia-a-dia, nas dificuldadesenfrentadas a cada programa, e com o costume de programar em C.

A linguagem (vocabulario) utilizada neste tutorial e, na medida do possıvel, a maissimples, com a intencao de que todos entendam realmente como as coisas funcionam em C,e tambem com o intuito de tirar todos os medos que ainda possam existir. Infelizmente vaohaver alguns termos meio estranhos, mas que com o tempo se tornarao comuns a todos.

“Programar e so isso, resolver problemas da vida real de forma ‘entendıvel’ ao compu-tador. Mostrar-lhe como voce fez, em uma linguagem que ele entenda.”

1.1 Historico do C

Na decada de 70, nos Laboratorios AT&T Bell (EUA), a linguagem C foi criada, tendocomo principal motivacao o desenvolvimento do sistema UNIX em uma linguagem de altonıvel. O “C”se tornou ferramenta inseparavel/indispensavel em todos os sistemas UNIX, ecom este foi sendo bastante difundida.

Com o passar do tempo havia diversos compiladores “C”, mas com diversas incompati-bilidades entre eles. Entao em 1983 o Insituto Norte Americano de Padronizacao (ANSI)criou um comite para a padronizacao da linguagem C. O resultado desta padronizacao foiconcluido em 1990 e e hoje o padrao internacional, chamado de “C ANSI”. Nesta padro-nizacao foram definidas algumas funcoes basicas de suporte, que deveriam ser fornecidaspelos compiladores, apesar delas nao fazerem parte da linguagem.

Uma das grandes vantagens da linguagem C e a uniao harmoniosa entre diversas ca-racterısticas de linguagens de baixo nıvel, e as caracteristicas das linguagens de alto nıvel.Algumas linguagens antecessoras ao C tinham certas caracterısticas muito favoraveis, masno geral eram muito restritas ou muito complicadas. Ja o C conseguiu unir tanto simplici-dade e quanto potencialidade em suas aplicacoes. Com isso mesmo tarefas muito complexaspodem ser realizadas com uma relativa simplicidade.

2 ICC11

No curso de EA870 o compilador utilizado e o ICC11, que apesar de nao atender todos osquesitos do C ANSI, atende ao menos os quesitos basicos. Por tanto qualquer livro quetrate do C ANSI pode (e deve) ser utilizado como referencia.

Ao longo deste tutorial mostraremos tanto definicoes do C padrao, quanto definicoesespecıficas do ICC11 (onde houverem diferencas).

2.1 Sintaxe da linha de comando

A sintaxe do comando para compilar um programa utilizando o ICC11 e a seguinte:

icc11 [opcoes] nomedoarquivo.c

As opcoes sao as seguintes:

c©2003 Murillo Fernandes Bernardes 1

Page 5: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 2 ICC11

-v verbose, mostra na tela as acoes que estao sendo executadas-o Nome do arquivo de saida, padrao e iccout.s19-l Cria o arquivo contendo a listagem em assembly, com o nome ¡arquivo de saida¿.lst-E Para a execucao apos o pre-processamento, gerando um arquivo .i-S Compiles para assembly, mas nao monta o programa (nao gera arquivo objeto)-s Modo silencioso. Nao mostrara na tela as acoes

Assim para compilar o programa contido no arquivo prog1.c, gerando o arquivo objetocom o nome de prog1.s19, a listagem com prog1.lst, e visualizando as acoes do compiladorutilizamos a seguinte linha de comando:

icc11 -v -l -o prog1.s19 prog1.c

2.2 Processo de compilacao

O processo de compilacao de um programa nao e direto, sao necessarios varios passos ateque se chegue ao codigo objeto (.s19).

O primeiro passo e a analise do codigo, pelo pre-processador C, em busca de erros, eexecutando diretivas do pre-processador, como include e define. Ao final deste passo tem-seum novo arquivo, com extensao .i, que sera utilizado no proximo passo.

O segundo passo e o processo de traducao para assembly, ira converter o codigo em Cpara um codigo assembly, e unir o conteudo do arquivo crt.s com o codigo assembly gerado,criando o arquivo .s.

O terceiro passo e o processo de montagem, que ira traduzir o codigo assembly gerado,para um arquivo objeto, no formato S19, que ja pode ser carregado no HC11 atraves doBUFALLO.

Ao final do processo os arquivos .i e .s sao apagados, por padrao, mas ha opcoes paraque isso nao aconteca.

2.3 C run-time (crt.s)

No segundo passo foi citado o uso de um arquivo chamado crt.s, que e um pequeno arquivocontendo codigo assembly, e que contem as funcoes basicas definidas no compilador (porexemplo: divisao, resto, multiplicacao e putchar).

Para um programa seja compilado, deve-se ter um arquivo crt.s no mesmo diretorio doprograma.

E importante tambem estar atento a dois ORG que estao no inıcio deste arquivo, e quedefinem onde comecam as areas de dados, e de programa. Na placa utilizada (PDHC11-FEEC) a regiao de memoria disponıvel para programas do usuario e de $6000 ate $7FFF,no total de 8Kbytes. Portanto estes dois ORGs devem estar dentro desta regiao. Qualquerproblema verifiquem no arquivo .lst se nao ha codigo (ou variaveis) gerado fora desta regiao.

Para a placa utilizada, um exemplo de como ficariam os ORGs e:

* define starting addresses

sect 0 * code

org $6000

sect 1 * data

org $7000

c©2003 Murillo Fernandes Bernardes 2

Page 6: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 3 Visao Geral de um programa em C

3 Visao Geral de um programa em C

Para comecarmos, vamos ao exemplo (C ANSI) que nao pode faltar em nenhum tutorial, eque simplesmente mostraria na tela a frase “Hello World!”:

/************************************************************/

/* Exemplo 1 - Tutorial C - EA870 */

/************************************************************/

#include <stdio.h> /* biblioteca padr~ao de I/O */

/************************************************************/

void main () /* Comentarios */

{

printf("Hello World!"); /* Dizendo ola mundo! */

}

Com este simples programinha podemos mostrar a “base mais basica”do C, que e afuncao main. Esta funcao e que sera executada ao se chamar o programa criado em C,portanto todo programa deve ter sua propria funcao main.

Este programa tambem mostra a chamada a uma funcao externa (printf) ao programa,mas que esta definida numa das bibliotecas do C ANSI. Esta funcao esta sendo referenciadadentro do arquivo stdio.h, que esta sendo incluıdo no programa atraves da diretiva #include<stdio.h>.

Outra coisa basica e muito importante que podemos ver neste exemplo e como se colocarum comentario num programa em C. Utiliza-se sempre “/*”para inıcio do comentario e“*/”para indicar o fim de um comentario, assim pode-se ter comentarios de varias linhas.

Linhas que iniciam com “#”sao geralmente diretivas ao pre-processador C.

3.1 Funcoes

Em C todo algorıtmo deve ser escrito na forma de funcoes. E funcoes sao simplesmenteconjuntos de comandos que podem incluir declaracoes, chamadas a outras funcoes. Aorganizacao basica de uma funcao em C e a seguinte:

tipo funcao(parametros) {

declarac~oes;

comandos;

}

O tipo indica o tipo do valor de retorno da funcao, e pode ser qualquer um dos tiposdefinidos em C. (Mostrados na proxima secao)

funcao e o nome dado a funcao, e atualmente nao se tem limitacao quanto ao tamanhodo nome, mas recomenda-se utilizar nomes que lembrem o que a funcao ira executar.

parametros correspondem na verdade a definicao do tipo do parametro a ser passadopara a funcao, e o nome com o qual a funcao referenciara o valor passado.

Em C e necessario se declarar todas as variaveis antes que as utilize, assim a parte dedeclaracoes e onde isso deve ser feito.

Logo apos as declaracoes pode-se colocar a chamada a todos os comandos a seremexecutados pela funcao.

Como exemplo iremos criar uma funcao que escrevera na tela a frase “Eu faco EA870”, eum programa principal que escreve “Oi pessoal”, e logo apos chama a funcao anteriormentecriada:

c©2003 Murillo Fernandes Bernardes 3

Page 7: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 4 Tipos de Dados

#include <stdio.h>

void escreve() { /* func~ao para escrever "Eu faco EA870"*/

printf("Eu faco EA870");

}

void main() { /* func~ao principal */

printf("Oi pessoal"); /* imprime "Oi pessoal" */

escreve(); /* chama func~ao que escreve "Eu faco EA870" */

}

Vale lembrar que o ICC11 nao prove as bibliotecas de funcoes definidas pelo C ANSI,assim para o ICC11 a diretiva #include <stdio.h> nao pode ser utilizada. A unica funcaoque o ICC11 fornece e a printf (com algumas limitacoes), que para ser utilizada o arquivoprintf.c deve ser compilado juntamente com o programa. Utilizando o exemplo da linha decomando utilizado na secao anterior teriamos que ter agora esta linha de comando, paraque o programa pudesse utilizar a funcao printf (com o printf.c no mesmo diretorio doprograma prog1.c):

icc11 -l -o prog1.s19 prog1.c printf.cAtencao:Em C a chamada a uma funcao deve sempre ser feita com nome da funcao(); mesmo

que ela nao receba nenhum parametro.Simplesmente o nome da funcao indica o endereco dela, mas nao faz a chamada a ela.

4 Tipos de Dados

O C padrao define os seguintes tipos de dados:

char Caractere (1 byte)int Inteiro (em geral 32 bits)float Numero realdouble Numero real precisao duplavoid Sem valor

Alem dos tipos, o C tambem define alguns modificadores, que simplismente mudam aforma com que o numero sera tratado ou armazenado. Alguns modificadores sao: unsigned,signed, short, long

Na verdade ha mais alguns tipos e modificadores que nao iremos citar aqui, mas quepodem ser encontrados em qualquer livro de C ANSI. Alem disso o C padrao permite quenovos tipos de dados sejam criados.

Ja o ICC11 conta basicamente com os seguintes tipos:

char Caracter unitario (1 byte)int um inteiro (2 bytes)void sem valor

E tambem com alguns modificadores, como o unsigned que sera muito utilizado duranteo curso.

Variaveis do tipo long sao representadas da mesma forma que as do tipo int (16 bits),e o tipo char e tratado como signed char, ou seja, 1 byte com sinal.

c©2003 Murillo Fernandes Bernardes 4

Page 8: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 4 Tipos de Dados

Pode ate parecer que sao poucos tipos de dados, mas esta e uma das “magicas”do C,fazer muito com pouco. Com apenas estes tipos de dados somos capazes de representartudo que e necessario numa maquina como o HC11. Por exemplo: Como temos o tipochar (caractere) podemos facilmente ter strings, ja que estas sao simplesmente vetores decaracteres.

4.1 Representacao Hexadecimal, decimal, octal, ASCII e caracte-res de Escape

Em C numeros em hexadecimal sao representados sempre iniciados com “0x”, ou seja, pararepresentar o numero $FF deve-se escrever 0xFF.

Numeros decimais sao representados normalmente (nunca com zeros a esquerda), quandonegativos, com o sinal de menos (-) a sua esquerda.

Numeros na base octal devem ser iniciados com “0”, assim o numero 023 esta na base8.

Caracteres ASCII sao representados entre aspas simples (”), assim ’m’ e o caractereASCII m.

Strings (vetores de caracteres) sao representados entre aspas duplas “”, assim “EA870”ea representacao da string EA870.

4.2 Declaracao de variaveis

Agora que ja conhecemos os tipos de dados possıveis, podemos realmente comecar a fazeras declaracoes de variaveis num programa.

A declaracao das variaveis e da forma:

tipo nome da variavel;

ou

tipo nome var1, nome var2, nome var3;Por exemplo:

int h, m, s;char a;

Com estas duas linhas acima declaramos tres variaveis do tipo inteiro, e uma do tipochar.

Pode-se tambem inicializar as variaveis no momento da declaracao, da seguinte forma:

int h=5;char a=’j’;

Assim declaramos a variavel h como inteiro, e definimos seu valor inicial como 5. Ja avariavel a foi definida como caractere, e e inicializada com o caractere ’j’.

4.2.1 Variaveis Locais x Globais

Quando-se declara variaveis dentro de uma funcao (mesmo que seja a main), esta variavelso fica acessıvel de dentro daquela funcao, temos entao uma variavel local. Pode-se declararvariaveis fora de qualquer funcao, o que faz com que a variavel seja global, ou seja acessıvelapartir de qualquer funcao do programa. Por exemplo:

c©2003 Murillo Fernandes Bernardes 5

Page 9: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 5 Expressoes

char c;

void main() { /* func~ao principal */

int a=5;

c=’m’;

}

No trecho de codigo apresentado acima, temos a variavel c que e global, e a variavel aque e local (funcao main).

4.3 Cast

Cast ou coercao e simplesmente a conversao de tipo de um determinado valor, ou variavel.Podemos falar que seria o modelamento daquele valor para que ele fique compatıvel com oque se quer.

No seguinte trecho de codigo, um inteiro esta recebendo o valor de um ponteiro prainteiro (ponteiros serao detalhados mais a frente), ou seja, esta recebendo o endereco, masestes dois tipos nao sao iguais, e portanto o compilador devera mostrar um aviso do queesta sendo feito.

int a; /* declara um inteiro */

int *p; /* declara um ponteiro para inteiro */

a = p; /* o endereco apontado pelo p e "jogado" em a, ou seja,

a sera um inteiro que contem o valor do endereco */

Para mostrar ao compilador que e realmente aquilo que se quer fazer, e tambem evitarpossıveis erros, o melhor seria utilizar um cast, convertendo o tipo, de ponteiro para inteiro,para simplesmente inteiro, e isso seria feito da seguinte forma:

int a; /* declara um inteiro */

int *p; /* declara um ponteiro para inteiro */

a = (int) p; /* o endereco apontado pelo p e "jogado" em a, ou seja,

a sera um inteiro que contem o valor do endereco */

O cast e feito simplesmente colocando o tipo que se quer, entre parenteses antes dovalor, ou variavel. Assim poderia utilizar tambem:

int *p; /* declara um ponteiro para inteiro */

p = (int *) 0x1000;

Neste exemplo, modifica-se o tipo inteiro do valor 0x1000 para ponteiro para inteiro.Casts desta forma podem ser utilizados para qualquer tipo de dados suportado. Vale prestaratencao ao tamanho em bytes que cada tipo ocupa, para que nao ocorra truncamentosindesejados, ou coisas parecidas.

5 Expressoes

Como ja dito anteriormente “funcoes sao simplesmente conjuntos de comandos”validos, queserao executados de acordo com uma determinada logica.

Para que esta logica possa ser expressa tem-se as expressoes aritmeticas, as expressoescondicionais, e as expressoes de manipulacao de bits.

c©2003 Murillo Fernandes Bernardes 6

Page 10: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 5 Expressoes

5.1 Expressoes Aritmeticas

Atribuicoes em C sao indicadas pelo simbolo =. Assim:

void main() {

int a, b;

a = 10; /* a recebe valor 10 */

b = a; /* b recebe o valor de a (10) */

}

Alem da atribuicao as expressoes aritmeticas em C podem ser: soma(+), subtracao(-),multiplicacao (*), divisao (/), modulo (%), incremento(++), e decremento(–). Por exemplo:

void main() { /* func~ao principal */

int a=2, b, c, d, e; /* declarac~ao de variaveis */

b = 5*a; /* b recebe 10 */

c = a+b; /* c recebe 12 */

d = b/a; /* d recebe 5 */

e = b%3; /* e recebe 1 */

e++; /* incrementa e, e fica com 2 */

d--; /* decrementa d, d fica com 4 */

}

Numeros negativos sao representados com o simbolo - a esquerda do numero.

5.2 Expressoes Condicionais

As expressoes condicionais sao das mais importantes no desenvolvimento de um programa,pois nelas se baseiam todos os testes, e verificacoes necessarias num programa.

A linguagem C nao suporta nativamente o tipo booleano, mas utiliza inteiros pra re-presentar verdadeiro ou falso. Quando o resultado de uma expressao condicional for 0(zero) e interpretado como falso, e quando for diferente de 0 e verdadeiro. Assim po-demos utilizar qualquer expressao inteira como expressao condicional, ou seja, a sintaxe:if (a) printf(’Verdadeiro’); else print (’Falso’); e perfeitamente valida, e mos-trara na tela “verdadeiro”, caso a seja diferente de zero, e mostrara “Falso”caso a seja iguala zero.

Para comparacoes de valores, tem-se os operadores relacionais, que sao:

> maior que>= maior que ou igual a< menor que<= menor que ou igual a== igual a!= diferente de

Alem destes operadores ha tambem mais tres, que sao operadores booleanos comuns:

&& AND, o resultado e verdadeiro se ambas expressoes envolvidas forem verdadeiras‖ OR, o resultado e verdadeiro se uma das expressoes envolvidas for verdadeira.! NOT, o resultado e o inverso da expressao, se esta era verdadeira o resultado e falso, i.e.

c©2003 Murillo Fernandes Bernardes 7

Page 11: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 6 Controle de Fluxo

5.3 Expressoes de manipulacao de bits

Alem dos operadores ja vistos, o C oferece tambem operadores para trabalhar diretamentecom bits das variaveis de um programa, e podem ser utilizadas com qualquer tipo devariaveis.

& AND bit-a-bit| OR bit-a-bitˆ XOR bit-a-bit<< deslocamento de bits a esquerda>> deslocamento de bits a direita˜ complemento de um (inverte cada bit)

6 Controle de Fluxo

Os programas consistem basicamente de um conjunto de comandos que sao executadosem sequencia, mas se consegue um poder muito maior controlando a ordem de execucaode certos trechos do programa, atraves de algumas condicoes. Para isso temos comandosque nos permitem fazer testes e mudar o rumo da execucao do programa, dependendo doresultado destes testes.

Estes comandos sao: if, operador ternario, switch, while, do while, for, break, e continue.Todos ja conhecem a ideia de cada um destes tipos de controle de fluxo do programa, poisforam vistos em MC102, aqui simplesmente sera mostrado a sintaxe de cada um deles,alguns exemplos no final.

6.1 IF

O comando IF e um dos mais basicos e uteis comandos de qualquer linguagem de pro-gramacao de alto nıvel. No C ele tem a seguinte estrutura:

if (condic~ao) {

comandosIf;

}

ou

if (condic~ao) {

comandosIf;

}

else {

comandosElse;

}

Por exemplo:

6.2 Operador Ternario

O operador ternario e simplesmente uma forma simplificada do IF..ELSE, e e mais eficientepara testes simples. Sua estrutura e:

express~ao1 ? express~ao2 : express~ao3

Que e na verdade:

if express~ao1 then express~ao2 else express~ao3

c©2003 Murillo Fernandes Bernardes 8

Page 12: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 6 Controle de Fluxo

6.3 Switch

O comando switch e bastante semelhante ao comando case do Pascal. E ele permite aexecucao de uma determinada acao para cada valor da expressao condicional, sem que sejanecessario fazer um “aninhamento”de IFs.

Foi notado um erro no codigo assembly gerado pelo ICC11 para o switch, portanto o usodo switch se tornou um pouco desaconselhavel. O mesmo nao acontece com compiladorescompativeis com o C padrao.

Sua estrutura e:

switch (express~ao) {

case item1:

comandos1;

break;

case item2:

comandos2;

break;

case itemn:

comandosn;

break;

default:

comandos;

break;

}

Antem-se ao fato de que para cada case ha um break, e o break e necessario para queos comandos dos outros cases nao sejam executados. Por exemplo, se a expressao era iguala item1, os comandos representados por comandos1 serao executados, caso nao houvesse obreak, comandos2, ate comandosn, e comandos seriam executados tambem. Com a presencado break o switch e “abandonado”apartir daquele ponto, nao executando nenhum comandode outro item.

6.4 While

A estrutura do while e:

while (express~ao) {

comandos;

}

6.5 Do - While

O do-while do C, e praticamente igual ao repeat until do Pascal, pois sempre executa umavez aı faz o teste. Sua estrutura e:

do

comandos;

while (express~ao);

6.6 For

Sua estrutura e a seguinte:

for(express~ao1; express~ao2; express~ao3) {

comandos;

}

c©2003 Murillo Fernandes Bernardes 9

Page 13: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 6 Controle de Fluxo

Onde expressao1 e onde se faz a atribuicao do valor inicial do contador utilizado. ex-pressao2 e a condicao (“enquanto”) de continuar no loop. expressao3 e a forma com queo contador sera modificado a cada iteracao. A expressao3 e comumente algo como “conta-dor++”ou “contador–”, mas pode ser qualquer operacao.

6.7 Break

O C prove dois comandos de controle de como sera o loop, um deles e o break e o outro eo continue.

O break e simplesmente um comando de saıda de um loop, ou switch.

6.8 Continue

O continue permite que uma determinada iteracao (ou varias delas) sejam puladas, e o loopcontinue daı pra frente.

6.9 Exemplos

if(x > 5)

x = 0;

else ++x;

while(x < 5) {

func();

++x;

}

unsigned char ascii2dec(unsigned char letra){

unsigned char digito;

switch (letra) {

case ’A’:

case ’B’:

case ’C’:

case ’D’:

case ’E’:

case ’F’:

digito=letra+10-’A’;

break;

case ’a’:

case ’b’:

case ’c’:

case ’d’:

case ’e’:

case ’f’:

digito=letra+10-’a’;

break;

default:

digito=letra-’0’;

}

return digito;

}

for(J=100;J<1000;J++) {

process();

}

I=100;

do {

c©2003 Murillo Fernandes Bernardes 10

Page 14: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 8 Ponteiros

process();

I--;

} while (I>0);

7 Vetores

Os vetores sao conjuntos de valores de um determinado tipo, que podem ser acessados pelonome do vetor, e pela especificacao da posicao dentro do vetor.

Pode-se ter vetores de qualquer um dos tipos aceitos pela linguagem. Um vetor parainteiros, com capacidade para 10 numeros e definido da seguinte forma:

int vet[10];

A inicializacao de um vetor pode ser feita da seguinte forma:

int vet[5] = {1, 2, 3, 4, 5};

E o acesso e da forma:

int a;

int vet[5];

a = vet[2];

vet[4] = 3;

Assim pegamos o valor da posicao 2 do vetor e colocamos na variavel a, e colocamos ovalor 3 na posicao 4 do vetor.

E importante destacar que os ındices do vetor vao de 0 ate n-1, onde n e o tamanho dovetor. Portanto o vetor acima, que tem tamanho 5, tem seus ındices de 0 a 4, como ındice0 representando a primeira posicao, 1 a segunda,... e 4 a ultima posicao do vetor.

8 Ponteiros

Uma das qualidades do C e que ele prove meios de se trabalhar com a memoria diretamente.Isso permite que o programador realize muitas operacoes como se estivesse utilizando as-sembly, mas com a facilidade de uma linguagem de alto nıvel. Infelizmente esse potencialpode ser tambem uma fonte de erros muito difıceis de ser detectados.

Os ponteiros sao variaveis que contem enderecos. Assim pode-se realizar operacoestanto com o conteudo das posicoes de memoria apontadas por eles, quanto com os propriosponteiros. Como todas as outra variaveis, os ponteros tem um tipo, que indica ao compiladoro numero de bytes que aquele ponteiro estara sendo realmente apontado por aquele ponteiro.Por exemplo, no caso do ICC11, os inteiros tem 2 bytes, assim quando se fizer uma operacaocom o conteudo da posicao apontada por aquele ponteiro, sera uma operacao com 16 bits.

Em C pode-se obter o endereco de uma variavel facilmente, para isto basta colocar um& (e comercial) antes do nome da variavel, ou seja, se temos uma variavel var, &var e oendereco de var (mas nao um ponteiro).

O endereco de funcoes tambem sao acessıveis, e sao dados simplesmente pelo nome dafuncao, sem os parenteses logo apos. Portanto para pegar o endereco de uma funcao basta:

c©2003 Murillo Fernandes Bernardes 11

Page 15: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 8 Ponteiros

void myFun() {

printf(’N~ao faz nada’);

}

void main() {

int ender;

ender = (int) myFun;

}

8.1 Declaracao de ponteiros

Para se declarar um ponteiro utiliza-se a seguinte sintaxe:

int *pt1; /* declara um ponteiro para um inteiro (16bits) */

char *pt2; /* declara um ponteiro para um caractere (8bits) */

unsigned char *pt3; /* declara um ponteiro para um caractere,

considerando-o de 0 a 255 (8bits)*/

Alem da declaracao deseja-se que o ponteiro aponte para uma determinada posicao dememoria, portanto e preciso setar o seu valor. Para isso basta que se conheca o endereco aser apontado, e entao fazer um cast para o tipo de dado do ponteiro, da seguinte forma:

pt1 = (int *) 0x1000;

pt3 = (unsigned char *) 0x100A;

Agora tem-se dois ponteiros inicializados, o primeiro, pt1, um apontador para inteiro,apontando para o endereco 0x1000. E o segundo um apontador para caracteres (8 bits)sem sinal (0 a 255), apontando para o endereco 0x100A.

8.2 Referencia a ponteiros

Os ponteiros podem ser utilizados tanto para escrita, quanto leitura na memoria. Essasduas operacoes sao classificadas como referencia a ponteiros.

O uso dos ponteiros e bastante semelhante ao uso de variaveis comuns, execeto peloasterisco (*) colocado antes do nome do ponteiro para indicar o conteudo da posicao dememoria apontada pelo ponteiro. Assim o uso seria:

void main() {

unsigned char *PORTE = (unsigned char *) 0x100A;

char *disp = (char *) 0xBF01;

unsigned char a;

a = *PORTE; /* Le da Porta E (DIP-SWITCH e Push-buttom) e guarda valor em a*/

*disp = 0xFF; /* Escreve $FF em $BF01, ou seja apaga displays */

}

8.3 Aritmetica de ponteiros

O ICC11 trata ponteiros como se fossem vetores, assim caso se queira acessar a terceiraposicao de memoria apartir de onde esta o ponteiro, pode-se tanto utilizar *(pt+3), ousimplesmente pt[3].

c©2003 Murillo Fernandes Bernardes 12

Page 16: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 8 Ponteiros

void main() {

int *pt = (int *) 0x7000; /* pt: ponteiro para um inteiro */

int i;

for (i=0; i<10; ++i)

*(pt + i) = 0;

}

Este programinha coloca 0 em 20 (inteiro ocupa 2 bytes) posicoes de memoria consecu-tivas apartir da posicao 0x7000.

Este mesmo programa poderia ser feito utilizando a seguinte sintaxe:

void main() {

int *pt = (int *) 0x7000; /* pt: ponteiro para um inteiro */

int i;

for (i=0; i<10; ++i)

pt[i] = 0;

}

8.4 Ponteiro para funcao

Como visto na Secao 3.1.1, ao se colocar simplesmente o nome de uma funcao se temo endereco desta. E olhando-se o codigo assembly gerado de um programa em C, nota-se que as funcoes nada mais sao que um conjunto de instrucoes com um rotulo do tiponomedafuncao no inıcio desta, o que explica essa possibilidade.

Ja que estamos tratando de ponteiros, e se tem ponteiros pra quase tudo, podemos vertambem que ha a possibilidade de se criar ponteiros para funcoes.

A ideia de ponteiro para funcao pode parecer um pouco estranha, pois ja se tem oendereco da funcao atraves do nome dela, entao por que ter um ponteiro?

Um dos motivos principais pode ser a necessidade de passar esse endereco como parametrode uma funcao, o que ate poderia ser feito simplesmente colocando o nome desta comoparametro, mas com certeza se a funcao nao espera um ponteiro pra funcao se vera umWarning na compilacao.

Por exemplo:

void teste1(unsigned int a)

{

// faz alguma coisa...

}

void main()

{

teste1(main);

}

O tipo de main e um ponteiro para funcao, e teste1 espera um unsigned int, por-tanto o compilador ira reclamar. Uma solucao seria chamar teste1 da seguinte forma:teste1((unsigned int) main), mas isso seria no mınimo deselegante.

Portanto a melhor forma seria fazer com que teste1 esperasse um ponteiro para a funcao,e aı sim passar simplesmente main como parametro.

Para criar um ponteiro para funcao: tipo (*nomedoponteiro)();. Para definiir o valordo ponteiro basta: nomedoponteiro = nomedafuncao;, e no caso de se querer chamar afuncao atraves do ponteiro: (*nomedoponteiro)();.

Por exemplo:

c©2003 Murillo Fernandes Bernardes 13

Page 17: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 9 Tratamento de Interrupcoes

void teste(unsigned int b)

{

// faz alguma coisa...

}

void main()

{

void (*pFun)();

pFun = teste;

(*pFun)(2);

}

Isso ira definir o ponteiro pFun com o endereco da funcao teste, e depois chamar afuncao atraves do ponteiro, passando 2 como parametro.

Agora podemos reescrever o programa mostrado anteriormente de uma forma melhor:

function teste1(void(*a)())

{

// faz alguma coisa...

}

void main()

{

teste1(main);

}

9 Tratamento de Interrupcoes

Um dos principais topicos que serao trabalhados nesta disiplina e o uso de interrupcoes.E isto gera varias duvidas, porque e preciso colocar determinadas intrucoes em posicoesespecıficas da memoria; saber o endereco da rotina de servico; e principalmente porque haa necessidade de manter a consistencia da pilha.

9.1 Acesso a posicoes especıficas

Como visto no Capıtulo 8, o uso de ponteiros torna possıvel o acesso a posicoes especıficasda memoria, assim o primeiro problema ja esta quase resolvido, faltando apenas saber oque e onde colocar.

9.2 Endereco da Rotina de Servico

O segundo problema e mais simples ainda, pois na linguagem C o nome da funcao indicaseu endereco. Assim pode-se ate salvar numa variavel esse endreco.

E importante lembrar que no HC11 os enderecos tem 16 bits, portanto precisa-se deuma variavel do tipo int, ou um ponteiro para funcao, para guardar o endereco da funcao.

Utilizando-se variaveis int, e sendo um pouco mais rigoroso nota-se que o endereco podeter o bit mais significativo em 1, assim dependendo do uso deste endereco, faz diferenca eleser com ou sem sinal. Portanto para que nao ocorra fatos indesejaveis e melhor o uso deuma variavel sem sinal, logo seria unsigned int.

E importante tambem lembrar que o nome da funcao tem um valor do tipo “enderecode funcao”, e nao diretamente unsigned int, portanto este “tipo”precisa ser moldado paraunsigned int com um cast.

Exemplo:

c©2003 Murillo Fernandes Bernardes 14

Page 18: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 9 Tratamento de Interrupcoes

void teste()

{

return 4;

}

void main()

{

unsigned int a;

a = (unsigned int) teste;

}

Assim tem-se em a o endereco da funcao teste.No caso de se querer passar o endereco da funcao como parametro de uma funcao confira

a secao de “Ponteiros para funcao”no capıtulo anterior.

9.3 Consistencia da pilha e Retorno de Interrupcao

Este ponto e sem duvida o que gera mais problemas.Primeiramente e preciso lembrar que as variaveis locais sao salvas na pilha, e o proprio

compilador cuida disso, fazendo com que ao final da funcao a pilha esteja da mesma formaque antes dela.

Assim simplemente colocar o retorno de interrupcao (RTI) no fim da funcao pode gerarinconsistencia na pilha.

Ja que nao se pode simplesmente fazer isso, a segunda solucao normalmente encontradae verificar em cada rotina de servico o que o compilador faz para manter a consistencia, efazer isso por conta propria.

Esta solucao ate funciona, mas e muito perigora e trabalhosa, pois podem ocorrer es-quecimentos que geram erros difıceis de detectar.

A melhor solucao encontrada, consiste no uso de duas funcoes, uma que seria a rotinade servico, chamada ao ocorrer a interrupcao, e que conteria somente a chamada a outrafuncao e o retorno de interrupcao, e a outra que realmente faria o trabalho necessario.

Exemplificando:

void faz_tudo()

{

// codigo...

}

void rot_serv()

{

faz_tudo();

asm(" RTI");

}

Desta forma nao e preciso se preocupar em como vai estar a rotina que realmente faz otrabalho, pois sempre ao final dela a pilha vai estar consistente. E olhando o codigo geradopara a segunda funcao pode-se ver que apos o RTI nao ha nenhuma instrucao que mexa napilha, porntanto mantendo assim a consistencia tambem ao final da rotina de servico.

9.4 Exercıcio

Crie uma funcao que defina no vetor de interrupcao a rotina de servico correspondente. Eque receba os seguintes parametros:

c©2003 Murillo Fernandes Bernardes 15

Page 19: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 11 Funcoes pre-definidas no ICC11

unsigned int - endereco do vetor de interrupcaoponteiro para funcao - endereco da rotina de servico responsavel pela interrupcao.

Sugestao: Crie um header file com a definicao de todo o vetor de interrupcoes, com nomessugestivos, para se utilizar como o primeiro parametro na chamada da funcao criada. Porexemplo:

#define INT_VECTOR_START 0x00C4

#define SCI_IRQ INT_VECTOR_START

#define SPI_IRQ INT_VECTOR_START+3

Ficando entao a chamada a funcao do tipo: minhafuncao(SCI_IRQ,rotinadeservico);para definir a rotina de servico da interface SCI.

10 Assembly in-line

A linguagem C e bastante flexıvel, permite uma certa proximidade com a maquina, apesarde “ser”uma linguagem de alto nıvel, mas as vezes nao e possıvel fazer tudo somente comela, aı e preciso recorrer novamente ao assembly, aı vem a duvida: como integrar os dois?

Todos os compiladores permitem que codigo assembly seja colocado diretamente dentrodo programa, aı cada compilador cria suas convecoes de como fazer isso. No ICC11 utiliza-sea funcao asm(). Assim para executar um LDAA $7000 dentro do seu programa basta:

void main() {

asm(" LDAA $7000");

}

E bom deixar bem claro, o espaco entre a primeira aspa, e a instrucao LDAA e NE-CESSARIO. NUNCA se esquecam disso.

10.1 Utilizando variaveis do C no assembly

O compilador ICC11 permite que variaveis criadas no seu programa em C seja utilizadasno assembly inline. Para isso basta colocar o sımbolo % antes do nome da variavel. Comomostrado abaixo:

void main() {

char a;

asm(" STAA %a"); /* Salva valor do ACCA na variavel a */

}

11 Funcoes pre-definidas no ICC11

O ICC11 e um compilador C nao completamente ANSI, e nao oferece muitas das funcoespadrao definidas com a linguagem C. O ICC11 oferece duas funcoes basicas de escrita, eque podem ser facilmente utilizadas nos programas que deverao ser feitos.

Algumas outras funcoes o proprio BUFALLO oferece (por exemplo INPUT em $FFAC),e para utiliza-las basta fazer uma simples interface entre seu programa em C e uma chamadaa sub-rotina assembly do BUFALLO.

c©2003 Murillo Fernandes Bernardes 16

Page 20: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 11 Funcoes pre-definidas no ICC11

11.1 putchar

Uma das funcoes que o ICC11 oferece e a putchar, que simplesmente ecoa na tela o caracterepassado a ela como parametro. Note que esta funcao faz simplesmente uma chamada arotina OUTPUT do BUFALLO (confira no arquivo crt.s).

Para imprimir o caractere M na tela basta:

putchar(’M’);

11.2 printf

A outra funcao de saıda que o ICC11 oferece e o printf, e pode ser utilizada para impri-mir somente uma string, da forma: printf("Meu texto");. Ou pode ser utilizada paraimprimir o valor de variaveis formatando o valor de acordo com determinadas strings decontrole, da forma:

int a=7, b=65;

printf("Eu gosto do numero %d",a); /* Imprime o numero na forma decimal */

printf("Eu escolhi o numero %x tambem",b); /* Imprime o numero 65 na forma hexadecimal 0x41 */

A string de controle e indicada pelo sımbolo “%”, e no C ANSI pode ter os seguintesvalores:

%c ASCII(caractere)%s String%d decimal com sinal%u decimal sem sinal%o octal sem sinal%x hexadecimal sem sinal%f ponto flutuante%e notacao cientıfica (exponencial)%g formato geral, escolhe a representacao mais curta entre %f e %e

Note que o C ANSI suporta numeros com ponto flutuante, mas o ICC11 nao, portanto osultimos tres formatos nao sao aceitos. Em C padrao ha tambem algumas variacoes dasstrings de controle, podendo ser passado o numero de dıgitos com o qual o numero serarepresentado, numero de casas decimais, mas o ICC11 tambem nao prove esta funcionali-dade.

Alem dos caracteres normais do teclado, as vezes e necessario imprimir na tela algunscaracteres “nao exatamente graficos”, como mudanca de linha, tabulacoes, e alguns outros.Em C utiliza-se a barra invertida para indicar este tipo de sequencia. Os caracteres destetipo mais usados sao:

sequencia nome valor\n newline, linefeed $0A = 10\t tab $09 = 9\b backspace $08 = 8\a Beep $07 = 7\r return $0D = 13\" ASCII quote $22 = 34\\ ASCII back slash $5C = 92\’ ASCII single quote $27 = 39

c©2003 Murillo Fernandes Bernardes 17

Page 21: Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp · Programa¸c˜ao em linguagem C EA870 - FEEC - Unicamp Introdu¸cao a linguagem C, para programa¸c˜ao de microcontroladores

Programacao em linguagem C - ICC11 12 Referencias Bibliograficas

E bom prestar atencao ao fato que aspas, e aspas simples sao utilizadas como delimitadorde strings e caracteres respectivamente, assim quando se quer imprimir na tela uma aspas(”) nao se pode simplesmente colocar uma aspas pra ser impressa, e preciso colocar asequencia correspondente, que e \". Para aspas simples e barra invertida ocorre da mesmaforma.

No C padrao ha mais algumas destas sequencias, mas que nao serao citadas aqui, fica acargo de quem tiver interesse, pegar um livro de C e dar uma olhada.

12 Referencias Bibliograficas

[1] Brian W. Kernigham & Dennis M. Ritchie: C: A Linguagem de Programacao. EditoraCampus, 1989.

[2] Ricarte, Ivan L. M. : Apostila de Programacao de sistemas. DCA-FEEChttp://www.dca.fee.unicamp.br/˜ricarte/

[3] Andrew S. Tanembaum: Modern Operating Systems. Prentice-Hall InternationalEditions, 1992.

c©2003 Murillo Fernandes Bernardes 18