Der XC8-Linker von Microchip erkennt einige benutzerdefinierte Abschnittsnamen nicht

Leicht verwandt mit diesem: https://softwareengineering.stackexchange.com/questions/254734/microchip-xc8-how-to-pack-code-against-an-upper-limit

Ich kann Code gut verschieben, aber ich habe einige Probleme mit Konstanten:

Beispielcode:

#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();
    }
}

Linker-Optionen:

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

Wenn ich es ohne Linker-Optionen baue oder wenn ich nur die Funktionen angebe (wie oben), wird es ohne Fehler gebaut und ich sehe alle Abschnittsnamen in der Map-Datei, also weiß ich, dass sie alle da sind. Aber wenn ich angebe, wo eine Konstante platziert werden soll, schlägt der Build fehl, weil dieser Abschnittsname nicht definiert wurde. Wenn ich zum anderen Satz konstanter Deklarationen wechsle (die Kommentare vertausche), sind diese Namen plötzlich nicht mehr definiert.

Ich habe das Gefühl, dass dies ein Fehler in der Toolchain ist, und ich habe Microchip über die Support-Website davon in Kenntnis gesetzt, aber kennt jemand eine gute Problemumgehung?

Ich möchte lieber nicht die Adresse jeder Konstante direkt im Quellcode angeben, da das gesamte Projekt viele davon hat und sie alle Größe und Inhalt von einer Version zur nächsten ändern können.

Ich verwende einen PIC16F1454, aber ich bin mir ziemlich sicher, dass das für dieses Problem keine Rolle spielt.

Antworten (2)

Ich habe beim technischen Support von Microchip ein Ticket eingereicht, und nach ein paar Tagen haben sie das gefunden

 #pragma psect <default_section>=<new_section>

würde für Konstanten funktionieren, genau wie es soll. Sie haben sich das Problem notiert und gesagt, dass sie es in der nächsten Version beheben würden, sodass entweder das oder __section("new_section") auch für Konstanten funktionieren wird.

Ich mag das #pragma nicht, weil Sie die default_section kennen müssen (kann durch erfolgreiches Kompilieren ohne die Direktive und Durchsuchen der Map-Datei gefunden werden) und weil sie die gesamte Quelldatei betrifft, während __section() nur das eine Element betrifft, das es wird mit verwendet. Aber für meine Anwendung funktioniert es.

Diese Stackoverflow-Frage Declare a specific address for a string in MPLAB XC8 Microchip complier enthält eine Antwort:

Anstatt es zum Beispiel dem Linker zu sagen-L-pappnfo=0x78E0

Es gibt eine Syntax, um den Speicherort einer Variablen direkt anzugeben, zum Beispiel:

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

Dies klingt jedoch nicht nach dem, was Sie tun möchten. Du sagst:

Ich möchte lieber nicht die Adresse jeder Konstante direkt im Quellcode angeben, da das gesamte Projekt viele davon hat und sie alle Größe und Inhalt von einer Version zur nächsten ändern können.

Abschnitt "3.4.3.3 WIE PLATZIERE ICH VARIABLEN IM PROGRAMMSPEICHER?" des MPLAB® XC8 C Compiler User's Guide sagt:

Der Qualifizierer const impliziert, dass die qualifizierte Variable schreibgeschützt ist. Als Folge davon werden alle Variablen (mit Ausnahme von Auto-Variablen oder Funktionsparametern), die als const qualifiziert sind, in den Programmspeicher gestellt, wodurch wertvoller Daten-RAM freigegeben wird

Es sieht also so aus, als würden alle constVariablen automatisch in den Programmbereich gestellt, was meiner Meinung nach das ist, was Sie wollen.

So weit, so gut, aber ich möchte sie zwischen 1200h und 1FFDh im Programmbereich platzieren, nicht irgendwo im Programmbereich. Das ist der Teil, der nicht funktioniert.
In Ordnung Entschuldigung. Ich finde PIC schwergängig und das XC8-Compiler-Handbuch ist etwas seltsam. Ich kenne mich viel besser aus mit AVR, ARM, Freescale, ...