Hallo zusammen,
bei der Portierung eines Programms vom STM32F1 auf STM32L1 bin ich auf ein Problem gestoßen, bei dem ich ohne Hilfe nicht mehr weiter komme.
Im betreffenden Programmteil geht es um die Ausgabe von Menüpunkten auf einem Display. Lasse ich das Menü anzeigen, erscheinen bei jedem Menüpunkt nur wirre Zeichen. Ich verwende die Menü Lib von hier: https://github.com/Jomelo/LCDMenuLib2/tree/master
Anbei der verwendete Code auf den fehlerhaften Teil reduziert:
1 |
|
2 |
|
Definitionen:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
In der Funktion soll der Content für eine Displayzeile aus dem Flash geholt und in den Buffer content_text geschrieben werden. Dabei wird aber von der falschen Addresse gelesen, daher werden falsche Zeichen in content_text geschrieben.
Nehmen wir als Beispiel den Menüpunkt mit der id=0 (Entspricht dem Array Element g_LCDML_DISP_lang_lcdml_table[0]). Dort ist im Debugger der richtige String "Menüpunkt 1" ab Adresse 0x8012bcb zu sehen. In der Variable temp1 kommt dann aber nur noch der Wert 0x2bcb an. Wahrscheinlich wird hier falsch gecastet, daher ist die Adresse nur 2 byte lang, der Rest wird abgeschnitten. In meiner Implementierung für den STM32F1 ist das Problem wahrscheinlich nicht aufgefallen, da hier die Strings zufälligerweise in den ersten 64kB des Flashs lagen.
Ich verstehe leider nicht, was in "*(const unsigned short *)" die doppelte Benutzung von * bewirkt. Den Code habe ich nur stumpf zusammenkopiert. Könnte mir vielleicht einer von den C-Profis unter euch sagen, wo der Fehler liegt? Meine Vermutung ist, dass die Definition von pgm_read_word falsch ist. Das würde mich aber wundern, da dies in vielen Quellen im Netz in der pgmspace.h Datei für den STM32 so zu sehen ist.
Vielen Dank im Voraus.
Gruß, Philipp