第三代半导体 软件测试工程师 swift plot textview Zeptojs jquery each jq去空格 matlab读取dat文件 android逆向工程师 html好看的字体样式 python开发安卓应用 axure导出html文件 java配置 java中的基本数据类型 java写文件 java自学编程入门教程 java学习课程 java数组 java流程 梦幻西游手游助手 房产证生成器 eclipse中文版下载 服务器系统安装 ram容量是什么意思 c4d文字 mysql时间比较 证书小精灵 文字转语音工具 foobar2000插件 qq黑客软件 cdlinux教程 jquery下载 超级网游助手 ipad上市时间 360越狱版 losecontrol 平均值符号怎么输入 打印机怎么打印照片 ps怎么磨皮祛痘
当前位置: 首页 > 学习教程  > 编程语言

STM32CUBEMX创建FREERTOS之队列

2020/11/4 15:22:59 文章标签:

目录1. 创建队列1.1 动态创建入队函数出队函数1. 创建队列 1.1 动态创建 QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize) 示例 QueueHandle_t Message_Queue; //句柄 #define Message_Q_NUM 4 //队列长度 #define USART_REC_LEN …

目录

  • 1. 创建队列
    • 1.1 动态创建
  • 入队函数
  • 出队函数

1. 创建队列

1.1 动态创建

QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize)
示例
QueueHandle_t Message_Queue;   //句柄
#define     Message_Q_NUM  4  //队列长度
#define USART_REC_LEN  			50  	//定义最大接收字节数 50
Message_Queue = xQueueCreate(Message_Q_NUM,USART_REC_LEN);

一般用户都用动态创建
参数:
uxQueueLength: 要创建的队列的队列长度,这里是队列的项目数。
uxItemSize: 队列中每个项目(消息)的长度,单位为字节
返回值:
其他值: 队列创捷成功以后返回的队列句柄!
NULL: 队列创建失败。

入队函数

在这里插入图片描述

BaseType_t xQueueSend( QueueHandle_t xQueue,
					   const void * pvItemToQueue,
					   TickType_t xTicksToWait);
BaseType_t xQueueSendToBack(QueueHandle_t xQueue,
                            const void* pvItemToQueue,
                            TickType_t xTicksToWait);
BaseType_t xQueueSendToToFront(QueueHandle_t xQueue,
                               const void *pvItemToQueue,
                               TickType_t xTicksToWait);

参数:
xQueue: 队列句柄,指明要向哪个队列发送数据,创建队列成功以后会返回此队列的
队列句柄。
pvItemToQueue:指向要发送的消息,发送时候会将这个消息拷贝到队列中。
xTicksToWait: 阻塞时间,此参数指示当队列满的时候任务进入阻塞态等待队列空闲的最大
时间。如果为 0 的话当队列满的时候就立即返回; 当为 portMAX_DELAY 的
话就会一直等待,直到队列有空闲的队列项,也就是死等,但是宏
INCLUDE_vTaskSuspend 必须为 1。
返回值:
pdPASS: 向队列发送消息成功!
errQUEUE_FULL: 队列已经满了,消息发送失败

BaseType_t xQueueOverwrite(QueueHandle_t xQueue,
							const void * pvItemToQueue);

参数:
xQueue: 队列句柄,指明要向哪个队列发送数据,创建队列成功以后会返回此队列的
队列句柄。
pvItemToQueue:指向要发送的消息,发送的时候会将这个消息拷贝到队列中。
返回值:
pdPASS: 向队列发送消息成功,此函数也只会返回 pdPASS! 因为此函数执行过程中不
在乎队列满不满,满了的话我就覆写掉旧的数据,总之肯定能成功

BaseType_t xQueueGenericSend( QueueHandle_t xQueue,
							const void * const pvItemToQueue,
							TickType_t xTicksToWait,
							const BaseType_t xCopyPosition )

此函数才是真正干活的,上面讲的所有的任务级入队函数最终都是调用的此函数,此函数
也是我们后面重点要讲解的,先来看一下函数原型:

参数:
xQueue: 队列句柄,指明要向哪个队列发送数据,创建队列成功以后会返回此队列的
队列句柄。
pvItemToQueue:指向要发送的消息,发送的过程中会将这个消息拷贝到队列中。
xTicksToWait: 阻塞时间。
xCopyPosition: 入队方式,有三种入队方式:
queueSEND_TO_BACK: 后向入队
queueSEND_TO_FRONT: 前向入队
queueOVERWRITE: 覆写入队。
上面讲解的入队 API 函数就是通过此参数来决定采用哪种入队方式的。
返回值:
pdTRUE: 向队列发送消息成功!
errQUEUE_FULL: 队列已经满了,消息发送失败。

BaseType_t xQueueSendFromISR(QueueHandle_t xQueue,
							 const void * pvItemToQueue,
                             BaseType_t * pxHigherPriorityTaskWoken);
BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,
                                   const void * pvItemToQueue,
                                   BaseType_t * pxHigherPriorityTaskWoken);
BaseType_t xQueueSendToFrontFromISR(QueueHandle_t xQueue,
                                    const void * pvItemToQueue,
                                    BaseType_t * pxHigherPriorityTaskWoken);

