目的:
今日在学习编写rtos的队列的相关代码,想通过队列和事件组将dht11与oled连接起来,创建了queue_data和两个任务task_dht11和task_oled,以及一个eventGroup。
问题:
当dht11任务读取数据后,串口显示正常的数据,接着写数据进data队列,并使用事件组通知oled读取队列
数据类如:
40,26
40,26
40,26
当oled任务等待事件组成功后,读取队列的数据,然后串口显示读取的数据,发现是很大的负数类如: -1515870811,-1515913176
且不再读取队列的数据,
怀疑:
队列初始化问题
解决:
修改队列的大小,以及长度。
(1)在freertos.c的/* USER CODE BEGIN PD */中
#define MAX_QUEUE_SIZE 5
#define SENSOR_DATA_SIZE sizeof(SensorData)
(2)修改相关的队列参数
osMessageQueueId_t Q_DataHandle;
uint8_t Q_DataBuffer[ MAX_QUEUE_SIZE * SENSOR_DATA_SIZE ];
osStaticMessageQDef_t Q_DataBlock;
const osMessageQueueAttr_t Q_Data_attributes = {
.name = "Q_Data",
.cb_mem = &Q_DataBlock,
.cb_size = sizeof(Q_DataBlock),
.mq_mem = &Q_DataBuffer,
.mq_size = sizeof(Q_DataBuffer)
};
(3)修改创建队列
Q_DataHandle = osMessageQueueNew (MAX_QUEUE_SIZE, SENSOR_DATA_SIZE, &Q_Data_attributes);
结果:
数据成功发送以及接收