Forum: Mikrocontroller und Digitale Elektronik PIC18 & XC8: strcpy


von Bonsi (Gast)


Lesenswert?

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?

von Robin S. (der_r)


Lesenswert?

Bitte den ganzen Code posten.

von Bonsi (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Bonsi (Gast)


Lesenswert?

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.

von Bonsi (Gast)


Lesenswert?

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...

von 1N 4. (1n4148)


Lesenswert?

> "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?

von Bonsi (Gast)


Lesenswert?

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?

von Volker S. (vloki)


Lesenswert?

Bonsi schrieb:
> Spitze. Und wieso?

Weil MCHP (bei den 8bit PICs) nur noch auf MCC setzt?

: Bearbeitet durch User
von Bonsi (Gast)


Lesenswert?

schön und gut - aber eine string oder stdio bibliothek sollte halt dann 
auch noch funktionieren.

just my 2 cents ;)

von B. P. (skorpionx)


Lesenswert?


von Bonsi (Gast)


Lesenswert?

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.

von Wolfgang R. (portside)


Lesenswert?

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
von Bonsi (Gast)


Lesenswert?

- 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

von 1N 4. (1n4148)


Lesenswert?

> 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
von Bonsi (Gast)


Lesenswert?

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.

von Witkatz :. (wit)


Lesenswert?

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
}

von Volker S. (vloki)


Lesenswert?

Bonsi schrieb:
> Der C18 unterstützt meinen Chip gar nicht.

Sicher? Was hast du denn für eine Version?

von Volker S. (vloki)


Lesenswert?

<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
von Reflower (Gast)


Angehängte Dateien:

Lesenswert?

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.

von 1N 4. (1n4148)


Lesenswert?

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
Noch kein Account? Hier anmelden.