In Ihrem speziellen Beispiel, bei dem ein Leser ist und ein Autor (also nicht in der „allgemeinen“ Fall, und definitiv nicht in dem Fall, wo es mehrere Autoren gibt) dann würde ich vorschlagen, eine Sperre ist nicht notwendig, wenn die Variable geschrieben/gelesen wird, ist die natürliche Wortgröße der Architektur, und wird benötigt, wenn die Variable nicht das natürliche Wort ist Größe der Architektur.
In Ihrem Fall die Wortgröße 32 Bits, also wenn die Variable ein uint32_t ist, dann wird es atomar aktualisiert werden, und ein Schreiber und mehrere Leser ist sicher. Wenn auf der anderen Seite waren die Variable ein uint64_t dann wird es (geschrieben) in zwei separaten Zugängen aktualisiert werden, und Sie müssen den Leser nicht gewährleistet, auf die Variable zugreifen zwischen den beiden Updates, dies zu tun wäre eine beschädigte lesen (halber aktualisierter) Wert.
In FreeRTOS eine einfache Möglichkeit, dies zu tun, wäre also einen grundlegenden kritischen Abschnitt zu verwenden:
taskENTER_CRITICAL();
My64BitVariable++;
taskEXIT_CRITICAL();
Die beste Methode hängt jedoch von der Häufigkeit des Ereignisses. Wenn das Ereignis "nicht zu schnell" ist, dann senden Sie den Wert von einer Aufgabe zu einer anderen mit einem queue, in welchem Fall FreeRTOS kümmert sich um alle Nebenläufigkeit Probleme für Sie. Besser (schneller und weniger RAM), abhängig davon, was die empfangende Aufgabe macht, muss die Schreibaufgabe den Wert direkt an die empfangende Aufgabe senden, unter Verwendung einer direct to task notification.
Ja. Unterbricht. Treiber. Verwenden Sie Sperren. –
@MartinJames: Sperren in einem Interrupt-Handler? Klingt wie eine schlechte Idee. – Olaf