Hallo,
gerade bin ich wieder auf der Suche nach einem fiesen Fehler.
prinzipiell habe ich das Problem auf folgende Zeilen eingeschränkt:
char buf[100];
strcpy(buf, "hello");
diese erzeugen mir mit dem XC8 V1.41 und einem pic18f26k80 den Fehler:
"C:\Program Files (x86)\Microchip\xc8\v1.41\sources\common\strcpy.c:19:
error: (1466) registers unavailable for code generation of this
expression
(908) exit status = 1"
leider hilft mir weder tante google, noch das XC8 Compiler manual weiter
- da wird ein ähnliches beispiel exakt wie o.g. abgebildet.
Hat jmd noch ne Idee?
Bonsi schrieb:> Bitteschön
Ist das der ganze Code? Wird buf sonst nicht verwendet? Anscheinend hat
der PIC (bzw. sein Compiler) nicht genügend (virtuellen) Stack-Speicher.
Mach buf mal static oder gloabl.
Wenn ich ein neues Projekt erstelle und o.G. Code einfüge, erhalte ich
exakt denselben Fehler wie beschrieben.
Buf wird sonst nicht verwendet. Abgesehen davon wird sie ja lokal
definiert.
Variable als global bringt nix, genauso wenig wie static.
Im Prinzip geht es um alles rund um strcpy. Auch einen const *char ,
welchen ich aus einer funktion übergebe und in ein lokales array
kopieren will, funktioniert nicht.
Lt. XC8 wird aber strcpy zur Verfügung gestellt...
Gegenfrage:
Wer nutzt ggf. strings beim XC8 und hat ein ansichtsbeispiel für mich,
wie es denn funktioniert?
Ich denke, es hat etwas mit rom/ram und der variablenablage zu tun,
welche im PIC16 doch anders ist als im PIC18. Aber des Rätsels Lösung
habe ich noch nicht gefunden...
> "C:\Program Files (x86)\Microchip\xc8\v1.41\sources\common\strcpy.c:19:> error: (1466) registers unavailable for code generation of this> expression> (908) exit status = 1"
Bei mir kompiliert dein Code anstandslos. Wieso ist bei dir ein strcpy.c
eingebunden? Oder heißt deine Sourcedatei so?
Servus,
sorry für die späte Antwort. hatte viel um die Ohren...
Scheinbar gehen die XC8 string.h bibliotheken einfach nicht mit dem
PIC18.
Ich muss auch hier über den FlashRead befehl gehen und meine eigenen
Funktionen definieren, z.B.:
1
voidmy_strcpy(char*dest,constchar*src){
2
while(FLASH_ReadByte(src)!='\0'){
3
*dest=FLASH_ReadByte(src);
4
dest++;
5
src++;
6
}
7
*dest='\0';
8
}
das geht dann einwandfrei.
Nun lese ich beim V1.41:
Note that this distribution no longer includes the PIC18 peripheral
libraries.
Spitze. Und wieso?
Wie eingangs erwähnt nutze ich aber den XC8 compiler! Der C18
unterstützt meinen Chip gar nicht.
Was geht: XC8 V1.38 + sprintf aus der Bibliothek + eigene
strcpy/strcat/strlen Funktionen.... Zufriedenstellen ist das alles
nicht.
Speicherproblem wie Link von skorpionix andeutet.
Kommt wohl von den Optimierungsfunktionen des XC8.
Welche Version des XC8?
Was macht char buffer[30]? Die PROV Version machts sicher besser.
Die lib Funktionen sind alle im Quellcode im Installationsverzeichnis
des XC8
*/xc8/v1.xx/sources Da gibts beim V1.38 dann common pic und pic18
Quellcode. In pic18 ist wohl dies was für PIC18 unterschiedlich ist.
- Speicherproblem war mir auch klar, deswegen über die Flashread befehle
- Optimierung war aus, bringt deswegen auch nix
- Version 1.41
- char buffer[30] war einfach ein Test, um im Debugger das Ergebnis zu
verfolgen.
- ich muss die in Ruhe mal gegenprüfen, wo da beim sprintf der
unterschied ist
Danke! :) VG
> schön und gut - aber eine string oder stdio bibliothek sollte halt dann> auch noch funktionieren.
Die funktionieren auch schön und gut. Lösen aber dein Problem nicht,
weil du den Hinweis vom Compiler auf strcpy.c nicht verstehen willst.
Dann hilf mir doch bitte auf die Sprünge.
Nur zur Info - kompilieren tut es, und eine strcpy.c ist und war nie
eingebunden.
Dann öffne einfach selbst n projekt, schreib fünf Zeilen Code und schieb
es auf besagten pic - es geht nicht.
Bonsi schrieb:> Dann öffne einfach selbst n projekt, schreib fünf Zeilen Code und schieb> es auf besagten pic - es geht nicht.
Habe ich gemacht, und hier mein ganzes Quellcode für den besagten
PIC18F26K80, ein Problem kann ich nicht erkennen. Um das compilieren zu
können habe ich zu deinen 5 Zeilen noch xc.h eingefügt und XINST
ausgeschaltet. Ist das vielleicht die Ursache bei dir?
Im Simulatorbetrieb kein Problem, auf realer Hardware kann ich nicht
testen mangels ebendieser:
1
#pragma config XINST = OFF // Extended Instruction Set (Disabled)
<edit> So richtig Sinn macht das folgende eigentlich nicht. Bonsi muss
ja eigentlich auch den Debug-Mode verwenden und den Hinweis auf XINST
bekommen haben... (Ich lass den Post trotzdem stehen)</edit>
Witkatz :. schrieb:> und XINST> ausgeschaltet. Ist das vielleicht die Ursache bei dir?
Könnte ich mir auch vorstellen. Normalerweise arbeite ich beim
entwickeln immer mit Debugbuilds. Da bekommt man gleich entsprechende
eine Fehlermeldung, weil der XC8 XINST ja gar nicht unterstützt.
Blöd ist nur, dass man beim Release-Build gar keine Meldung bekommt...
Grundsätzlich IMMER ALLE config bits angeben.
http://microchipdeveloper.com/mplabx:view-and-set-configuration-bits
Hier die config bits. XINST war/ist aus, alles im Lot.
Naja, kompiliert hat es bei mir auch, im Debugger/auf dem Display war
das Ergebnis ein anderes...
Wie gesagt, alles geht jetzt mit XC8 V1.38 + sprintf aus der Bibliothek
+ eigene strcpy/strcat/strlen Funktionen.
Hast du die PLIB installiert? Hab da was im Microchip-Forum gelesen:
http://www.microchip.com/forums/m963971.aspx
strcpy hat hier noch keine Probleme verursacht, erst gestern ein
Bestandsprojekt mit MPLABX 3.55 und XC8 1.41 nach kleinen Änderungen neu
kompiliert und auf nen PIC18F46K80 geflasht.