Probleme mit dem Arduino Due und RTOS

Guten Tag zusammen
und zwar habe ich im Moment einen Arduino due im Einsatz wo ich versuche ein RTOS drauf zu installieren, welches auch so weit funktioniert (bei den Beispiel Skatches). Ich habe leider das Problem, dass er bei meinem Skatch hängen bleibt beim "beginn" eines Oled oder Ethernet.
Jetzt hier in meinen runter gekürzten Skatch ist es das Ethernet. Das Shield für das Ethernet ist eins mit einem SD karten slot und dem chip W5500.(ARD SHD W5500 mit mega2560)
Hauptteil

#include "system.h"

volatile uint32_t  count = 0;

SemaphoreHandle_t shSPI;


void setup() {
  Serial.begin(SYSTEM_MAIN_SERIAL_BAUD);

  Serial.print (F("FlexOS "));
  Serial.print (F(VERSION));
  Serial.println (F(" is booting."));


  // create semaphore for SPI interface

  vWATCHDOGInit();
  vEthernetInit();
  vWatchdogStart ();
  Serial.println("TaskScheduler is starting now....");
  vTaskStartScheduler();
  Serial.println(F("System died...;("));
  while (1);
}

void loop() {}

Ethernet Teil

#define REQ_BUF_SZ      60
#define ChoseArduinoET  '1' //Der Arduino wird nur angesteuert
#define ServerAdress    80
#define fileWebsite     "index.htm"

EthernetServer server(ServerAdress);  // create a server at port 80
File webFile;               // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer


/******************************************************************************/
static void vEthernetTask(void *pvParameters) {

  while (1) {
    vTaskDelay((SYSTEM_TASK_TIME_ETHERNET * configTICK_RATE_HZ) / 1000L);
    vEthernetStandard();
  }
}
/******************************************************************************/


void vEthernetStandard() {
  EthernetClient client = server.available();  // try to get client

  if (client) {  // got client?
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (req_index < (REQ_BUF_SZ - 1)) {
          HTTP_req[req_index] = c;          // save HTTP request character
          req_index++;
        }

        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          if (StrContains(HTTP_req, "ajax_inputs")) {
            client.println("Content-Type: text/xml");
            client.println("Connection: keep-alive");
            client.println();
            vSetGRBLBefehle();
          }
          else {  // web page request
            client.println("Content-Type: text/html");
            client.println("Connection: keep-alive");
            client.println();
            // send web page
            webFile = SD.open(fileWebsite);
            if (webFile) {
              while (webFile.available()) {
                client.write(webFile.read());
              }
              webFile.close();
            }
          }
#if defined DebugEthernetCommand
          Serial.print(HTTP_req);
#endif
          req_index = 0;
          StrClear(HTTP_req, REQ_BUF_SZ);
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // a text character was received from client
          currentLineIsBlank = false;
        }
      } // end if (client.available())
    } // end while (client.connected())
    delay(1);      // give the web browser time to receive the data
    client.stop(); // close the connection
  } // end if (client)
}

// checks if received HTTP request is switching on/off LEDs
// also saves the state of the LEDs
void vSetGRBLBefehle(void) {


}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length) {
  for (int i = 0; i < length; i++) {
    str[i] = 0;
  }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind) {
  char found = 0;
  char index = 0;
  char len;

  len = strlen(str);

  if (strlen(sfind) > len) {
    return 0;
  }
  while (index < len) {
    if (str[index] == sfind[found]) {
      found++;
      if (strlen(sfind) == found) {
        return 1;
      }
    }
    else {
      found = 0;
    }
    index++;
  }

  return 0;
}

void vEthernetInit () {

  xTaskCreate(vEthernetTask,
              "TaskE",
              configMINIMAL_STACK_SIZE + 512,
              NULL,
              tskIDLE_PRIORITY + SYSTEM_TASK_PRIORITY_ETHERNET,
              &ethernet);




  // disable Ethernet chip
  // pinMode(10, OUTPUT);
  //digitalWrite(10, HIGH);



  // initialize SD card
  Serial.println("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("ERROR - SD card initialization failed!");
  }
  else {
  Serial.println("SUCCESS - SD card initialized.");
  }
  // check for fileWebsite file
  if (!SD.exists(fileWebsite)) {
    Serial.println("ERROR - Can't find fileWebsite file!");
  }
  else{
  Serial.println("SUCCESS - Found fileWebsite file.");
  }
  Serial.println("bin vor Ethernet Beginnnn");
  Ethernet.begin(aucMac, ip);  // initialize Ethernet device
  Serial.println("Ethernet hat begonnen");
  server.begin();           // start to listen for clients
  Serial.println("Server ist gestartet");
}

Konfig (System.h)

#include <FreeRTOS_ARM.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

byte aucMac[] = {0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06};
IPAddress ip (192, 168, 137, 2);

#define VERSION                           "Version0.1"
#define SYSTEM_PIN_DEBUG_LED                   13

#define SYSTEM_MAIN_SERIAL_BAUD                19200
#define watchdogTime                           2000


#define SYSTEM_TASK_PRIORITY_WATCHDOG          0
#define SYSTEM_TASK_PRIORITY_ETHERNET          1


#define SYSTEM_TASK_TIME_WATCHDOG              400L
#define SYSTEM_TASK_TIME_ETHERNET              500L


#define SYSTEM_SIGN_WATCHDOG                   0x00000080
#define SYSTEM_SIGN_ETHERNET                   0x00000400

TaskHandle_t watchdog;
TaskHandle_t ethernet;

Watchdog

static void vWatchdogTask(void *pvParameters) {
  TickType_t xLastExecutionTime;
  bool bToggle = false;
  
  while (1) {
    vTaskDelayUntil(&xLastExecutionTime, SYSTEM_TASK_TIME_WATCHDOG/portTICK_PERIOD_MS);
    watchdogReset();

    bToggle = !bToggle;
    digitalWrite (SYSTEM_PIN_DEBUG_LED, bToggle);
  }
}


void vWATCHDOGInit() {
  xTaskCreate(vWatchdogTask,
              "TaskW",
              configMINIMAL_STACK_SIZE + 100,
              NULL,
              SYSTEM_TASK_PRIORITY_WATCHDOG,
              &watchdog);

  pinMode (SYSTEM_PIN_DEBUG_LED, OUTPUT);

 // ulSystemInitState |= SYSTEM_SIGN_WATCHDOG;
  Serial.println (F("--> watchdog created + PIN13 LED"));

}

void vWatchdogStart () {
 watchdogEnable(watchdogTime);
  Serial.println (F("Watchdog started..."));
}

der Skatch besteht hast vier Teilen. Habe auch schon ein wenig rumprobiert etc. Das der Ethernet Skatch nicht komplett ist, ist meine Absicht. Der wäre ein wenig zu lang und da er sowieso sich beim Initialisieren aufhängt ist dieser sowieso Irrelevant.

Dummer weise hast du den Code bis zur untestbarkeit verstümmelt.

Am Rande:
Bist du dir sicher, dass Serial.Print und Serial.println reentrant sind?
Ich bezweifle das!

ich weiß jetzt nicht was du meinst mit verstümmelt
jede Datei ist eben ein eigener Task
für die Übersicht

die Serial.print bzw.Serial.println "spam" kurz bevor er stecken bleibt war nur für mich um heraus zufinden wo er eben hängen bleibt .
Die haben keine weitere Bedeutung

Falls du den Watchdog meinst liegt es nicht daran habe schon weiter Tests ohne ihn gemacht.
Der letzte war ganz alleine mit dem RTOS und da war das gleiche Problem bzw. er ist schon noch früher hängen geblieben.

Ich hoffe ich habe dich halbwegs richtig verstanden :smiley:

Ich hoffe ich habe dich halbwegs richtig verstanden

Sieht nicht so aus....
Leider sieht es noch nicht mal so aus, als hätten wir ein gemeinsames Vokabular.

Die Probleme, welche man sich mit einem preemptiven Multitasking System einfangen kann sind massiv.
Und hier scheinen mir sogar noch Lücken bei den Grundlagen hinzuzukommen.

Eins der Grundlagen Probleme:
Die Ethernet Lib ist nicht für den W5500 geeignet.
die Lib wurde anepasst

Leitsatz:
ALLE genutzten Funktionen/Methoden MÜSSEN reentrant und Threadsafe sein.
Oder zumindest per Semaphor oder Mutex vor einem Wiedereintritt geschützt werden.

Missachtest du das, und das tust du, wird es gegen die Wand fahren.

Dazu:
Wiedereintrittsfähigkeit und Thread Sicherheit sind keine Designauflagen bei der Erstellung der Arduino Libraries.
Also kann man da ein generelles NEIN annehmen.

Dinge, welche mir sonst noch unstimmig erscheinen:

SemaphoreHandle_t shSPI;

Hier wird ein Semaphor erstellt, aber nirgendwo genutzt.

eines Oled

Sehe kein OLed

ARD SHD W5500 mit mega2560

Was denn jetzt, DUE oder Mega?

Ja ich glaube das du mich ein wenig missverstanden hast
Ich stimme dir vollkommen zu wenn du sagst das ich scheiße bin im Erklären, dass weiß ich ... :confused:

und zwar das programm habe ich soweit für den mega zuerst geschrieben gehabt, da ich aber einen schnelleren brauche bin ich auf den due gewächselt. Das die library nicht für den W5500 ist weiß ich.
Habe die andere Library auch schon ausprobiert funktioniert auch nicht.(hatte auch erst ein anderes Shield (mit dem Chip W5100))
Übrigens funktioniert die Library Ethernet.h auch mit dem W5500, das habe ich getestet(ist nicht für vorgesehen aber ich habe es mal getestet).
Solange es nicht im RTOS ist funktionieren beide.
Was ich jetzt hier rein gestellt habe ist auch nur ein Versuch von vielen gewesen, das Programm ans laufen zu bekommen.

Ebenso bin ich noch gar nicht in dem Bereich wo das System läuft (die einzelnen Tasks), sondern noch bei der Initialisierung. Dort hängt es sich leider immer auf.

und zum letzten Kommentar müsste ich noch sagen da habe ich vergessen "erfolgereich getestet" (auch schon mit Due erfolgreich getestet)

Übrigens funktioniert die Library Ethernet.h auch mit dem W5500

Ok...
Das hat sich dann geändert.
Habe ich nicht mitbekommen.

steht auch nicht dran ich habe es halt getestet und es hat zufällig geklappt kann auch sein das nicht alle Funktionen available sind aber zumindest konnte ich ne TCP/IP verbindung aufbauen und eine Website hosten....
habe jetzt eine Möglichkeit gefunden wie es funktioniert ist zwar nicht schön funktioniert aber vorübergehen....

danke trotzdem für deine Hilfe

Hi

Meinst Du nicht, daß nachfolgende Suchende von Deiner Not-Lösung nicht auch profitieren könnten?

Zumindest als Notlösung, bis was Besseres erstellt wurde?

MfG

Für RTOS braucht man IMO threadsichere Treiber und Funktionen, die aus den Arduino Bibliotheken sind dafür kaum geeignet.