STM32CubeMX自带freeRTOS,其中的消息队列,把自带的任意类型数据,改成了只有32位的数据类型,效果变得非常局限了。
我们实际应用中,往往是用结构体类型的,它这个32位数据类型根本不够用。
为了解决此问题,我们可以修改cmsis_os.c文件。
压入消息队列的函数,我们增加一个形参const void * const info,然后在函数里面修改一下。
osStatus osMessagePut (osMessageQId queue_id, const void * const info, uint32_t millisec)
{
portBASE_TYPE taskWoken = pdFALSE;
TickType_t ticks;
ticks = millisec / portTICK_PERIOD_MS;
if (ticks == 0) {
ticks = 1;
}
if (inHandlerMode()) {
if (xQueueSendFromISR(queue_id, info, &taskWoken) != pdTRUE) {
return osErrorOS;
}
portEND_SWITCHING_ISR(taskWoken);
}
else {
if (xQueueSend(queue_id, info, ticks) != pdTRUE) {
return osErrorOS;
}
}
return osOK;
}
读出消息队列的函数也要修改一下
osEvent osMessageGet (osMessageQId queue_id, void * const pvBuffer, uint32_t millisec)
{
portBASE_TYPE taskWoken;
TickType_t ticks;
osEvent event;
event.def.message_id = queue_id;
event.value.v = 0;
if (queue_id == NULL) {
event.status = osErrorParameter;
return event;
}
taskWoken = pdFALSE;
ticks = 0;
if (millisec == osWaitForever) {
ticks = portMAX_DELAY;
}
else if (millisec != 0) {
ticks = millisec / portTICK_PERIOD_MS;
if (ticks == 0) {
ticks = 1;
}
}
if (inHandlerMode()) {
if (xQueueReceiveFromISR(queue_id, pvBuffer, &taskWoken) == pdTRUE) {
/* We have mail */
event.status = osEventMessage;
}
else {
event.status = osOK;
}
portEND_SWITCHING_ISR(taskWoken);
}
else {
if (xQueueReceive(queue_id, pvBuffer, ticks) == pdTRUE) {
/* We have mail */
event.status = osEventMessage;
}
else {
event.status = (ticks == 0) ? osOK : osEventTimeout;
}
}
return event;
}
改完这些以后,在修改一下cmsisi_os.h的函数声明。
这样,我们就可以像之前用freeRTOS那样任性了。