Forum: Mikrocontroller und Digitale Elektronik PIC18 & XC8: strcpy


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bonsi (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Bitte den ganzen Code posten.

von Bonsi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
#include <string.h>

void main(void) {
    char buf[100];
    strcpy(buf, "hello");
    
    while (1) {
        
    }
}


Bitteschön. Auskommentieren der besagten zwei Zeilen lässt den Fehler 
verschwinden und das Projekt kompilieren.

von A. S. (achs)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Bonsi (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.:
void my_strcpy(char *dest, const char *src) {
    while (FLASH_ReadByte(src) != '\0') {
        *dest = FLASH_ReadByte(src);
        dest++;
        src++;
    }
    *dest = '\0';
}

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)


Bewertung
0 lesenswert
nicht lesenswert
Bonsi schrieb:
> Spitze. Und wieso?

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

: Bearbeitet durch User
von Bonsi (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert

von Bonsi (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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:
#pragma config XINST = OFF      // Extended Instruction Set (Disabled)

#include <xc.h>
#include <string.h>

void main(void) {
    char buf[100];
    strcpy(buf, "hello");
   
    while (1) {  
    }
}

von Volker S. (vloki)


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

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

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.