Hallo
Mit dem Pico-C/C++ SDK wollte ich in einem C-Programm den Flash-speicher schreiben. Vorher muß man ja erst mal löschen. Dabei bin ich auf Schwierigkeiten gestoßen, die meinen Pico beim Aufruf von flash erase zum Absturz brachten. Nach stundenlangen Versuchen bin ich auf folgende Verhaltensweisen gestoßen:
flash_range_erase(w,defvier*FLASH_SECTOR_SIZE));// geht nicht
11
12
flash_range_erase(w,(size_t)(4*FLASH_SECTOR_SIZE));// geht nicht
13
flash_range_erase(w,(size_t)(defvier*FLASH_SECTOR_SIZE));// ok
14
15
16
flash_range_erase(w,(int)(4*FLASH_SECTOR_SIZE));// geht nicht
17
flash_range_erase(w,(int)(defvier*FLASH_SECTOR_SIZE));// ok
18
19
size_tvier=4;
20
flash_range_erase(w,vier*FLASH_SECTOR_SIZE);// geht nicht
21
22
intvier=4;
23
flash_range_erase(w,vier*FLASH_SECTOR_SIZE);// ok
24
25
intvier=defvier;
26
flash_range_erase(w,vier*FLASH_SECTOR_SIZE);// geht nicht
Das ganze verhält sich für mich nicht logisch nachvollziehbar, besonders die letzten 2 Versuche. Kann mir da jemand auf die Sprünge helfen. Besonders die Konstanden (hier 4) möchte ich schon mit #define programmieren.
Ich hab noch mal nachgedacht. Zumindest den letzten Fall kann ich mir erklären: der Compiler optimiert die Zuweisung von defvier in die Variable vier weg und setzt defvier direkt in erase Anweisung ein. Somit ist auch die vorletzte Zeile logisch, da die direkte Angabe von 4, wie in Versuch 1 funktioniert. Bleibt die Frage warum defvier nicht geht?
Es sollte nur zwei Varianten geben, eine, bei der gleich die Konstante 16384 verwendet wird, und eine, bei der ein Wert (Registerinhalt o.ä.) mit 4096 multipliziert wird.
kannst du in die Funktion reinsteppen und siehst dann mit welchem count Wert die Funktion aufgerufen wird?
z.B.
flash_range_erase( w, (int)(4 * FLASH_SECTOR_SIZE) ); // geht nicht
flash_range_erase( w, (int)(defvier * FLASH_SECTOR_SIZE) ); // ok
müßte ja exakt das selbe sein, da defvier durch 4 vom Preprocessor ersetzt wird.
Sicher das da nicht etwas anderes in die Suppe spuckt?
Wenn das SDK in C++ geschrieben ist, solltest Du mal schauen, ob der von Dir angegebene Prototyp der Funktion der einzige ist.
In C++ kann man nämlich Funktionen überladen. Also technisch gesehen, verschiedene Funktionen mit dem selben Namen erstellen, die anhand der Typen der übergebenen Parameter unterschieden werden.
Wenn die Funktionen dann wirklich das Selbe mit unterschiedlichen Daten anstellen, ist sowas eine echte Erleichterung. Wenn unterschiedliche Dinge passieren, abhängig davon, ob der 2. Parameter vorzeichenbehaftet ist, stiftet es eher Verwirrung.
@A.B. ..dachte ich auch. In der Original Version hat es nicht funktioniert, deshalb hab ich eine extra Testfunktion probiert.
@Flunder Ist nur C.
@Harald Ich kann zwar Assembler, kenne aber noch nicht den Befehlssatz und die Registerstruktur vom Pico. Um den Code zu vereinfachen habe nur die Flash_erase fkt in Funktionsrumpf belassen. Nun hat der Compiller die gesamte Funktion eleminiert, es ist kein Ass-Code mehr vorhanden. Ist das sinnlos! Soll dabei der Flash nun nicht gelöscht werden?
Note these functions are unsafe if you are using both cores, and
the other
is executing from flash concurrently with the operation. In this
could be the
case, you must perform your own synchronisation to make sure that no
XIP
accesses take place during flash programming.
Aber so doof ist doch keiner, dass er sich selber seinen Flash unterm Hintern wegschiesst.
Man ändert doch nicht Programmcode und Interrupt-Tabellen so zwischendurch.
ich würde es eher interpretieren im Sinne von: während Flashlöschen keine Codeausführung aus dem Flash(deshalb auch copy in RAM) und eben noch zwei Cores.
Ich kenne die PicoArchitektur nicht weiter...aber ich würde einfach denken das ihn da irgendetwas anders verarscht und es nicht unbedingt mit den defines zusammenhängt
Du musst die Interrupte manuell sperren. Anonsten kann es passieren, das während er den Flash schreibt ein Interrupt auftritt welcher Programm Code aus dem XIP(Flash) erfordert. Dann knallts, weil der XIP währed Flashzugriffen aus ist.
Danke, das war es. Ich hab nur einen Interrupt, der aber selten läuft. Deshalb gings mal und dann wieder nicht. Und da hat mir auch meine komische Messreihe nicht geholfen.
Alle anderen Ursachen die hier erwähnt wurden hatte ich schon ausgeschlossen.
Gruß Rudi
Funktioniert aber nicht! Pico blockiert wieder ab und zu beim Flashen. Im SDK ist "add_repeating_timer" nicht bei den Interrupts aufgelistet. Ist er am Ende keiner?