[Bericht] RISC-V Inbetriebnahme

Da müssen Verriegelungen/Semaphore/Mutex geschaffen werden.

So weit ich das absehen kann, betrifft das alle Ressourcen, welche sich die beiden Cores teilen müssen/sollen

Auch hier ein Schritt in die Richtung.
Noch mit der Holzhammer Methode, aber ein Ansatz.

#pragma once
//#include <Arduino.h>

// Frei nach Peterson
// https://de.wikipedia.org/wiki/Algorithmus_von_Peterson

class MutualBlock
{
  private:
  volatile int q[2] = {0, 0};
  volatile int turn = 0;

  public:
  void begin() 
  {
    int id = current_coreid();
    q[id] = 1;
    turn = !id;
    while(q[!id] == 1 && turn == !id)
    {
      // hier waehre evtl. eine gute Gelegenheit fuer einen TaskSwitch
    }
  }

  void end()
  {
     q[current_coreid()] = 0;
  }
};

begin() belegt die Ressource und wartet bis sie vom anderen Core freigegeben wurde.
end() gibt sie frei.

An geeigneter Stelle, für beide Cores sichtbar, legt man eine Instanz für die zu schützende "Sache" an.

z.B. um die Serielle zu schützen:

MutualBlock serialBlock;

Als nächsten Schritt, muss man den gefährdeten Bereich umrahmen mit den zwei Methodenaufrufen begin() und end().

Hier auch ein Beispiel:

  {
    serialBlock.begin();
    Serial.print("Core: "); Serial.println(current_coreid());
    Serial.print("text text "); Serial.println("usw text text");
    Serial.print("Core: "); Serial.println(current_coreid());
    Serial.println("------- ");
    serialBlock.end();
  }

Das gewährleistet dann, dass sich beide Cores, bei der seriellen Ausgabe, nicht ins Gehege pfuschen.
Übertragbar auf SPI, I2C usw...

In Sachen Multitasking bringt z.B. FreeRTOS eigene Verriegelungs- Verfahren mit. Es nutzt beide Cores.