STM32CubeMX自带freeRTOS的消息队列的BUG修改

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那样任性了。

你可能感兴趣的:(freeRTOS)