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?
1 | #include <string.h> |
2 | |
3 | void main(void) { |
4 | char buf[100]; |
5 | strcpy(buf, "hello"); |
6 | |
7 | while (1) { |
8 | |
9 | }
|
10 | }
|
Bitteschön. Auskommentieren der besagten zwei Zeilen lässt den Fehler verschwinden und das Projekt kompilieren.
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 | void my_strcpy(char *dest, const char *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?
Bonsi schrieb: > Spitze. Und wieso? Weil MCHP (bei den 8bit PICs) nur noch auf MCC setzt?
:
Bearbeitet durch User
schön und gut - aber eine string oder stdio bibliothek sollte halt dann auch noch funktionieren. just my 2 cents ;)
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.
:
Bearbeitet durch User
- 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.
:
Bearbeitet durch User
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)
|
2 | |
3 | #include <xc.h> |
4 | #include <string.h> |
5 | |
6 | void main(void) { |
7 | char buf[100]; |
8 | strcpy(buf, "hello"); |
9 | |
10 | while (1) { |
11 | }
|
12 | }
|
Bonsi schrieb: > Der C18 unterstützt meinen Chip gar nicht. Sicher? Was hast du denn für eine Version?
<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
:
Bearbeitet durch User
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.