Портятся данные в очереди. FreeRTOS

Всем привет! Вопрос такой, создал очередь в CubeMX, сделал ей размер своей структуры sizeof( params ).

#define ITEM_SIZE_QUEUE_1       sizeof( params )

Вот сама структура и список.

typedef enum  {
    L1 = 1,
    L2 = 2,
    L3 = 3
} phaseId;

typedef struct {
    float avg;
    float maxImp;
    float minImp;
    float rms;
    float eff;
    phaseId id;
} params;

Очередь:

  /* definition and creation of xQueueDMtoSD */
  osMessageQStaticDef(xQueueDMtoSD, 640, ITEM_SIZE_QUEUE_1, xQueueDMtoSDBuffer, &xQueueDMtoSDControlBlock);
  xQueueDMtoSDHandle = osMessageCreate(osMessageQ(xQueueDMtoSD), NULL);
osMessageQId xQueueDMtoSDHandle;
uint8_t xQueueDMtoSDBuffer[ 640 * sizeof( ITEM_SIZE_QUEUE_1 ) ];

Из задачи отсылаю данные в очередь, соответственно отсылаю структуру.

void vFunDataManager(void const * argument)
{
  /* USER CODE BEGIN vFunDataManager */
    params queue1;
    params queue2;
    params queue3;
  /* Infinite loop */
    for (;;) {
        if (xQueueReceive(xQueueADCHandle, &copy1, portMAX_DELAY) == pdTRUE) {
            //
                /**
                 * Отправка очереди в задачу vSD
                 */

                if (uxQueueSpacesAvailable(xQueueDMtoSDHandle) > 0) {
                    if (xQueueSend(xQueueDMtoSDHandle, &queue2, portMAX_DELAY) != pdTRUE) {
                        dbF++;
                        osDelay(100);
                    }
                } else {
                    osDelay(100);
                }
            }
        } else {
            dbF++;
        }
        osDelay(10);
    }
  /* USER CODE END vFunDataManager */
}

И в другой задаче принимаю данные из очереди.

void vSD(void const * argument)
{
  /* USER CODE BEGIN vSD */
  params queue1;
  /* Infinite loop */
  for(;;)
  {
    if (xQueueReceive(xQueueDMtoSDHandle, &queue1, portMAX_DELAY) == pdPASS) {
        if (osMutexWait(xMutexSPIHandle, osWaitForever) == osOK) {
            writeArchive(&queue1);
        }
        osMutexRelease(xMutexSPIHandle);
    }
    osDelay(10);
  }
  /* USER CODE END vSD */
}

И уже в задаче vSD портятся данные в очереди. В очереди почему то другие данные. Не те, которые отправлялись.
Отправляемые данные
Отправляемые данные
Данные, которые пришли
введите сюда описание изображения
Настройка прерываний
введите сюда описание изображения
Таймер для SYS
введите сюда описание изображения


Ответы (1 шт):

Автор решения: Maxim Timakov

Как выяснилось, проблема в коде создания очереди.

Проблемные участки:

uint8_t xQueueDMtoSDBuffer[ 640 * sizeof( ITEM_SIZE_QUEUE_1 ) ];
  osMessageQStaticDef(xQueueDMtoSD, 640, ITEM_SIZE_QUEUE_1, xQueueDMtoSDBuffer, &xQueueDMtoSDControlBlock);

в обоих случаях - использование размера типа вместо имени типа:

#define ITEM_SIZE_QUEUE_1       sizeof( params )

osMessageQStaticDef принимает 3-м параметром именно тип.

Таким образом получалось, что под элементы выделено меньше памяти, чем было необходимо.

Исправления:

uint8_t xQueueDMtoSDBuffer[ 640 * sizeof( params ) ];
  osMessageQStaticDef(xQueueDMtoSD, 640, params, xQueueDMtoSDBuffer, &xQueueDMtoSDControlBlock);
→ Ссылка