PIC18 & XC8: strcpy

Gast #4952620
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?
Gast
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.
Gast
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.
Gast
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?
Gast
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?
Gast
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.
Gast
- 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.
Gast
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
}
<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
Gast
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.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.