Uso de punteros en SDCC
2 participantes
Página 1 de 1.
Uso de punteros en SDCC
Hola gente.
Bueno despues de mocho tiempo sin poder aportar nada hoy os dejo un pequeño apunte sobre la utilización de los famosos punteros de C i tambien muy utiles, con este ejemplo tambien se implementa como asignar una variable en un aposicion concreta de la RAM del PIC
/* ---------------------------------------- */
/* Template source file generated by piklab */
/* ---------------------------------------- */
#include
/* ------------------------------------------------- */
/* Configuration bits: adapt to your setup and needs */
typedef unsigned int word;
word at 0x2007 CONFIG = 0x3F39;
char at 0x30 var; //Declaro una variable de 8 bits(1 byte) i la
//coloco en la posición 0x30 de la memoria RAM
char *p; //Declaro un puntero del mismo tipuo que VAR
/*
void isr() interrupt 0 {
interrupt service routine
<< insert interrupt code >>
}
*/
void main() {
var = 2; //Variable VAR = 2
p = &var; //inicializo p con la dirección donde esta VAR (sepodria sustituir por //0x30 puesto que en este caso la savemos)
*p = 4; //Asignamos el valor 4 a la dirección que apunta p
//ahora la variable VAR = 4
/* << insert code >> */
}
Con el uso de la assignacion de variables en posiciones conocidas podemos realizar un bucle muy sencillo para modificar los valores de estas variables, cosa que de dejar que el compilador nos asigne las posiciones nos pude llevar a posiciones aleatorias, mucho mas complejo de tratar.
Espero les sea de ayuda
Bueno despues de mocho tiempo sin poder aportar nada hoy os dejo un pequeño apunte sobre la utilización de los famosos punteros de C i tambien muy utiles, con este ejemplo tambien se implementa como asignar una variable en un aposicion concreta de la RAM del PIC
/* ---------------------------------------- */
/* Template source file generated by piklab */
/* ---------------------------------------- */
#include
/* ------------------------------------------------- */
/* Configuration bits: adapt to your setup and needs */
typedef unsigned int word;
word at 0x2007 CONFIG = 0x3F39;
char at 0x30 var; //Declaro una variable de 8 bits(1 byte) i la
//coloco en la posición 0x30 de la memoria RAM
char *p; //Declaro un puntero del mismo tipuo que VAR
/*
void isr() interrupt 0 {
interrupt service routine
<< insert interrupt code >>
}
*/
void main() {
var = 2; //Variable VAR = 2
p = &var; //inicializo p con la dirección donde esta VAR (sepodria sustituir por //0x30 puesto que en este caso la savemos)
*p = 4; //Asignamos el valor 4 a la dirección que apunta p
//ahora la variable VAR = 4
/* << insert code >> */
}
Con el uso de la assignacion de variables en posiciones conocidas podemos realizar un bucle muy sencillo para modificar los valores de estas variables, cosa que de dejar que el compilador nos asigne las posiciones nos pude llevar a posiciones aleatorias, mucho mas complejo de tratar.
Espero les sea de ayuda
pentax33- Participante
- Mensajes : 11
Fecha de inscripción : 28/11/2008
Re: Uso de punteros en SDCC
Gracias por la información, ahora veo el tema de los punteros más claro.
Una pregunta:
Si por ejemplo quiero leer o escribir una "cadena" de resgistros, se podría hacer usando punteros?
algo como *p,*p+1,*p+2.... ??
Una pregunta:
Si por ejemplo quiero leer o escribir una "cadena" de resgistros, se podría hacer usando punteros?
algo como *p,*p+1,*p+2.... ??
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Uso de punteros en SDCC
Hola
Si lo he entendido bien te refieres ha poder leer una parte de la memoria correlativa? Si es asi, si se puede hacer, esta es una de las aplicaciones que pueden tener:
Como un puntero contiene la direccion de un registro de la memoria 0x30;0x31........ ( no el contenido de dicho registro A;B;G;....) podemos recorrer un bloque de memria por medio de un bucle ya sea un FOR o un WHILE.
Los fundamentos basicos de los punteros son
int dato ---> Declaracion de una variable normal del mismo tipo que el puntero (Obligatorio que sea del mismo tipo)
int *p ----> Declaramos un puntero llamado p del tipo int
p= &dato -----> El puntero contiene la dirección de dato,no el valor
Si ponemos en vez de &dato un numero hex. que pueda ser una direccion de memoria entonces p el puntero entenderá que ese numero es la dirección que debe apuntar. Pero si leemos esa posicion de memoria obtendremos otro resultado
p=0x30 ----> Con esto le decimos a p que apunte a la direccion 0x30 de la RAM unicamente.
dato=0x30 ----> Con esto encambio tenemos que ponemos el valor hex 0x30 en una posicion llamada dato posicion desconocida
Para poner o lleer un valor de una direccion que este apuntando el puntero p usariamos esto;
*p="a" -----> Con esta instruccion le decimos que ponga el caracter a en la posicion que esta pauntando p ; por ejemplo 0x30 de la RAM, si ahora lleemos la poscion 0x30 nos aparece que contiene el caracter a.
De todo esto es facil deducir como realizar una bucle por un aparte de la RAM, vamos asignanado valores 0x30, 0x31.... x+1 por medio de un bucle i vamos peniendo todos los valores.
Aqui os dejo esta pagina donde lo explica mucho mejor: http://www.ucontrol.com.ar/wiki/index.php/CCS_-_Punteros
Si lo he entendido bien te refieres ha poder leer una parte de la memoria correlativa? Si es asi, si se puede hacer, esta es una de las aplicaciones que pueden tener:
Como un puntero contiene la direccion de un registro de la memoria 0x30;0x31........ ( no el contenido de dicho registro A;B;G;....) podemos recorrer un bloque de memria por medio de un bucle ya sea un FOR o un WHILE.
Los fundamentos basicos de los punteros son
int dato ---> Declaracion de una variable normal del mismo tipo que el puntero (Obligatorio que sea del mismo tipo)
int *p ----> Declaramos un puntero llamado p del tipo int
p= &dato -----> El puntero contiene la dirección de dato,no el valor
Si ponemos en vez de &dato un numero hex. que pueda ser una direccion de memoria entonces p el puntero entenderá que ese numero es la dirección que debe apuntar. Pero si leemos esa posicion de memoria obtendremos otro resultado
p=0x30 ----> Con esto le decimos a p que apunte a la direccion 0x30 de la RAM unicamente.
dato=0x30 ----> Con esto encambio tenemos que ponemos el valor hex 0x30 en una posicion llamada dato posicion desconocida
Para poner o lleer un valor de una direccion que este apuntando el puntero p usariamos esto;
*p="a" -----> Con esta instruccion le decimos que ponga el caracter a en la posicion que esta pauntando p ; por ejemplo 0x30 de la RAM, si ahora lleemos la poscion 0x30 nos aparece que contiene el caracter a.
De todo esto es facil deducir como realizar una bucle por un aparte de la RAM, vamos asignanado valores 0x30, 0x31.... x+1 por medio de un bucle i vamos peniendo todos los valores.
Aqui os dejo esta pagina donde lo explica mucho mejor: http://www.ucontrol.com.ar/wiki/index.php/CCS_-_Punteros
pentax33- Participante
- Mensajes : 11
Fecha de inscripción : 28/11/2008
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.