String aus MC Flash mit strcat lesen wie?



  • Hallo,

    ich möchte ein String das sich im Flash eines MC's befindet auslesen bekomme es aber nicht hin.

    Das String ist in ASCII + 0x00 am Ende im Flash hinterlegt.

    strcpy(Command,"Firmware: ");				// FW-Version
    strcat(Command, ??? Pointer to Flash address ???);
    

    Ich weis nicht wie ich den Pointer auf das String setzten muss...
    Das String befindet sich ab Adresse: 0xDF6080

    Hier ein Beispiel wir ein 16-Bit Wert aus dem Flash ausgelesen wird:

    // Read from Flash
    unsigned short read_flash(unsigned short adr)
    {
    		return (*(__far unsigned int*) (0xDF6000 + adr * 2));
    }
    

    Gruß
    Jackson



  • const char *string = (char*)0xDF6080;
    puts(string);
    


  • Jackson0 schrieb:

    Hier ein Beispiel wir ein 16-Bit Wert aus dem Flash ausgelesen wird:

    // Read from Flash
    unsigned short read_flash(unsigned short adr)
    {
    		return (*(__far unsigned int*) (0xDF6000 + adr * 2));
    }
    

    Für String dann so:

    __far char* get_str_from_flash (unsigned short offset)
    {
        return (__far char*) (0xDF6000 + offset);
    }
    

    Wobei der Offset in deinem konkreten Fall 0x80 sein muss



  • funktioniert leider beides nicht.

    Ich glaube das (__far unsigned int*) nicht mit der Datenstrucktur zu tun hat, also egal ob es char, short oder sonstwas ist, sondern das das rein was mit der Speicheradresse des Flash (0xDF6xxx) zu tun hat.
    Deswegen muss es immer Integer sein.

    Kann man nicht irgendwie direkt den Pointer in strcat auf die Flash Speicherstelle setzen wie in dem Beispiel:

    strcat(Command,&InputData[13]);
    

    Das InputData String ist 30 Bytes groß un der Pointer wird ab Byte 14 bis Stringende gesetzt.



  • Manchmal gibt es für den Flashzugriff eigene Funktionen.
    Das hängt aber auch vom µC und Compiler ab.

    Da diese Informationen aber streng geheim sind, dürfen die genauen Antworten auch nicht öffentlich gepostet werden.



  • _far und _near (oder so), geben die adressbreite an. vielleicht musst du eine spezielle lstrcat-funktion nehmen, die mit __far char* umgehen kann? wie heißt der chip den du benutzt?



  • DirkB schrieb:

    Da diese Informationen aber streng geheim sind, dürfen die genauen Antworten auch nicht öffentlich gepostet werden.

    das ist doch egal.



  • Nein da ist nix geheimes dran nur halt ein spezieller Berich im Flash (0xDF4000-0xDF7FFF) der als Datenspeicher benutzt werden kann. Es ist ein Cypress FX16 MC.

    // Read from Flash
    unsigned short read_flash(unsigned short adr)
    {
            return (*(__far unsigned int*) (0xDF6000 + adr * 2));
    }
    
    read = read_flash(0x00);	// 16Bit Daten (short) aus Flash auslesen
    

    zum Beispiel funktioniert prima...

    Hier noch ein anderes Beispiel:

    typedef struct  PPG_Setup_Data {   // Länge 10 Byte
        char Channel;
        char Status;
        short Period;
        short Duty100;
        short Duty50;
        short Duty1;
    } Setup_PPG;
    
    __far Setup_PPG *PPG = (__far Setup_PPG*) ((__far unsigned int*) (0xDF4000));
    


  • Befindet sich an Adresse 0xDF6080 wirklich der String selbst, oder nur ein Zeiger auf den String (der dann wiederum an der dort eingetragenen Adresse liegt)?



  • Nein dort ist wirklich der String selbst gespeichert.



  • Du lässt dir aber auch wirklich alles aus der Nase ziehen... Ist die Zeichenkette nullterminiert, warum funktioniert der Code von Wutz und Pulling my Strings nicht („funktioniert nicht” ist keine Beschreibung des Fehlers).

    Wenn du weißt, dass der String 30 Byte lang ist, kannst du 15 shorts (Annahme 8/16 Bit) daraus ziehen und den String selber zusammenbauen und nullterminieren?
    Ansonsten kannst du auch direkt im Debugger verfolgen, was da vor sich geht.



  • Schreib doch deine eigene strcat Funktion, die mit den __far-Pointern für den Flash umgehen kann.



  • Ich hatte bereits im ersten Beitrag geschrieben:
    Das String ist in ASCII + 0x00 am Ende im Flash hinterlegt.

    Die Testausgabe war leer (als wenn String an erster Stelle eine 0x00 hätte).

    Debugger habe ich leider keinen.

    Wenn ich mit Short auslese sind alle einzelnen Short high und low Bytes vertauscht und die müsste ich dann auch noch "umdrehen". Ich könnte das Programmieren dachte aber es gibt einen ganz simplen Weg mit dem Adresspointer...



  • Jackson0 schrieb:

    dachte aber es gibt einen ganz simplen Weg mit dem Adresspointer...

    Der C-Standard kennt keinen Flashspeicher.
    Wenn der in deinem System mit einem besonderen Pointer angesprochen wird, ist das eine spezielle Erweiterung, deren Handhabung du in der Dokumentation zu deinem System nachlesen musst.



  • Jackson0 schrieb:

    Ich könnte das Programmieren dachte aber es gibt einen ganz simplen Weg mit dem Adresspointer...

    Wie das geht habe ich dir gezeigt.
    Wenn dein Hardwareanbieter sich nicht an die Standard C Regeln hält, dann musst du dich eben exakt an dessen Vorgaben halten und kannst keine standardkonformen Weg einschlagen.
    C bietet für Bit- und Zeigerfrickelei enorme Vielfalt, viel mehr als jede andere Programmiersprache, deshalb wird es oft - wie du siehst - von Hardwarefricklern benutzt - dann natürlichermaßen - wie du siehst - ohne jegliche Plattformunabhängigkeit und du bewegst dich in deinem eigenen Universum, also ohne die Chance, gängige Standard C Wege zu beschreiten.



  • Wenn ich mit Short auslese sind alle einzelnen Short high und low Bytes vertauscht und die müsste ich dann auch noch "umdrehen". Ich könnte das Programmieren dachte aber es gibt einen ganz simplen Weg mit dem Adresspointer...

    Es wird wohl so sein das dein Flash eben nur short-weise genutzt werden kann und das sollte auch definitiv aus einer Hardware Doku zu deinem System hervor gehen, wenn es wirklich so ist - was nur du bestätigen kannst - musst du es eben short-weise machen

    was aber definitiv nicht erklärt warum dann dein Setup_PPG Beispiel "geht"



  • und es wäre wohl auch sehr hilfreich wenn du sagen würdest welchen
    FX16 du hast

    http://www.cypress.com/products/16fx

    und welchen C/C++ Kompiler du verwendest



  • warst du nach den letzten Versuchen so frustriert das du den MC ertst mal ein Jahr in die Schublade gesteckt hast 🙂

    https://www.c-plusplus.net/forum/342041-full


Anmelden zum Antworten