Kann ich in Microchip C18 eine Funktion erstellen, die sowohl Ram- als auch Rom-Zeiger akzeptiert?

8

Wenn ich eine Funktion deklariere, die const char* akzeptiert und ein String-Literal übergebe, bekomme ich ein

  

Warnung: [2066] Typ-Qualifikationsmerkmal stimmt nicht überein in Zuordnung

, da Zeichenfolgenliterale rom const char* sind. Es ist das gleiche umgekehrt.

Obwohl der PIC eine Harvard-Architektur ist, wird der Speicher in einen zusammenhängenden Adressraum abgebildet. Daher sollte es theoretisch möglich sein, sowohl Ram- als auch Rom-Zeiger auf die gleiche Weise zu unterstützen. Wahrscheinlich muss ich rom-Zeiger verwenden, weil sie 24 Bit sind, während Ram-Pointer 16 Bit sind.

Es ist jedoch nicht möglich, const char* auf const rom char* zu übertragen.

    
AndreKR 17.05.2011, 01:49
quelle

2 Antworten

3

Leider ist dies eine inhärente Einschränkung des Microchip C18-Compilers. Ein Zeiger in C18 kann auf ROM oder RAM zeigen, aber nicht auf beide.

Aus diesem Grund finden Sie doppelte Funktionen für ROM- und RAM-Operationen in z. die Microchip Application Libraries :

%Vor%

Der Hi-Tech PICC-18-Compiler hat zur Laufzeit den richtigen Adressraum, der eine flexiblere Zeigerverwendung ermöglicht. Dies ist einer der Gründe, warum ich C18 zugunsten von PICC-18 aufgegeben habe.

Siehe die Antworten auf diese Frage und John Temples Vergleich von Hi-Tech PICC-18 und MPLAB C18 für mehr Einsicht.

    
mizo 17.05.2011, 11:59
quelle
1

Hinzufügen zu der Antwort von Mizo (ich kann nicht kommentieren, da ich hauptsächlich auf Arduino.SE und EE.SE antworte)

Der XC8-Compiler verfügt auch über die Funktion, um zur Laufzeit den geeigneten Adressraum zu bestimmen.

Ja, Hi-Tech PICC-18 tut dies, ist aber nicht der einzige Compiler, der das tut.

Obwohl ich verstehen könnte, wenn der Wechsel des Compilers im Moment unmöglich sein könnte.

Aus diesem Grund möchten Sie möglicherweise die folgenden Funktionen in string.h

verwenden %Vor%

Und du könntest deine Funktion wie folgt machen:

%Vor%

^ Dies ist kein tatsächlicher Code, sondern mehr Pseudo-Code. Außerdem bin ich mir nicht sicher, ob es effizient ist.

    
Paul 03.04.2015 08:52
quelle

Tags und Links