El enlazador XC8 de Microchip no reconoce algunos nombres de sección personalizados

2

Relacionado ligeramente con este: enlace

Puedo reubicar el código muy bien, pero estoy teniendo problemas con las constantes:

Código de ejemplo:

#include <xc.h>

unsigned char buffer[16];

__section("SecConst1") const unsigned char constants1[] = "const1";
__section("SecConst2") const unsigned char constants2[] = "const2";
//__section("SecText1") const unsigned char constants1[] = "const1";
//__section("SecText2") const unsigned char constants2[] = "const2";

__section("SecText1") void fill_buffer1(void)
{
    unsigned char i = sizeof(constants1);
    do
    {
        i--;
        buffer[i] = constants1[i];
    }
    while(i);
}

__section("SecText2") void fill_buffer2(void)
{
    unsigned char i = sizeof(constants2);
    do
    {
        i--;
        buffer[i] = constants2[i];
    }
    while(i);
}

__section("SecText") void main(void)
{
    while(1)
    {
        fill_buffer1();
        fill_buffer2();
    }
}

Opciones de enlazador:

-L-aClass1=1200h-17FFh,1800h-1FFDh -L-dClass1=2 -L-pSecText1=Class1 -L-pSecText2=Class1 -L-pSecText=Class1

Si lo compilo sin opciones de vinculador, o si solo especifico las funciones (como arriba), se compila sin errores y veo todos los nombres de las secciones en el archivo de mapa, así que sé que están todos ahí. . Pero si especifico dónde colocar una constante, la compilación falla porque el nombre de esa sección no se definió. Si cambio al otro conjunto de declaraciones constantes (intercambiar los comentarios), los nombres de esos de repente no se definen.

Siento que esto es un error en la cadena de herramientas, y se lo he dicho a Microchip a través de su sitio de soporte, pero ¿alguien sabe de una buena solución?

Prefiero no especificar la dirección de todas las constantes directamente en el código fuente porque el proyecto completo tiene muchas de ellas y todas pueden cambiar el tamaño y el contenido de una versión a la siguiente.

Estoy usando un PIC16F1454, pero estoy bastante seguro de que no importa para este problema.

    
pregunta AaronD

2 respuestas

1

Envié un ticket al soporte técnico de Microchip y, después de unos días, encontraron que

 #pragma psect <default_section>=<new_section>

funcionaría para constantes tal como se supone que debe. Tomaron nota del problema y dijeron que lo arreglarían en la próxima versión, por lo que o __section ("new_section") también funcionarán para las constantes.

No me gusta el #pragma porque debes conocer la sección predeterminada (se puede encontrar compilando correctamente sin la directiva y buscando el archivo del mapa) y porque afecta a todo el archivo fuente, mientras que __sección () solo afecta al un elemento que se utiliza con. Pero para mi aplicación, funciona.

    
respondido por el AaronD
0

Esta pregunta de stackoverflow Declara un la dirección específica para una cadena en el compilador de microchips MPLAB XC8 contiene una respuesta:

En lugar de decirle al vinculador, por ejemplo, -L-pappnfo=0x78E0

Hay una sintaxis para directamente especificar la ubicación de una variable, por ejemplo:

const unsigned char _app_nfo[31] @ 0x78E0 = {"V0.0 No        - 05/12/12"};

Sin embargo, esto no suena como lo que quieres hacer. Usted dice:

  

Prefiero no especificar la dirección de cada constante directamente en el   código fuente porque el proyecto completo tiene muchos de ellos y   todos pueden cambiar el tamaño y el contenido de una versión a la siguiente.

Sección "3.4.3.3 ¿CÓMO PUEDO COLOCAR LAS VARIABLES EN LA MEMORIA DEL PROGRAMA?" de la Guía del usuario del compilador MPLAB® XC8 C dice:

  

El calificador const implica que la variable calificada es de solo lectura.   Como consecuencia de esto, cualquier variable (excepto las variables automáticas o   parámetros de función) const constantes se colocan en la memoria del programa,   liberando así una valiosa memoria RAM

Parece que todas las variables const se colocan en el espacio del programa automáticamente, lo que creo que es lo que quieres.

    
respondido por el gbulmer

Lea otras preguntas en las etiquetas