PDF de programación - Microchip Mplab C18 C compiler - Guía del estudiante

Imágen de pdf Microchip Mplab C18 C compiler - Guía del estudiante

Microchip Mplab C18 C compiler - Guía del estudiantegráfica de visualizaciones

Actualizado el 14 de Marzo del 2019 (Publicado el 14 de Diciembre del 2018)
128 visualizaciones desde el 14 de Diciembre del 2018. Una media de 14 por semana
333,2 KB
22 paginas
Creado hace 13a (01/04/2005)
MMIICCRROOCCHHIIPP MMPPLLAABB CC1188 CC CCOOMMPPIILLEERR

GGUUÍÍAA DDEELL EESSTTUUDDIIAANNTTEE


Manual del compilador Microchip C18



1. Tipos de datos
Tipos enteros

rangos de cada tipo se muestran a continuación:


El compilador C18 soporta los tipos de datos enteros del estándar ANSI. Los

Tipo
char
Signed char
Unsigned char
int
Unsigned int
short
Unsigned short
Short long
Unsigned short long
long
Unsigned long



tamaño Rango
8 bits
8 bits
8 bits
16 bits
16 bits
16 bits
16 bits
24 bits
24 bits
32 bits
32 bits

-128
-128
0
-32,768
0
-32,768
0
-8,388,608
0
-2,147,483,648
0

127
127
255
32,767
65,535
32,767
65,535
8,388,607
16,777,215
2,147,483,647
4,294,967,295

Se admiten formatos de punto flotante double o float, basados en el estándar

Tipos en punto flotante

IEEE-754. A continuación se muestran los rangos de ambos tipos:

Tipo
Bits
float
32 bits
double 32 bits



Exp.
-126 128 2–126 ≈ 1.17549435e - 38 2128 * (2-2–15) ≈ 6.80564693e + 38
-126 128 2–126 ≈ 1.17549435e - 38 2128 * (2-2–15) ≈ 6.80564693e +38



Rango

Almacenamiento de los datos “endianness”

El ordenamiento de los datos en una variable multi-byte se realiza en little-endian. El
byte menos significativo ocupa la posición más baja.

#pragma idata test=0x0200
long l=0xAABBCCDD;

Da como resultado:



Dirección
Contenido

0x0200
0xDD

0x0201
0xCC

0x0202
0xBB

0x0203
0xAA



Laboratorio de Sistemas Basados en Microprocesador y Sistemas Electrónicos Digitales



2

Manual del compilador Microchip C18



2. Clases de almacenamiento

Se soportan los siguientes tipos de almacenamiento definido en el estándar ANSI: auto,
extern, register, static y typedef.


Almacenamiento overlay
Además se introduce el almacenamiento overlay, que se aplica a variables locales sólo
no se aplica a parámetros de funciones, definición de funciones o variables globales. El
linker MPLINK intentará superponer variables locales tipo overlay sobre las mismas
posiciones de memoria para funciones que no pueden activarse a la vez. Por ejemplo:

int f (void)
{
overlay int x = 1;
return x;
}
int g (void)
{
overlay int y = 2;
return y;
}

Si f y g nunca se activan juntas x e y pueden compartir la mismas posiciones de
memoria. La ventaja de usar ovelays es que estas variables se sitúan estáticamente lo
que significa que es necesario menos instrucciones para acceder a ellas, mientras que la
cantidad de memoria requerida es menor que en el caso de haberlas definido
directamente como static, al estar superpuestas.

Una función recursiva no puede contener variables de tipo overlays.

El formato por defecto para las variables locales es auto. Esto puede ser modificado
explícitamente mediante los prefijos static u overlay.


Argumentos para funciones
Los parámetros para las funciones pueden ser almacenados como auto o static. Un
parámetro auto se almacena en la pila software que implementa el compilador. Uno
static se considera global y habilita el acceso directo generando menos código. Los
parámetros static son posibles sólo si el compilador esta en modo no-extendido. Los
parámetros por defecto se definen como auto.

3. Calificadores del almacenamiento

Además de los calificadores ANSI (const, volatile) el MPLAB introduce los siguientes
tipos nuevos: far, near, rom y ram. A continuación se muestra la posición donde se
almacena la variable asociada en función del calificador.



rom


far Cualquier posición de memoria de Cualquier posición de memoria de

ram


Laboratorio de Sistemas Basados en Microprocesador y Sistemas Electrónicos Digitales



3

Manual del compilador Microchip C18



programa

near Cualquier posición de memoria de

programa menor de 64 KB

datos (es el valor por defecto)
En las 0x5f posiciones más bajas de
memoria RAM. Se permite acceso en
modo banco.



Las variables tipo RAM residen en la memoria de datos y dependiendo del calificador
far/near, se supondrá que están en cualquier banco o restringidas a la posiciones más
bajas de la RAM (0-0x5f) que permite el acceso en modo banco.

Las variables tipo ROM residen en memoria de programa. Si se utiliza el calificativo far
la variable puede estar en cualquier posición de ROM y si es un puntero puede contener
direcciones por encima de los 64KB. Al contrario si es near la variable se sitúa en
posiciones menores a 64KB o si es un puntero puede acceder sólo hasta posiciones por
debajo de 64KB.

Ejemplos de definición de punteros:


