Всем доброго времени суток.
Есть такая проблема - если в кратце - то при пеердаче структуры в очереди теряются элементы.
Если по-конкретнне то есть вот такая структура:
Код
typedef struct {
unsigned short int LSensor_Num;
unsigned short int WLevelValueAv;
unsigned short int TimeStartMeasure;
unsigned short int DurationMeasureSec;
} WLevelData;
Очередь инициализирована так:
Код
osMessageQDef(Level2Storage_Queue, 4, WLevelData);
Level2Storage_QueueHandle = osMessageCreate(osMessageQ(Level2Storage_Queue), NULL);
Задачи инициализированы так:
Код
osThreadDef(TX_Task, Start_TX_Task, osPriorityNormal, 0, 128);
RD_TaskHandle = osThreadCreate(osThread(TX_Task), NULL);
osThreadDef(RX_Task, Start_RX_Task, osPriorityBelowNormal, 0, 128);
Storage_TaskHandle = osThreadCreate(osThread(RX_Task), NULL);
Есть задача где раз в 6 секунд происходит запись в очередь
Код
void Start_TX_Task(void const * argument)
{
portTickType xLastWakeTime;
portBASE_TYPE xStatus;
WLevelData WLevel = {1,111,0,60};
xLastWakeTime = xTaskGetTickCount();
/* Infinite loop */
for(;;)
{
xStatus = xQueueSendToBack(Level2Storage_QueueHandle,&WLevel,0);
if(xStatus != pdPASS ) {} // Could not send to the queue
vTaskDelayUntil(&xLastWakeTime,6000);
}
}
Есть задача где периодически очередь считывается.
Код
void Start_RX_Task(void const * argument)
{
portBASE_TYPE xStatus;
portTickType xLastWakeTime;
WLevelData WLevel_rx;
xLastWakeTime = xTaskGetTickCount();
for(;;) {
if(uxQueueMessagesWaiting(Level2Storage_QueueHandle)) {
xStatus=xQueueReceive(Level2Storage_QueueHandle,&WLevel_rx,0);
}
vTaskDelayUntil(&xLastWakeTime,130);
}
}
И в итоге прием происходит, но последние 2 значения (
TimeStartMeasure и
DurationMeasureSec) в структуре
WLevel_rx всегда "0".
Увеличивал кучу на 10кБ. Также увеличивал глубину стека в задачах. Приоритеты менял. Не помогло.
МК: STM32F407VG, клок: 168МГц.
Почему так?