Cursos / Eletrônica / Projeto de Sistemas Microcontrolados / Aula

arrow_back Aula 06 - Fundamentos de Linguagem C - Parte I

Diretivas de compilação

As diretivas de compilação são simples comandos de orientação ao compilador. Esses comandos são, na realidade, utilizados para especificar determinados parâmetros internos utilizados pelo compilador no momento de compilar o código-fonte. Todas as diretivas de compilação são iniciadas pelo caractere # e somente caracteres de espaço em branco podem aparecer antes delas em uma linha.

Os compiladores CCS e C18 possuem uma grande quantidade de diretivas, que podem ser utilizadas para incluir arquivos, definir macros e controlar diversos parâmetros. Porém, esse material não visa esgotar todo o assunto pertinente a essas diretivas de compilação, assim, veremos apenas as mais comuns aos compiladores abordados. Caso necessite, acesse o help ou seus respectivos guias de usuário. (Para o CCS, acesse http://www.ccsinfo.com/downloads/ccs_c_manual.pdf e para o C18 acesse http://ww1.microchip.com/downloads/en/devicedoc/51288f.pdf).

  Diretivas #asm e #endasm

São utilizadas para inserir código em assembly diretamente no programa em C. Os mnemônicos são inseridos entre a diretiva #asm e a diretiva #endasm. Para o C18, essas diretivas são definidas com os símbolos _asm e _endasm.

Sintaxe

AخA
1
#asm                         // Ou, _asm para o C18
2
                                 // código
3
#endasm                  // Ou, _endasm para o C18

Exemplo

8
1
int teste_asm (int a, int b)
2
{
3
    #asm
4
    movf        a, w;          // copia o parâmetro a para w
5
    addwf      b, w;          // soma w com b e coloca em w
6
    movwf   _return_;     // armazena o resultado na variável de retorno
7
    #endasm
8
}

Diretiva #include

A diretiva #include diz ao compilador para incluir, no momento da compilação, o arquivo externo especificado.

Sintaxe

2
1
#include "nome_do_arquivo" ou 
2
#include <nome_do_arquivo>

Exemplos

2
1
#include “C:\INCLUDES\COMLIB\MYRS232.C”
2
#include <16C54.H>

Obs.: A diferença entre se usar " " e <> é somente a ordem de procura do diretório do arquivo especificado. Se usado as aspas, o arquivo encontra-se no diretório corrente.

Diretivas #define e #undef

A diretiva #define informa ao compilador que substitua todas as ocorrências de um nome usado no programa, pela sequência de caracteres ou comandos fornecida. Já a diretiva #undef elimina a macro que a segue, apagando-a da tabela interna que guarda a macro.

Sintaxe

2
1
#define nome_da_macro sequencia_de_caracteres 
2
#undef nome_da_macro

Exemplo

2
1
#define PI 3.1416   // Onde for encontrado o nome PI, será substituído pela 
2
                              // sequencia de números 3.1416.

Diretiva #error

Essa diretiva força o compilador a gerar um código de erro (mensagem) no local onde se encontra sua designação.

Sintaxe

1
1
#erro mensagem // Mensagem define o texto informando o erro.

Exemplo

1
1
#error Buffer insuficiente

Diretivas #if, #elif, #else e #endif

A diretiva #if é um comando de pré-processador muito parecido com o comando if, pois ambos têm a função de conferir a validade de uma determinada expressão e realizar uma ação. Entretanto, a expressão contida em #if só é verificada durante a compilação, denotando que as expressões presentes nessas diretivas não suportam variáveis da linguagem C, somente constante, operadores-padrão e identificadores criados pela diretiva #define.

As diretivas #elif e #else são sempre opcionais e a diretiva #endif finaliza um bloco #if.

Sintaxe

7
1
#if expressão           // Expressão condicional.
2
    // código de programa
3
#elif expressão        // Expressão condicional
4
    // código de programa
5
#else
6
    // código de programa
7
#endif

Diretivas #ifdef e #ifndef

A diretiva #ifdef é uma forma abreviada da diretiva #ifdefined (nome). Ela é utilizada para evitar a redefinição de operadores, constantes e identificadores, que podem, eventualmente, estar presentes nos arquivos inseridos no programa. Já a diretiva #ifndef é a forma negativa de #ifdef.

Sintaxe

3
1
#ifdef nome             // nome: operadores, constantes ou identificadores.
2
    // códigos de programa
3
#endif nome

Ou

3
1
#ifndef nome           // nome: operadores, constantes ou identificadores.
2
    // Códigos de programa
3
#endif nome

Exemplo

x
1
#include <stdio.h>              // Adiciona a biblioteca padrão de I/O
2
3
#define valor 590
4
#define valor_maximo 340
5
6
#if !defined(valor_minimo)
7
    #define valor_minimo 30
8
#endif
9
10
#ifndef valor
11
    #define valor 400
12
#endif
13
14
#ifdef valor_maximo
15
    #undef valor_maximo
16
    #define valor_maximo 500
17
#endif
18
void main(void)
19
{
20
    fprintf(std,”\nvalor=%u”,valor);
21
    fprintf(std,”\nvalor_minimo=%u”,valor_minimo);
22
    fprintf(std,”\nvalor_maximo=%u”,valor_maximo);
23
}

Após execução do código acima exemplificado, tem-se a mensagem impressa como sendo:

3
1
valor = 590
2
valor_minimo = 30
3
valor_maximo = 500

Diretiva #pragma

Utilizaremos a diretiva #pragma com o compilador C18. Sua função será instruir o compilador a executar uma ação específica durante o processo de compilação. Existem várias ações que podem ser tratadas com a diretiva #pragma. As mais comuns são:

  • code, que define uma seção como sendo de código.
  • romdata, que define uma seção como sendo de dados armazenados na memória de programa.
  • idata, que define uma seção como sendo de dados inicializados em uma memória de dados.
  • udata, que define uma seção como sendo de dados não inicializados em uma memória de dados.
  • interrupt, que define uma rotina de tratamento de interrupção como sendo de alta prioridade.
  • interruptlow, que define uma rotina de tratamento de interrupção como sendo de baixa prioridade.
  • config, que permite a configuração dos registradores de configuração do microcontrolador em uso.

Exemplificando este último caso, se desejar definir o oscilador como sendo a cristal e desabilitar o power-up timer e o watchdog, teremos o comando:

#pragma config OSC = XT, PWRT = OFF, WDTEN = OFF

Versão 5.3 - Todos os Direitos reservados