Speicherzugriffsfehler: bei einer globalen Variabel, mit Wert 1500

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Das was Du da beschreibst kann nicht passieren weil ja beide Threads ihre ”eigenen Register” haben, also kann nicht die 1 auf die 0 addiert werden. Wenn das passieren könnte, dann ist der Code der den Kontextwechsel zwischen Threads macht ziemlich im Eimer.

@Honig: Was passieren kann wenn Du das `lock` entfernst ist das ein ``count=0`` den Counter *gar nicht* zurücksetzt. Das erhöhen von `count` um eins sind ja eigentlich zwei Schritt die nacheinander passieren: Alten Wert von `count` abfragen, und neuen um eins erhöhten Wert an `count` zuweisen. Und wenn das Rücksetzen dazwischen kommt, dann ist es als wäre es gar nicht passiert. Hier mal die beiden Threads in atomare Aktionen (bezüglich `count`) dargestellt mit thread.schritt) vor den einzelnen Schritten:

1.1) count = 0
2.1) tmp = count
2.2) count = tmp + 1

Wenn das so wie's da steht ausgeführt wird ist alles okay. `count` hätte danach den Wert 1. Auch das hier wäre okay:

2.1) tmp = count
2.2) count = tmp + 1
1.1) count = 0

`count` hätte danach den Wert 0. Problematisch ist diese dritte mögliche Variante:

2.1) tmp = count
1.1) count = 0
2.2) count = tmp + 1

Hiernach hat `count` den Wert 43 wenn es vorher den Wert `42` hatte. Die Zuweisung von 0 ist einfach verloren gegangen und es wurde weiter gezählt als wenn nichts gewesen wäre.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Honig
User
Beiträge: 11
Registriert: Mittwoch 9. Januar 2019, 09:18

@__deets__ & @__blackjack__ danke für eure ausführliche Erklärung, jetzt habe ich verstanden was das Problem ist.

Ich hätte da dann noch eine andere Frage. Wenn ich jetzt den Raspberry Zero verwende, hat der Prozessor einen CPU-Takt von 1000 MHz und nur einen Core, dazu würde ich das Raspbian lite Betriebssystem verwende, welche Frequenz kann ich dann ca. höchstens am GPIO-Pin Messen? Es geht mir dabei jetzt um keine Zahl, sondern nur um die Größenordnung. Hat da jemand Ideen/Erfahrungen?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist so nicht einfach zu beantworten. Das ist ein Linux-OS. Das macht noch ca 3 andere Sachen, waehrend dein Programm laeuft. Da ist die CPU-Frequenz an sich ueberhaupt nicht das Problem. Sondern das Tuning des Gesamtsystems.

Denn wenn du 20 Sekunden lang mit 20MHz oder so GPIO Daten gesampelt hast, dann kommt der Scheduler daher & schmeisst dein Programm erstmal von seiner Zeitscheibe - weil gerade ein Netzwerkpaket von Facebook oder was auch immer reingekommen ist. Und damit bricht ploetztlich die Datenrate auf wenige kHZ ein.

Was nun genau das richtige Vorgehen fuer dein Problem ist, kommt darauf an, was das System denn genau tun soll. Nur zaehlen? Wenn ja, dann nimm dir einen Arduino. Der kann das besser und zuverlaessiger. Kannst du ja an den PI haengen und per serieller Schnittstelle oder so abfragen, was gerade der Zaehlstand ist.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

@__blackjack__: yupp, da habe ich mich irgendwie verbaselt.
Honig
User
Beiträge: 11
Registriert: Mittwoch 9. Januar 2019, 09:18

@__deets__ ok danke für deine Antwort, dann werde ich noch schauen wie ich es am besten mache.

Vielen Dank an euch Sirius3, __blackjack__ und __deets__ ihr habt mir sehr geholfen.

Schönen Abend noch :-)
Antworten