Портятся данные в очереди. 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, ©1, 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 шт):
Как выяснилось, проблема в коде создания очереди.
Проблемные участки:
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);