4 Stimmen

Wie kann das Hinzufügen von Daten zu einem Segment im Flash-Speicher das Timing eines Programms beeinträchtigen?

Ich habe eine eingebettete Echtzeit-Anwendung, bei der der Hauptzyklus mit 10 KHz läuft. Sie läuft auf einem TI TMS320C, der so konfiguriert ist, dass er vom Flash bootet. Ich habe vor kurzem ein initialisiertes Array zu einer Quelldatei hinzugefügt, und plötzlich ist das Timing vermasselt (in einer Weise, die zu komplex ist, um gut zu erklären - im Wesentlichen ein serieller Port schreiben ist nicht mehr rechtzeitig abgeschlossen.)

Die Dinge, die mich daran stören:

  • Ich bin nicht einmal auf die neuen Daten zugreifen nur die Deklaration eines initialisierten Arrays.
  • Es ist größenabhängig - das Problem tritt nur auf, wenn das Array mehr als 40 Wörter umfasst.
  • Ich weiß, dass ich keine Datensegmente in der Link Map überlaufe.
  • Es gibt keine Zwischenspeicherung von Daten, also liegt es nicht an einer Störung der Cache-Konsistenz.

Haben Sie eine Idee, wie die einfache Vergrößerung des .cinit-Segments in Flash das Timing Ihres Codes beeinflussen kann?

Zusätzliche Informationen:
Ich dachte, dass der Code vielleicht verschoben wurde, aber er ist gut von den Daten getrennt. Ich habe anhand der Memory Map überprüft, dass alle Codesegmente vor und nach dem Fehler die gleichen Adressen haben. Ich habe auch überprüft, dass keines der Segmente voll ist - die einzigen Adressen, die sich in der Map ändern, sind einige wenige im Abschnitt .cinit. Dieser Abschnitt enthält Datenwerte, die zur Initialisierung von Variablen im Ram verwendet werden (wie mein Array). Auf ihn sollte nach dem Aufruf von main() nicht mehr zugegriffen werden.

1voto

Frosty Punkte 5655

Mein Verdacht deutet auf eine Änderung der Ausrichtung zwischen Ihren Daten/Code und dem zugrunde liegenden Medium/Speicher hin. Das Hinzufügen von Daten würde die Speicherpositionen in Ihrem Heap verändern (je nach Speichermodell) und könnte Ihren Code über eine "Seitengrenze" auf dem Flash-Gerät verschieben, was zu einer Latenz führt, die vorher nicht vorhanden war.

1voto

Vielleicht verdrängt das neue statisch zugewiesene Array vorhandene Daten in langsamere Speicherbereiche, wodurch die Zugriffe auf diese Daten langsamer werden?

1voto

moonshadow Punkte 81155

Tritt das Problem wieder auf, wenn das Array das letzte Objekt in seinem Adressbereich ist? Wenn nicht, versuchen Sie, die Array-Deklaration so zu verschieben, dass die Objekte, die nach dem Array platziert sind, nach und nach vor das Array geschoben werden. Auf diese Weise können Sie das betreffende Objekt ausfindig machen und herausfinden, warum das Verschieben des Objekts die Verzögerung verursacht.

1voto

Ilya Punkte 3068

Ich würde das Risiko eingehen und behaupten, dass Sie hier kein Leistungsproblem haben, sondern eine Art von Speicherbeschädigung, die sich als Leistungsproblem äußert. Das Hinzufügen eines Arrays zu Ihrer ausführbaren Datei verändert das Speicherbild. Meine Vermutung ist also, dass Sie eine Speicherbeschädigung haben, die größtenteils harmlos ist (z.B. Überschreiben eines nicht benutzten Teils des Speichers), und dass das Verschieben des Speichers um mehr als 40 Bytes die Speicherbeschädigung zu einem größeren Problem macht. Was ist eine echte Frage

1voto

AShelly Punkte 33678

Nachdem ich mehr als einen Tag lang auf Leiterbahnen und generierte Baugruppen gestarrt habe, glaube ich, dass ich es herausgefunden habe. Es stellte sich heraus, dass die Ursache ein Designproblem war, das nur dann zu Störungen führte, wenn die ISR, die den Schreibvorgang an der seriellen Schnittstelle auslöste, mit einer ISR höherer Priorität kollidierte. Das Timing funktionierte zufällig so, dass man nur ein paar zusätzliche Anweisungen zu einer Schleife hinzufügen musste, um die beiden Interrupts kollidieren zu lassen.

Es stellt sich also die Frage: Wie führt die Speicherung zusätzlicher Daten im Flash-Speicher, auf die nicht zugegriffen wird, dazu, dass zusätzliche Anweisungen ausgeführt werden?

Es scheint, dass die Antwort mit den Vorschlägen von Frosty und Frederico zusammenhängt, aber nicht ganz dasselbe ist. Das neue Array verschiebt zwar einige bestehende Variablen, aber nicht über Seitengrenzen hinweg oder in langsamere Regionen (auf diesem Board sollten die Zugriffszeiten für alle Regionen gleich sein). Es ändert jedoch die Offsets einiger Strukturen, auf die häufig zugegriffen wird, was den Optimierer veranlasst, leicht unterschiedliche Befehlssequenzen für den Zugriff auf diese Strukturen auszugeben. Die eine Datenausrichtung kann zu einem Pipeline-Stall von einem Zyklus führen, während die andere dies nicht tut. Und diese wenigen Anweisungen verschieben das Timing so stark, dass das zugrunde liegende Problem aufgedeckt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X