Go Down

Topic: [Bericht] RISC-V Inbetriebnahme (Read 1 time) previous topic - next topic

combie

Quote
... ist aber etwas wie: Mit dem Ferrari durch die Spielstraße zum Brötchen holen.
Mag sein....
Aber immerhin hat dieser Risc-V eine DMA, und sollte so in der Lage sein diese 4 LED Strips gleichzeitig zu bedienen, ohne die beiden Cores zu beanspruchen und ohne dass Interrupts blockiert werden müssen.
Die beiden Cores, oder einer davon, kann sich in der Zeit mit dem Berechen des nächsten "Frame" beschäftigen.
Die Framerate sollte sich so vervielfachen lassen, gegenüber einem AVR Arduino

Quote
wenn dann core0 den Buttler für core1 spielen muß,
2 Cores bedeutet eben nicht, doppelte Arbeitsgeschwindigkeit.
Eben wegen diesem Verwaltungsaufwand.
Durch geschickte Aufgabenverteilung lässt sich das minimieren, aber nicht aus der Welt schaffen.
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

combie

#16
Dec 18, 2019, 02:09 pm Last Edit: Dec 18, 2019, 02:14 pm by combie
Mittlerweile habe ich das Problem mit dem gegenseitigen Ausschluss der Cores etwas gemindert.
Nicht aus der Welt geschafft. Denn das wird nicht gehen.

Die class MutualBlock hat eine Umtaufung und Abänderung erfahren, so dass (hoffentlich) klarer wird, was sie tut.
Jetzt kann die Anwendung versuchen eine Ressource zu akquirieren und es bei einem Fehlschlag  später nochmal versuchen.
So wird dann immer noch die Ausführung eines Programmteils/Task in einer Konkurrenzsituation  unterbunden, aber dennoch können beide Cores ihre anderen Aufgaben weiter abarbeiten.

Code: [Select]
#pragma once
//#include <Arduino.h>

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

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

  public:
  bool tryLock()
  {
    int id = current_coreid();
    q[id] = 1;
    turn = !id;
    bool inUse = q[!id] == 1 && turn == !id;
    if(inUse) unLock(); // wieder frei geben, bei Fehlschlag der Reservierung
    return not inUse;
  }

  void lock()
  {
    while(not tryLock());
  }
 
  void unLock()
  {
     q[current_coreid()] = 0;
  }
};

 



Instantiierung:
Code: [Select]
DualCoreLock serialBlock;

Anwendung, die bisherige Methode:
Code: [Select]
 
{
    serialBlock.lock(); // blockiert diesen Core, bis der andere Core die Ressource frei gibt
    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.unLock(); // Blockade loesen
}



Anwendung, die "neue sanfte" Methode:
Code: [Select]

{
  if(serialBlock.tryLock())  // liefert true, wenn die Ressource erobert werden konnte
  {
    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.unLock(); // Blockade loesen
  }
}
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Go Up