FreeRTOS队列操作
API函数
//创建
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
#define xQueueCreate( uxQueueLength, uxItemSize )
xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )
#endif
QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength,
const UBaseType_t uxItemSize, const uint8_t ucQueueType )
#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait )
xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )
BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue,
TickType_t xTicksToWait, const BaseType_t xCopyPosition )
#define xQueueReceive( xQueue, pvBuffer, xTicksToWait )
xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE )
BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer,
TickType_t xTicksToWait, const BaseType_t xJustPeeking )
//队列剩余大小
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue )
//队列使用大小
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue )
使用举例
QueueHandle_t Key_Queue //按键值消息队列句柄
void start_task(void *pvParameters)
{
Key_Queue = xQueueCreate(1, sizeof(u8));
if(Key_Queue == 0)
{
printf("xQueueCreate err\r\n");
}
}
void key_task(void *pvParameters)
{
BaseType_t ret;
while(1)
{
key = KEY_Scan(0); //扫描按键
if((Key_Queue != 0) && (key)) //消息队列Key_Queue创建成功,并且按键被按下
{
ret = xQueueSend(Key_Queue, &key, 10);
if(ret != pdPASS) //发送按键值
{
printf("xQueueSend err\r\n");
}
}
vTaskDelay(10);
}
}
void recv_task(void *pvParameters)
{
while(1)
{
if(Key_Queue != 0)
{
if(xQueueReceive(Key_Queue, &key, portMAX_DELAY))
{
printf("recv_task key %d\r\n", key);
}
}
}
}
实验现象
点击按键
中断相关API函数
#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken )
xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ),
( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue,
BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition )
BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer,
BaseType_t * const pxHigherPriorityTaskWoken )
使用举例
void start_task(void *pvParameters)
{
Message_Queue = xQueueCreate(1, sizeof(u8));
if(Message_Queue == 0)
{
printf("xQueueCreate err\r\n");
}
}
void USART1_IRQHandler(void)
{
u8 Res;
BaseType_t xHigherPriorityTaskWoken;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res = USART_ReceiveData(USART1);
xQueueSendFromISR(Message_Queue, &Res, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //如果需要的话进行一次任务切换
}
}
void TIM2_IRQHandler(void)
{
u8 Res;
BaseType_t ret;
BaseType_t xTaskWokenByReceive = pdFALSE;
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
ret = xQueueReceiveFromISR(Message_Queue, &Res, &xTaskWokenByReceive);
if(ret == pdTRUE)
{
printf("xQueueReceiveFromISR Res %c\r\n", Res);
}
portYIELD_FROM_ISR(xTaskWokenByReceive); //如果需要的话进行一次任务切换
}
}
实验现象
FreeRTOS队列操作的更多相关文章
- jQuery源码分析系列(38) : 队列操作
Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Qu ...
- LabVIEW之生产者/消费者模式--队列操作 彭会锋
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- linux消息队列操作
对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...
- JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...
- php redis队列操作
php redis队列操作 rpush/rpushx 有序列表操作,从队列后插入元素:lpush/lpushx 和 rpush/rpushx 的区别是插入到队列的头部,同上,'x'含义是只对已存在的 ...
- redis队列操作
PHP版: <?php /** * Redis * 配置 $redis_host,$redis_port * 队列操作 * @author win 7 */ class RQueue{ priv ...
- jquery源码解析:jQuery队列操作queue方法实现的原理
我们先来看一下jQuery中有关队列操作的方法集: 从上图可以看出,既有静态方法,又有实例方法.queue方法,相当于数组中的push操作.dequeue相当于数组的shift操作.举个例子: fun ...
- LabVIEW之生产者/消费者模式--队列操作
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- javascript总结24:Array常用的队列操作和排序方法
1 数组-引用类型 JavaScript中的内置对象 复习数组的使用 两种创建数组的方式 Array对象的属性 length 获取数组的长度(元素个数) 2 常用方法 : 检测数组 instanceo ...
随机推荐
- SQLServer replace函数
declare @name char(1000) --注意:char(10)为10位,要是位数小了会让数据出错 set @name='ssssfcfgghdghdfcccs' select repla ...
- java8 中 ImageIO 读取 tiff 格式的图片失败
在java8 及之前版本中,jdk 中的 ImageIO 读取图片内容会失败,解决办法使用 java9 或者使用第三方插件. 插件可以使用 TwelveMonkeys ImageIO,地址:https ...
- 廖雪峰Git教程3
转自:https://www.liaoxuefeng.com/wiki/896043488029600 [标签管理] 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签 ...
- odoo开发笔记 -- 模型后台方法返回前端form视图和tree视图的写法
待补充: 参考:工作单跳转到通关清单 --form(一对一) 工作单跳转到报关单列表 --tree (一对多)
- [译]使用BeautifulSoup和Python从网页中提取文本
如果您要花时间浏览网页,您可能遇到的一项任务就是从HTML中删除可见的文本内容. 如果您使用的是Python,我们可以使用BeautifulSoup来完成此任务. 设置提取 首先,我们需要获取一些HT ...
- Laya自定义组件
laya2.1.1.1 参考: 预设使用 一 没有自定义组件 教程翻了几遍,没有自定义组件,论坛搜了下,说是不能使用. 二 预置件做自定义组件 预置件无法右键创建. 又去翻教程.终于知道预置件怎么创建 ...
- 【翻译】Flink Table Api & SQL —— 数据类型
本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/types.html Flink Table ...
- 【VS开发】MFC学习之 解决StretchBlt()图片缩放绘图失真
vc中位图伸缩函数StretchBlt在对图片进行缩放时会造成严重的图片失真.在了解解决方法前先巩固下StretchBlt的用法: StretchBlt 函数功能:函数从源矩形中复制一个位图到目标矩形 ...
- layui 监听switch事件
<input type="checkbox" lay-filter="common_change_status" name="switch&qu ...
- Java开发笔记(一百二十二)AWT选择框
前面介绍了两种文本输入框的用法,不过实际应用很少需要用户亲自文字,而是在界面上列出几个选项,让用户勾勾点点完成选择,这样既方便也不容易弄错.依据选择的唯一性,可将选项控件分为两类:一类是在方框中打勾的 ...