Tipo de puntero
Puntero a datos
Puntero
programa
Puntero lejano a memoria de programa

a memoria

cercano

de

Ejemplo
char * dmp;

tamaño
16 bits
rom near char * npmp; 16 bits

rom far char * fpmp;

24 bits



4. Divergencias del ISO


Tamaño de los operandos
Por defecto el compilador C18 realiza las operaciones aritméticas utilizando el tamaño
del operando más grande implicado en la operación. Por ejemplo:

unsigned char a, b;
unsigned i;
a = b = 0x80;
i = a + b; /* ISO require que i == 0x100, pero en C18 i == 0 */

En el caso de las constantes se elige el tipo de datos más pequeño que pueda representar
el valor sin desbordamiento. Por ejemplo:

#define A 0x10 /* A se considera un char*/
#define B 0x10 /* B se considera un char*/
#define C (A) * (B)
unsigned i;
i = C; /* ISO require que i == 0x100, pero en C18 i == 0 */

Para que funciona conforme el ISO y todas las operaciones se realicen por defecto con
tamaño de 16 bits (int) hay que compilar con la opción –Oi.


Constantes numéricas
Las constantes se definen en diferentes formatos dependiendo del prefijo:


0x (hexadecimal), 0 (octal), 0b (binario).


Laboratorio de Sistemas Basados en Microprocesador y Sistemas Electrónicos Digitales



4

Manual del compilador Microchip C18



Constantes de tipo cadena
Las variables almacenadas en memoria de programa suelen ser cadenas de caracteres.
Este tipo de variable se define como: const rom char[]

La sección .stringtable de la sección romdata contiene todas las cadenas constantes de
memoria de programa. También se pueden declarar tablas de caracteres. Ejemplos:

rom const char table[][20] = { "string 1", "string 2", "string 3", "string 4"
};

Table es una variable que contiene 80 caracteres en memoria de programa, ya que está
compuesta de 4 cadenas de 20 caracteres cada una.

Los punteros a variables no son compatibles a menos que apunten a objetos compatibles
situados en el mismo tipo de memoria.

Ejemplo de copia de una cadena en ram a otra en rom:

void str2ram(static char *dest, static char rom *src)
{

while ((*dest++ = *src++) != '\0');

}

5 Extensiones del lenguaje


Ensamblador en línea
Se puede inserter código en ensamblador mediante _asm y _endasm. Aunque dentro de
un bloque en ensamblador no se deben usar ni directivas del ensamblador, las etiquetas
deben acabar con :, no se soporta direccionamiento indirecto, la constantes se
especifican como en C.

Ejemplo:

_asm

/* User assembly code */


// Move decimal 10 to count

/* Loop until count is 0 */

MOVLW 10
MOVWF count, 0



start:

done:

DECFSZ count, 1, 0
GOTO done
BRA start

_endasm

6 Secciones

Una sección es una porción de una aplicación situada en una dirección de memoria
específica. Las secciones pueden contener datos o código y se pueden situar en memoria
de datos o programa. Hay dos tipos de secciones para cada tipo de memoria.


Laboratorio de Sistemas Basados en Microprocesador y Sistemas Electrónicos Digitales



5

Manual del compilador Microchip C18



Memoria de programa
- code – contiene instrucciones
- romdata – contiene variables y constantes

Memoria de datos
- udata – contiene variables no inicializadas estáticas
- idata – contains variables inicializadas estáticas

Las declaración de sección mediante la palabra reservada #pragma cambia la sección en
la cual actualmente el compilador está insertando el programa.

Las secciones se pueden definir como:



Directive de sección:

Absolutas: cuando se especifica su posición de comienzo.

# pragma udata [attribute-list] [section-name [=address]]
# pragma idata [attribute-list] [section-name [=address]]
# pragma romdata [overlay] [section-name [=address]]
# pragma code [overlay] [section-name [=address]]

|
|
|

attribute-list:


access
overlay



|
section-name: identificador
address: constante

Existen 4 secciones por defecto:


Tipo
code
romdata
udata
idata

Nombre
.code_filename
.romdata_filename
.udata_filename
.idata_filename


El código se engloba dentro de la sección code. Las variables en rom dentro de la
sección romdata. Las variables en ram dependiendo de si están inicializadas o no en
udata o idata. En el siguiente programa de ejemplo cada una de las variables y funciones
pertenecen a una sección distinta dependiendo de su definición:

rom int ri;
rom char rc = 'A';

int ui;
char uc;

int ii = 0;
char ic = 'A';

void foobar (void)
{
static rom int foobar_ri;
static rom char foobar_rc = 'Z';
...
}
void foo (void)
{


Laboratorio de Sistemas Basados en Microprocesador y Sistemas Electrónicos Digitales



6

Manual del compilador Microchip C18



static int foo_ui;
static char foo_uc;
...
}
void bar (void)
{
static int bar_ii = 5;
static char bar_ic = 'Z';
...
}

Secciones asociadas a cada objeto:


Object
ri

rc
foobar_ri
foobar_rc
ui

uc
foo_ui
foo_uc
ii
ic
bar_ii
bar_ic
foo
bar
foobar



Section Loc
  • Links de descarga
http://lwp-l.com/pdf14526

Comentarios de: Microchip Mplab C18 C compiler - Guía del estudiante (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

Revisar política de publicidad