一个任务试图从一个空队列中读取时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中的数据变得可用,或者阻塞时间过期
一个任务试图写入到一个满队列时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中出现可用空间,或者阻塞时间过期
假如同一个队列上有多个处于阻塞状态的任务, 那么具有最高优先级的任务将最先解除阻塞。
中断只能使用以 “FromISR” 结尾的 API 函数。 总结:就是说队列空和满的情况下,是不会有读数据和写数据的情况的,任务可以直接走,或等有时间在走,一直等。也有多个任务同时去拿同一个队列的消息,如果没有顺序,那么也会导致数据乱。这种情况在全局变量下就比较常见,还有就是中断下拿数据,要关闭总中断,防止干扰。
1.实战案例
3.实际代码
staticuint32_t value =0;
voidproducer_thread(voidconst* argument){/* USER CODE BEGIN producer_thread */(void) argument;/* Infinite loop */for(;;){osDelay(300);if(osMessagePut(osQueueHandle, value,100)== osOK){
value++;}}/* USER CODE END producer_thread */}
voidconsumer_thread(voidconst* argument){/* USER CODE BEGIN consumer_thread */(void) argument;
osEvent event;/* Infinite loop */for(;;){
event =osMessageGet(osQueueHandle,100);if(event.status == osEventMessage){//if (event.value.v == value)//{printf("value is %d\r\n",value);HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);//}}}/* USER CODE END consumer_thread */}