Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Eletrônica / Projeto de Sistemas Microcontrolados / Aula
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).
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
#asm // Ou, _asm para o C18
// código
#endasm // Ou, _endasm para o C18
Exemplo
int teste_asm (int a, int b)
{
#asm
movf a, w; // copia o parâmetro a para w
addwf b, w; // soma w com b e coloca em w
movwf _return_; // armazena o resultado na variável de retorno
#endasm
}
A diretiva #include diz ao compilador para incluir, no momento da compilação, o arquivo externo especificado.
Sintaxe
#include "nome_do_arquivo" ou
#include <nome_do_arquivo>
Exemplos
#include “C:\INCLUDES\COMLIB\MYRS232.C”
#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.
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
#define nome_da_macro sequencia_de_caracteres
#undef nome_da_macro
Exemplo
#define PI 3.1416 // Onde for encontrado o nome PI, será substituído pela
// sequencia de números 3.1416.
Essa diretiva força o compilador a gerar um código de erro (mensagem) no local onde se encontra sua designação.
Sintaxe
#erro mensagem // Mensagem define o texto informando o erro.
Exemplo
#error Buffer insuficiente
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
#if expressão // Expressão condicional.
// código de programa
#elif expressão // Expressão condicional
// código de programa
#else
// código de programa
#endif
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
#ifdef nome // nome: operadores, constantes ou identificadores.
// códigos de programa
#endif nome
Ou
#ifndef nome // nome: operadores, constantes ou identificadores.
// Códigos de programa
#endif nome
Exemplo
#include <stdio.h> // Adiciona a biblioteca padrão de I/O
#define valor 590
#define valor_maximo 340
#if !defined(valor_minimo)
#define valor_minimo 30
#endif
#ifndef valor
#define valor 400
#endif
#ifdef valor_maximo
#undef valor_maximo
#define valor_maximo 500
#endif
void main(void)
{
fprintf(std,”\nvalor=%u”,valor);
fprintf(std,”\nvalor_minimo=%u”,valor_minimo);
fprintf(std,”\nvalor_maximo=%u”,valor_maximo);
}
Após execução do código acima exemplificado, tem-se a mensagem impressa como sendo:
valor = 590
valor_minimo = 30
valor_maximo = 500
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:
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