TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: skm en 03 de Julio de 2006, 20:09:34

Título: Duda sobre mapeado de variables en RAM
Publicado por: skm en 03 de Julio de 2006, 20:09:34
Hola muy buenas!

No se si es el sitio adecuado para preguntar esto pero no se donde ponerlo sino.
Hace poco que he empezado simulando pics con proteus. Estoy haciendo un programa para un 18F4520. Su funcion es comunicarse con el puerto serie del ordenador. Resulta que utilizo muchas variables. El otro dia no me funcionaba una funcion que trabaja con una variable de tipo int. Observando bien con proteus paso a paso descubrir que una variable de tipo char string[n]  machacaba literalmente la posicion de memoria de la anterior variable tipo int. Como es posible esto??? es un error o esto puede pasar? el problema segun creo es que adjunte a la variable char string[n] un numero superior a n de caracteres y el resultado fue que sobreescribio las siguientes posiciones de memoria que en principo estaban mapeadas a otras variables. Finalmente solbente el problema definiendo las variables pequeñas antes que las grandes, de esta manera si me passo de caracteres machacaran posiciones libres de memoria.

Mi pregunta es: Esto es algo raro? es fallo de proteus? es fallo del PIC o simplemente (y como de costumbre) es fallo mio?

encontre este error un poco curioso ia que siempre habia creido que no tenia que preocuparme por las variables ya que suponia que el pic se ocupaba de administrarlas correctamente.

bueno muchas gracias ejje, perdon por el toston. A ver si alguien puede aclarame esta pequeña duda.
Título: Re: Duda sobre mapeado de variables en RAM
Publicado por: maunix en 03 de Julio de 2006, 23:38:41
Mi pregunta es: Esto es algo raro? es fallo de proteus? es fallo del PIC o simplemente (y como de costumbre) es fallo mio?

1) Si tu defines un string[10] y le escribes 14 caracteres... sobreescribirás la memoria que le sigue al string.  Esto te ocurrirá con un pic o con una PC.  Es un error básico de C

2) Si tu definiste un string[10] y ocupaste solo 8 bytes y te sobreescribió la ram... entonces es un problema del compilador (cosa que dudo)

Si pones el ejemplo será mas fácil de ayudarte


Saludos
Título: Re: Duda sobre mapeado de variables en RAM
Publicado por: skm en 04 de Julio de 2006, 07:24:39
Gracias maunix, no sabia esto que comentas. No puedo poner el ejemplo porque como te digo cambie el programa y luego ia me funciono. Me queda una pregunta... quano declaras una string[] que hacen el compilador y el pic? tambien machacan posiciones de memoria?
Título: Re: Duda sobre mapeado de variables en RAM
Publicado por: maunix en 04 de Julio de 2006, 08:13:11
Gracias maunix, no sabia esto que comentas. No puedo poner el ejemplo porque como te digo cambie el programa y luego ia me funciono. Me queda una pregunta... quano declaras una string[] que hacen el compilador y el pic? tambien machacan posiciones de memoria?

Seguramente ;)

Además , el problema no es que el "compilador machaque posiciones", eres tu :) 

Eso lo debes tener muy en claro, no para achacarte culpas sino para poder ver la causa de lo que te ocurre y solucionar errores.

Saludos
Título: Re: Duda sobre mapeado de variables en RAM
Publicado por: skm en 04 de Julio de 2006, 11:07:28
Muchas gracias!

Hacia unos dias que ocurrian cosas raras con los strings jejeje ahora ia me ha quedado claro! Tendre que vigilar bien las variabes!

Un saludo!
Título: Re: Duda sobre mapeado de variables en RAM
Publicado por: jfh900 en 04 de Julio de 2006, 11:44:51
Como bien dice maunix si sobrepasamos las posiciones que ocupa el string escribimos en las posiciones adyacentes. Este efecto que es comun en todos los compiladores de "C" se conoce como "buffer overflow" y debe ser el programador el encargado de comprobarlo. En el mundo de los hackers este error se ha explotado sobremanera para producir la DoS "Denegación de Servicios" e inclusive para obtener una puerta de entrada a un ordenador. Por que "C" no comprueba el indice en los buffer, pues simplemente por eficiencia, el código corre mas deprisa si el compilador no hace esta comprobación, ya que en la mayoria de los casos no se produce rel desbordamiento del buffer y las instrucciones añadidas son innecesarias.