Prioritäten bei Threads
Was ist denn mit Python Modul mit - functions from the C library gemeint?
https://docs.onion.io/omega2-docs/i2c-p ... odule.html
https://docs.onion.io/omega2-docs/i2c-p ... odule.html
Da liegt halt eine C-Bibliothek drunter. Die könntest du auch direkt benutzen von C aus.
Zuerstmal ist dieser Verlust auch so schon schwer erklärbar. Wobei die CPU-Last wie ich finde zu hoch ist. Für das bisschen Code. Um das zu reduzieren würde ich das logging testweise abklemmen ( nur lange sleep) und schauen, wie hoch die last dann ist. Ziel ist, NUR die I2C Daten zu lesen, und einfach nichts mit denen zu machen. Also auch keine anderen Dinge wie blinkende LEDs oder sowas.
Wenn das nichts bringt, dann sollte zb der im I2C Prozess auf 10ms erhöht werden können. Bei 30ms brauchst du eh nur 15ms Abtastrate. Oder ist der präziser Anfang des Impulses wichtig?
Und dann ist da die Entscheidung, nicht GPIOs zu benutzen. Das ist nicht so clever, weil der Linux Kernel für GPIOs auch interrupts beherrscht. Sprich: die Hardware stellt sicher, das kein Impuls verloren geht. Da sollte man eigentlich bei den geringen Datenraten niemals verpassen.
Dann gibts halt noch das große Thema Echtzeit Kernel. Leider hat deine etwas esoterische Plattform da nicht auf Anhieb was zu bieten.
Und schlussendlich kannst du einen Arduinomoder anhnliches anhängen, der die Impulse zählt. Und den seriell abfragen.
Zuerstmal ist dieser Verlust auch so schon schwer erklärbar. Wobei die CPU-Last wie ich finde zu hoch ist. Für das bisschen Code. Um das zu reduzieren würde ich das logging testweise abklemmen ( nur lange sleep) und schauen, wie hoch die last dann ist. Ziel ist, NUR die I2C Daten zu lesen, und einfach nichts mit denen zu machen. Also auch keine anderen Dinge wie blinkende LEDs oder sowas.
Wenn das nichts bringt, dann sollte zb der im I2C Prozess auf 10ms erhöht werden können. Bei 30ms brauchst du eh nur 15ms Abtastrate. Oder ist der präziser Anfang des Impulses wichtig?
Und dann ist da die Entscheidung, nicht GPIOs zu benutzen. Das ist nicht so clever, weil der Linux Kernel für GPIOs auch interrupts beherrscht. Sprich: die Hardware stellt sicher, das kein Impuls verloren geht. Da sollte man eigentlich bei den geringen Datenraten niemals verpassen.
Dann gibts halt noch das große Thema Echtzeit Kernel. Leider hat deine etwas esoterische Plattform da nicht auf Anhieb was zu bieten.
Und schlussendlich kannst du einen Arduinomoder anhnliches anhängen, der die Impulse zählt. Und den seriell abfragen.
Dieser Teil Code macht eine CPU Last von 8%
Code: Alles auswählen
from OmegaExpansion import onionI2C
from multiprocessing import Process, Queue
import time
read_i2c_queue = Queue()
i2c = onionI2C.OnionI2C()
i2c.write(0x20, [0xFF])
previous_pulse = [False] * 6
while True:
i2cdata = i2c.readBytes(0x20, 0xFF, 1)
timestamp = time.time()
for channel in range(6):
pulse = not i2cdata[0] & (2 ** channel)
if pulse and not previous_pulse[channel]:
read_i2c_queue.put((channel, timestamp))
previous_pulse[channel] = pulse
time.sleep(.01)