从0到1学习FreeRTOS:FreeRTOS 内核应用开发:(九)消息队列 NO.2 消息队列常用函数讲解
目录
二、消息队列静态创建函数 xQueueCreateStatic():
使用队列模块的典型流程如下:
创建消息队列。
写队列操作。
读队列操作。
删除队列。
一、消息队列创建函数 xQueueCreate():
xQueueCreate()用于创建一个新的队列并返回可用于访问这个队列的队列句柄。队列句柄其实就是一个指向队列数据结构类型的指针。
每创建一个新的队列都需要为其分配内存空间,一部分用于存储队列的基本信息,剩下的作为队列消息的存储区域。
函数 |
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,
UBaseType_t uxItemSize ); |
|
功能 |
用于创建一个新的队列。 |
|
参数 |
uxQueueLength |
队列能够存储的最大消息单元数目,即队列长度。 |
uxItemSize |
队列中消息单元的大小,以字节为单位。 |
|
返回值 |
如果创建成功则返回一个队列句柄,用于访问创建的队列。如果创建不成功则返回
NULL,可能原因是创建队列需要的RAM无法分配成功。 |
初始化消息队列:
初始化息队列的成员变量,pcTail指向存储消息内存空间的结束地址。
pcWriteTo指向队列消息存储区下一个可用消息空间,也就是pcHead指向的空间。
pcReadFrom指向消息队列最后一个消息空间。
初始化入队/出队阻塞列表。
QueueHandle_t Test_Queue =NULL;
#define QUEUE_LEN 4 /* 队列的长度,最大可包含多少个消息 */
#define QUEUE_SIZE 4 /* 队列中每个消息大小(字节) */
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
taskENTER_CRITICAL(); //进入临界区
/* 创建 Test_Queue */
Test_Queue = xQueueCreate((UBaseType_t ) QUEUE_LEN,/* 消息队列的长度 */
(UBaseType_t ) QUEUE_SIZE);/* 消息的大小 */
if (NULL != Test_Queue)
printf("创建 Test_Queue 消息队列成功!\r\n");
taskEXIT_CRITICAL(); //退出临界区
在创建消息队列的时候,是需要用户自己定义消息队列的句柄指针的。
创建完成会返回消息队列的句柄,用户通过句柄就可使用消息队列进行发送与读取消息队列的操作,如果返回的是NULL则表示创建失败。
二、消息队列静态创建函数 xQueueCreateStatic():
不常用,略。
三、消息队列删除函数 vQueueDelete():
队列删除函数是根据消息队列句柄直接删除的,删除之后这个消息队列的所有信息都会被系统回收清空,而且不能再次使用这个消息队列了。
xQueue是vQueueDelete()函数的形参,是消息队列句柄,表示的是要删除哪个想队列。
注意: 在消息队列有消息的时候、有任务阻塞在消息队列上等待消息的时候,尽量不要删除它,虽然源码并没有禁止删除的操作,但是为了代码健壮性,还是需要注意的 。
#define QUEUE_LENGTH 5
#define QUEUE_ITEM_SIZE 4
int main( void )
{
QueueHandle_t xQueue;
/* 创建消息队列 */
xQueue = xQueueCreate( QUEUE_LENGTH, QUEUE_ITEM_SIZE );
if ( xQueue == NULL ) {
/* 消息队列创建失败 */
} else {
/* 删除已创建的消息队列 */
vQueueDelete( xQueue );
}
}