参数:
xQueue: 队列句柄,指明要向哪个队列发送数据,创建队列成功以后会返回此队列的
队列句柄。
pvItemToQueue:指向要发送的消息,发送的时候会将这个消息拷贝到队列中。
pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换,这个变量的值由这
三个函数来设置的,用户不用进行设置,用户只需要提供一
个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退
出中断服务函数之前一定要进行一次任务切换。
返回值:
pdTRUE: 向队列中发送消息成功!
errQUEUE_FULL: 队列已经满了,消息发送失败。

BaseType_t xQueueGenericSendFromISR(QueueHandle_t xQueue,
				                    const void* pvItemToQueue,
                                    BaseType_t* pxHigherPriorityTaskWoken,
                                    BaseType_t xCopyPosition);

上面说了 4 个中断级入队函数最终都是调用的函数 xQueueGenericSendFromISR(), 这是真
正干活的主啊,也是我们下面会详细讲解的函数, 先来看一下这个函数的原型,如下:

参数:
xQueue: 队列句柄,指明要向哪个队列发送数据,创建队列成功以后会返回此队列的
队列句柄。
pvItemToQueue:指向要发送的消息,发送的过程中会将这个消息拷贝到队列中。
pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换,这个变量的值由这
三个函数来设置的,用户不用进行设置,用户只需要提供一
个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退
出中断服务函数之前一定要进行一次任务切换。
xCopyPosition: 入队方式,有三种入队方式:
queueSEND_TO_BACK: 后向入队
queueSEND_TO_FRONT: 前向入队
queueOVERWRITE: 覆写入队。
返回值:
pdTRUE: 向队列发送消息成功!
errQUEUE_FULL: 队列已经满了,消息发送失败。

出队函数

在这里插入图片描述

BaseType_t xQueueReceive(QueueHandle_t xQueue,
			             void * pvBuffer,
                         TickType_t xTicksToWait);

参数:
xQueue: 队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的
队列句柄。
pvBuffer: 保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区
中。
xTicksToWait: 阻塞时间,此参数指示当队列空的时候任务进入阻塞态等待队列有数据的最
大时间。如果为 0 的话当队列空的时候就立即返回;当为 portMAX_DELAY
的 话 就 会 一 直 等 待 , 直 到 队 列 有 数 据 , 也 就 是 死 等 , 但 是 宏
INCLUDE_vTaskSuspend 必须为 1。
返回值:
pdTRUE: 从队列中读取数据成功。
pdFALSE: 从队列中读取数据失败。

BaseType_t xQueuePeek(QueueHandle_t xQueue,
                      void * pvBuffer,
                      TickType_t xTicksToWait);

参数:
xQueue: 队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的
队列句柄。
pvBuffer: 保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区
中。
xTicksToWait: 阻塞时间,此参数指示当队列空的时候任务进入阻塞态等待队列有数据的最
大时间。如果为 0 的话当队列空的时候就立即返回;当为 portMAX_DELAY
的 话 就 会 一 直 等 待 , 直 到 队 列 有 数 据 , 也 就 是 死 等 , 但 是 宏
INCLUDE_vTaskSuspend 必须为 1。
返回值:
pdTRUE: 从队列中读取数据成功。
pdFALSE: 从队列中读取数据失败

BaseType_t xQueueGenericReceive(QueueHandle_t xQueue,
                                void* pvBuffer,
                                TickType_t xTicksToWait
                                BaseType_t xJustPeek)

不 管 是 函 数 xQueueReceive() 还 是 xQueuePeek() , 最 终 都 是 调 用 的 函 数
xQueueGenericReceive(),此函数是真正干事的,函数原型如下:

参数:
xQueue: 队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的
队列句柄。
pvBuffer: 保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区
中。
xTicksToWait: 阻塞时间,此参数指示当队列空的时候任务进入阻塞态等待队列有数据的最
大时间。如果为 0 的话当队列空的时候就立即返回;当为 portMAX_DELAY
的 话 就 会 一 直 等 待 , 直 到 队 列 有 数 据 , 也 就 是 死 等 , 但 是 宏
INCLUDE_vTaskSuspend 必须为 1。
xJustPeek: 标记当读取成功以后是否删除掉队列项, 当为 pdTRUE 的时候就不用删除,
也就是说你后面再调用函数 xQueueReceive()获取到的队列项是一样的。当为
pdFALSE 的时候就会删除掉这个队列项。
返回值:
pdTRUE: 从队列中读取数据成功。
pdFALSE: 从队列中读取数据失败。

BaseType_t xQueueReceiveFromISR(QueueHandle_t xQueue,
                                void* pvBuffer,
                                BaseType_t * pxTaskWoken);

参数:
xQueue: 队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的
队列句柄。
pvBuffer: 保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区
中。
pxTaskWoken: 标记退出此函数以后是否进行任务切换,这个变量的值是由函数来设置的,
用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值
为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
返回值:
pdTRUE: 从队列中读取数据成功。
pdFALSE: 从队列中读取数据失败。

BaseType_t xQueuePeekFromISR(QueueHandle_t xQueue,
                             void * pvBuffer)

参数
xQueue: 队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的
队列句柄。
pvBuffer: 保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区
中。
返回值:
pdTRUE: 从队列中读取数据成功。
pdFALSE: 从队列中读取数据失败。


本文链接: http://www.dtmao.cc/news_show_350367.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?