No conduce a una cadena vacía, es solo que el contexto en el que está utilizando la cadena es incorrecto.
Con los chips PIC más pequeños y, de hecho, con la mayoría de los chips de arquitectura de Harvard, hay dos rangos de direcciones de memoria distintos: la RAM y los espacios de direcciones ROM. Ambos espacios de direcciones tienen los mismos números de direcciones, por lo que puede resultar confuso si no estás seguro de lo que estás haciendo.
Para ilustrar, su cadena podría estar en la dirección 100. Ahora, ¿es esa la dirección RAM 100 o la dirección ROM 100? Ambos son la dirección 100, pero cada uno necesita instrucciones diferentes para llegar a ellos.
Por supuesto, usar una función que lea la dirección RAM 100 no devolverá los mismos datos que una función que lee la dirección 100 de la ROM, por lo que su cadena parecerá estar vacía, o no tendrá sentido.
C18 coloca automáticamente todas las constantes de cadena en la ROM:
El uso principal de los datos ubicados en la memoria del programa es para cadenas estáticas. En mantenimiento
Con esto, MPLAB C18 coloca automáticamente todas las constantes de cadena en la memoria del programa.
Este tipo de constante de cadena es “array de char ubicado en la memoria del programa”, (const
rom char []). La sección .stringtable es un romdata (ver Sección 2.9.1
"#Pragma sectiontype") sección que contiene todas las cadenas constantes.
Debido al hecho de que las cadenas constantes se mantienen en la memoria del programa, hay múltiples
Versiones de las funciones estándar que tratan con cadenas. Por ejemplo, el strcpy
La función tiene cuatro variantes, lo que permite la copia de una cadena hacia y desde los datos y
memoria del programa
Por lo tanto, debe asegurarse de utilizar las funciones correctas para acceder a la ROM y no a la RAM.
Las cadenas deben pasarse a las funciones de la manera correcta para garantizar que se acceda con el código correcto. Todos los parámetros de cadena deben ser:
static const rom char *
La mayoría de las funciones de cadena estándar tienen variantes adicionales, que terminan en pgm2ram
, ram2pgm
o pgm2pgm
. Aquellos que necesitan solo un parámetro tienen el sufijo pgm
para el acceso basado en ROM.
La familia de funciones printf tiene el parámetro adicional "% S" para cadenas basadas en ROM (a diferencia de "% s" para cadenas basadas en RAM).