Ich denke, Sie könnten Schwierigkeiten haben, eine Mikrosekundenverzögerung zu erzielen, die mit dem ESP8266 sowohl genau als auch nicht blockierend ist .
Gemäß der NodeMCU-Dokumentation :
Wenn Sie sich den app/modules/tmr.c
Code für diese Funktion ansehen, werden Sie feststellen, dass er eine niedrige Ebene ets_delay_us (Verzögerung) ausführt. Diese Funktion ist nicht Teil des NodeMCU-Codes oder des SDK. Es ist tatsächlich Teil des xtensa-lx106
Boot-ROM und eine einfache Zeitschleife, die den internen CPU-Takt abfragt. Dies geschieht bei deaktivierten Interrupts. Wenn diese aktiviert sind, kann nicht garantiert werden, dass die Verzögerung den Anforderungen entspricht.
tmr.delay()
ist wirklich für den Einsatz gedacht, wenn Sie eine genauere Zeitsteuerung für eine externe Hardware-E / A benötigen (z. B. Anheben eines GPIO-Pins für 20 μSec). Es wird in so gut wie jedem anderen Anwendungsfall keinen funktionalen Zweck erfüllen, da jede andere systemcodebasierte Aktivität für die Ausführung blockiert wird. Im schlimmsten Fall wird Ihre Anwendung beschädigt und es kommt zu schwer zu diagnostizierenden Timeout-Fehlern.
Es scheint, dass Interrupts in diesem Fall einfach deaktiviert werden müssen, weil der Interrupt-Handler viel mehr Zeit in Anspruch nehmen würde, als die gesamte Verzögerung angenommen hätte, wenn ein Interrupt mitten in der Verzögerung mit einem kurzen Intervall (in der Größenordnung von einigen Mikrosekunden) aufgetreten wäre sein.
Angenommen, Sie wollten einen Timer für 20 Mikrosekunden, und bei etwa 10 μs trat ein Interrupt auf. Wenn der Handler mehr als 10 μs benötigt, haben Sie die von Ihnen beabsichtigte Verzögerung von 20 μs bereits überschritten.
Wir können also ausschließen, tmr.delay()
ob Interrupts erforderlich sind.
Ich habe ein bisschen mehr gegraben, und anscheinend unterstützt der ESP8266 Mikrosekunden-Timer, bei ets_timer_arm_new()
denen der letzte Parameter Null ist. NodeMCU setzt diesen Wert jedoch auf 1, wobei die Millisekundengenauigkeit verwendet wird . Dieser Beitrag scheint diese Idee zu unterstützen:
Wenn Sie das Intervall zwischen zwei gpio-Interrupts abrufen müssen, verwenden Sie die System-API system_get_time (), um die relative Zeit zu berechnen. (Us) Wenn Sie eine os_timer-API verwenden möchten, um ein us-Timer-Ereignis zu arrangieren, verwenden Sie system_timer_reinit am Anfang von user_init und rufen Sie os_timer_arm_us auf.
Wenn Sie versuchen möchten, die Firmware zu bearbeiten und neu zu erstellen, ist dies möglicherweise einen Versuch wert. Es gab jedoch eine Funktionsanforderung dafür , die wie folgt abgelehnt wurde:
Also habe ich Nanosekunden-Timer getestet und kann keine Intervalle von weniger als 1000us festlegen (mit kompiliertem und entferntem Code und im 160-MHz-CPU-Modus habe ich so etwas wie 800us). Ist dies ein Fall, um neue (meist unbrauchbare) Funktionen bereitzustellen?
- Djphoenix
Nicht machbarer Geldautomat -> Schließen.
- marcelstoer