XC8 - asignación de ROM constante para PIC12F1501

1

Tengo problemas con la asignación de memoria constante con XC8. Intento hacer esto:

const unsigned char patterns[12] = {
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
};

pero recibo este error: "no puedo encontrar 0xC palabras (0xc con total) para psect" stringtext "en la clase" STRCODE "(el mayor rango contiguo no utilizado 0x57)". Eso es extraño porque el espacio necesario es menor que el espacio disponible (contiguo). En la guía de usuario:

enlace

Lo leí

  

stringtext psect debe vincularse dentro de la primera mitad de cada página de memoria del programa

No estoy muy seguro de por qué. Supongo que el compilador llena todas las primeras mitades antes de intentar encontrar espacio para constantes. De todas formas, ¿puede aconsejarme cómo dar una pista al compilador donde ubicar la sección de constantes? O ¿Hay alguna otra forma de solucionar este problema?

Estoy usando MPLAB porque me resulta difícil usar MPLAB X.

P.S. Tenga en cuenta que la ROM está casi llena, solo quedan 0x57 bytes. Está bien fragmentado en pequeñas secciones para adaptarse mejor.

    
pregunta NickSoft

2 respuestas

2
  

el texto de cadena debe estar vinculado dentro de la primera mitad de cada página de memoria del programa

Esta restricción solo se aplica a los PIC de "línea de base", como el 12C509, que solo puede llamar a subrutinas en la primera mitad de cada página de 256 bytes. ¿Por qué esto importa? En los PIC más antiguos no hay instrucciones para leer datos de la ROM, por lo que se desarrolló un método llamado Tabla de Lectura, en el que las matrices de datos se almacenan como una secuencia de instrucciones RETLW (retorno de la subrutina con literal en el registro de trabajo).

El 12F1501 es una de la nueva generación de PIC de rango medio mejorados que pueden usar su registro de índice para leer la ROM directamente, por lo que no tiene restricciones sobre la ubicación de los datos en la ROM. Sin embargo, el compilador XC8 aún insiste en intentar alinear stringtext en los límites de la página, y se niega a ponerlo en la página cero, incluso cuando solo unos pocos bytes de código de inicialización están 'en la forma'. Esto puede ocasionar que se quede sin espacio aunque tenga una cantidad significativa de ROM "libre".

La forma más fácil de solucionar este problema es forzar simplemente sus arreglos en una sección de código, luego el compilador debe alinearlos en los límites de las palabras sin espacios (como el código normal). Solo agregue un especificador de sección a cada definición de matriz, como esto: -

const __section("mystringtext") unsigned char patterns[12] = {
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
};    
    
respondido por el Bruce Abbott
0

Hay varias formas en que la CPU puede acceder a la memoria. Algunas instrucciones (que creo que son las predeterminadas) solo pueden acceder a la memoria dentro de un cierto rango desde donde se ejecuta la instrucción (básicamente son relativas a esa instrucción).

Por lo tanto, puede ser crítico dónde se asignan los datos para que estas instrucciones puedan acceder a ellos.

Hay una palabra clave especial __far que le dice al compilador que se debe acceder a esta variable desde más lejos de lo normal. La calificación de la matriz con esa palabra clave debería permitir que funcione, aunque con una eficiencia reducida. Como dice el manual:

  

El calificador __far se puede usar para indicar que las variables o funciones están ubicadas en la "memoria remota". Exactamente lo que constituye la memoria remota depende del dispositivo de destino, pero normalmente es la memoria la que requiere un código más complejo para acceder. Las expresiones que involucran objetos altamente calificados generalmente generan un código más lento y más grande.

Y va al sitio algunos ejemplos:

__far int serialNo;
__far int ext_getCond(int selector);

Tenga en cuenta que __far, como muestran los ejemplos, también se puede usar en funciones si es necesario llamarlas desde la memoria más de lo que puede resolver una llamada relativa.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas