Skocz do zawartości

FreeRTOS na esp32, wysyłanie struktur


PaaaV1999

Pomocna odpowiedź

Hej, próbuje wysłać przez kolejkę na FreeRTOS strukturę wraz z rozróżnieniem dwóch tasków wysyłających i jednym odbierającym. Tak wygląda mój kod:

#include "queue.h"

typedef int taskProfiler;

typedef enum
{
  eSender1 = 0,
  eSender2,
}DataSource_t;

typedef struct
{
  uint8_t ucValue;
  DataSource_t eDataSource;
}Data_t;

static Data_t xStructToSend[2] = 
{
  (100, eSender1),
  (50, eSender2)
};

QueueHandle_t xQueue;

taskProfiler senderTaskProfiler = 0;
taskProfiler receiverTaskProfiler = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(5000);
  Serial.println(xStructToSend[1].ucValue);
  
  xQueue = xQueueCreate(3, sizeof(Data_t));

  xTaskCreate(vSenderTask, "Sender Task 1", 8192, &(xStructToSend[0]), 2, NULL);
  xTaskCreate(vSenderTask, "Sender Task 2", 8192, &(xStructToSend[1]), 2, NULL);

  xTaskCreate(vReceiverTask, "Receiver Task", 8192, NULL, 2, NULL);
}

void vSenderTask(void *pvParameters)
{
  BaseType_t xStatus;
  const TickType_t xTicksToWait = pdMS_TO_TICKS(100);
  Data_t xReceivedStructure;
  memcpy(&xReceivedStructure, &pvParameters, sizeof(pvParameters));
  while(1)
  {
    xStatus = xQueueSend(xQueue, pvParameters, xTicksToWait);

    if(xStatus != pdPASS)
    {
      Serial.println("Could not send to the Queue");
    }
    Serial.println(xReceivedStructure.ucValue);
  }
}

void vReceiverTask(void *pvParameters)
{
  Data_t xReceivedStructure;
  BaseType_t xStatus;
  while(1)
  {
    xStatus = xQueueReceive(xQueue, &xReceivedStructure, 0);

    if(xStatus == pdPASS)
    {
      if(xReceivedStructure.eDataSource == eSender1)
      {
        Serial.print("This is from Sender1: ");
        Serial.println(xReceivedStructure.ucValue);
      }
      else
      {
        Serial.print("This is from Sender2: ");
        Serial.println(xReceivedStructure.ucValue);
      }
    }
    else
    {
      Serial.println("Could not receive data from the queue");
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

W "setup()" linia "Serial.println(xStructToSend[1].ucValue);" zwraca mi wartość 0 chociaż teoretycznie powinna 50. Tak samo dzieje się w tasku wysyłającym w linii "Serial.println(xReceivedStructure.ucValue);". Wyglada jakby od samego początku była zła inicjalizacja wartości zmiennych w wysyłanej strukturze. Sam task Receiver zwraca wartość 152 lub 160. Jaki błąd został popełniony w tym kodzie i w jaki sposób prawidłowo mogę zainicjalizować zmienne w strukturze? Z góry dziękuje za pomoc.

Pozdrawiam

terminal.png

Link do komentarza
Share on other sites

memcpy(&xReceivedStructure, &pvParameters, sizeof(pvParameters));

To co tutaj napisałeś kopiuje w miejsce pamięci zmiennej xReceivedStructure zawartość zmiennej pvParameters, która sama służy do przechowywania adresu, więc przede wszystkim musiałbyś użyć pvParameters zamiast &pvParameters i sizeof xReceivedStructure, by faktycznie przekopiować ilość bajtów jaką ma struktura, a nie ilość bajtów, jaką ma zmienna do przechowywania adresu.

Natomiast to i tak nie ma sensu, bo przekazujesz sobie do vReceiverTask wskaźnik do struktury i takiego można używać wprost, tak jak napisałem wyżej.

Edytowano przez trainee
  • Lubię! 1
Link do komentarza
Share on other sites

Oprócz wspomnianych przez ciebie modyfikacji w inny sposób zainicjalizowałem strukturę. Teraz wygląda to następująco:

#include "queue.h"

typedef int taskProfiler;

typedef enum
{
  eSender1 = 0,
  eSender2,
}DataSource_t;

typedef struct
{
  uint8_t ucValue;
  DataSource_t eDataSource;
}Data_t;

static Data_t xStructToSend[2] = 
{
  {100, eSender1},
  {50, eSender2}
};

QueueHandle_t xQueue;

taskProfiler senderTaskProfiler = 0;
taskProfiler receiverTaskProfiler = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(5000);
  Serial.println(xStructToSend[1].ucValue);
  
  xQueue = xQueueCreate(3, sizeof(Data_t));

  xTaskCreate(vSenderTask, "Sender Task 1", 8192, &(xStructToSend[0]), 2, NULL);
  xTaskCreate(vSenderTask, "Sender Task 2", 8192, &(xStructToSend[1]), 2, NULL);

  xTaskCreate(vReceiverTask, "Receiver Task", 8192, NULL, 2, NULL);
}

void vSenderTask(void *pvParameters)
{
  BaseType_t xStatus;
  const TickType_t xTicksToWait = pdMS_TO_TICKS(100);
  Data_t xReceivedStructure;
  memcpy(&xReceivedStructure, pvParameters, sizeof(xReceivedStructure));
  while(1)
  {
    xStatus = xQueueSend(xQueue, pvParameters, xTicksToWait);

    if(xStatus != pdPASS)
    {
      Serial.println("Could not send to the Queue");
    }
    Serial.println(xReceivedStructure.ucValue);
  }
}

void vReceiverTask(void *pvParameters)
{
  Data_t xReceivedStructure;
  BaseType_t xStatus;
  while(1)
  {
    xStatus = xQueueReceive(xQueue, &xReceivedStructure, 0);

    if(xStatus == pdPASS)
    {
      if(xReceivedStructure.eDataSource == eSender1)
      {
        Serial.print("This is from Sender1: ");
        Serial.println(xReceivedStructure.ucValue);
      }
      else
      {
        Serial.print("This is from Sender2: ");
        Serial.println(xReceivedStructure.ucValue);
      }
    }
    else
    {
      Serial.println("Could not receive data from the queue");
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.