网站空间1g多少钱,东莞公司高端网站建设,广州网站设计公司济南兴田德润o评价,深圳定制钻戒哪里好推荐目录
什么是队列#xff1f;
队列特点
1. 数据入队出队方式
2. 数据传递方式
3. 多任务访问
4. 出队、入队阻塞
队列相关 API 函数
1. 创建队列
参数#xff1a;
2. 写队列
参数#xff1a;
返回值#xff1a;
3. 读队列
参数#xff1a;
返回值#xf…目录
什么是队列
队列特点
1. 数据入队出队方式
2. 数据传递方式
3. 多任务访问
4. 出队、入队阻塞
队列相关 API 函数
1. 创建队列
参数
2. 写队列
参数
返回值
3. 读队列
参数
返回值
实操
实验需求
cubeMX配置
代码实现 什么是队列 队列又称消息队列是一种常用于任务间通信的数据结构队列可以在任务与任务间、中断和任 务间传递信息。 为什么不使用全局变量 如果使用全局变量兔子任务 1 修改了变量 a 等待树獭任务 3 处理但树獭处理速度很 慢在处理数据的过程中狐狸任务 2 有可能又修改了变量 a 导致树獭有可能得到的不是 正确的数据。 在这种情况下就可以使用队列。兔子和狐狸产生的数据放在流水线上树獭可以慢慢一个个依 次处理。 关于队列的几个名词 队列项目 队列中的每一个数据 队列长度 队列能够存储队列项目的最大数量 创建队列时需要指定队列长度及队列项目大小 队列特点 1. 数据入队出队方式 通常采用 先进先出 FIFO 的数据存储缓冲机制即先入队的数据会先从队列中被读取。 也可以配置为后进先出 LIFO 方式但用得比较少。 2. 数据传递方式 采用实际值传递即将数据拷贝到队列中进行传递也可以传递指针在传递较大的数据的时候 采用指针传递。 3. 多任务访问 队列不属于某个任务任何任务和中断都可以向队列发送 / 读取消息 4. 出队、入队阻塞 当任务向一个队列发送消息时可以指定一个阻塞时间假设此时当队列已满无法入队。 阻塞时间如果设置为 0直接返回不会等待 0~port_MAX_DELAY等待设定的阻塞时间若在该时间内还无法入队超时后直接返回不 再等待 port_MAX_DELAY死等一直等到可以入队为止。出队阻塞与入队阻塞类似 队列相关 API 函数 1. 创建队列 QueueHandle_t xQueueCreate ( UBaseType_t uxQueueLength , UBaseType_t uxItemSize ); 参数 uxQueueLength 队列可同时容纳的最大项目数 。 uxItemSize 存储队列中的每个数据项所需的大小以字节为单位。 返回值 如果队列创建成功则返回所创建队列的句柄 。 如果创建队列所需的内存无法分配 则返回 NULL 。 2. 写队列 写队列总共有以下几个函数 函数 描述 xQueueSend() 往队列的尾部写入消息 xQueueSendToBack() 同 xQueueSend() xQueueSendToFront() 往队列的头部写入消息 xQueueOverwrite() 覆写队列消息只用于队列长度为 1 的情况 xQueueSendFromISR() 在中断中往队列的尾部写入消息 xQueueSendToBackFromISR() 同 xQueueSendFromISR() xQueueSendToFrontFromISR() 在中断中往队列的头部写入消息 xQueueOverwriteFromISR() 在中断中覆写队列消息只用于队列长度为 1 的情况 BaseType_t xQueueSend ( QueueHandle_t xQueue , const void * pvItemToQueue , TickType_t xTicksToWait ); 参数
xQueue队列的句柄数据项将发送到此队列。 pvItemToQueue待写入数据 xTicksToWait阻塞超时时间
返回值 如果成功写入数据返回 pdTRUE 否则返回 errQUEUE_FULL 。 3. 读队列 读队列总共有以下几个函数 函数 描述 xQueueReceive() 从队列头部读取消息并删除消息 xQueuePeek() 从队列头部读取消息但是不删除消息 xQueueReceiveFromISR() 在中断中从队列头部读取消息并删除消息 xQueuePeekFromISR() 在中断中从队列头部读取消息 BaseType_t xQueueReceive ( QueueHandle_t xQueue , void * pvBuffer , TickType_t xTicksToWait ); 参数
xQueue待读取的队列 pvItemToQueue数据读取缓冲区 xTicksToWait阻塞超时时间
返回值 成功返回 pdTRUE 否则返回 pdFALSE 。 实操 实验需求 创建一个队列按下 KEY1 向队列发送数据按下 KEY2 向队列读取数据 cubeMX配置 代码实现 freertos.c void StartTaskSend(void const * argument)
{/* USER CODE BEGIN StartTaskSend */uint16_t buf 100;BaseType_t status;/* Infinite loop */for(;;){if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) GPIO_PIN_RESET){ status xQueueSend(myQueueHandle, buf, 0);if (status pdTRUE)printf(写入队列成功写入值为%d\r\n, buf);elseprintf(写入队列失败\r\n);}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) GPIO_PIN_RESET);
}
osDelay(10);}/* USER CODE END StartTaskSend */
}/* USER CODE BEGIN Header_StartTaskReceive */
/**
* brief Function implementing the taskReceive thread.
* param argument: Not used
* retval None
*/
/* USER CODE END Header_StartTaskReceive */
void StartTaskReceive(void const * argument)
{/* USER CODE BEGIN StartTaskReceive */uint16_t buf;BaseType_t status;/* Infinite loop */for(;;){if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) GPIO_PIN_RESET){status xQueueReceive(myQueueHandle, buf, 0);if (status pdTRUE)printf(队列数据读取成功读出值为%d\r\n, buf);elseprintf(队列读取失败\r\n);}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) GPIO_PIN_RESET);}osDelay(10);}/* USER CODE END StartTaskReceive */
}/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application *//* USER CODE END Application */