赞
踩
之前的文章
消息队列之前提到的
队列代码:
这一份代码是开源中国网的已有注释,我们可以看到这里的消息队列的各个属性,根据英文单词就能明白作用(个人觉得甚至不用注释了)
typedef struct {
UINT8 *queueHandle; /**< Pointer to a queue handle */ //指向队列句柄的指针
UINT16 queueState; /**< Queue state */ //队列状态
UINT16 queueLen; /**< Queue length */ //队列中消息总数的上限值,由创建时确定,不再改变
UINT16 queueSize; /**< Node size */ //消息节点大小,由创建时确定,不再改变,即定义了每个消息长度的上限.
UINT32 queueID; /**< queueID */ //队列ID
UINT16 queueHead; /**< Node head */ //消息头节点位置(数组下标)
UINT16 queueTail; /**< Node tail */ //消息尾节点位置(数组下标)
UINT16 readWriteableCnt[OS_QUEUE_N_RW]; /**< Count of readable or writable resources, 0:readable, 1:writable */
//队列中可写或可读消息数,0表示可读,1表示可写
LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]; /**< the linked list to be read or written, 0:readlist, 1:writelist */
//挂的都是等待读/写消息的任务链表,0表示读消息的链表,1表示写消息的任务链表
LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_why 这里尚未搞明白是啥意思 ,是共享内存吗?
} LosQueueCB;//读写队列分离
这里有两个lite版本的宏定义变量
LITE_OS_SEC_BSS LosQueueCB *g_allQueue = NULL;//消息队列池
LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_freeQueueList;//空闲队列链表,管分配的,需要队列从这里申请
这里是两个链表和队列池,我们可以发现链表经常使用。
以上为队列的样子,具体的使用也是参考别人的代码,但是这部分代码确实相比其他代码更吸引我。
一些引用的解读:
我们首先是要创建,创建之后初始化后才可以投入正常使用。我们知道没一个队列都有一个id,这个是唯一指定的标识符,还有对应的操作码:指明本次操作是读还是写。
初始化时侯主要是对全局变量进行赋值,创建一个消息队列池。timeout只用于当队列中没有读/写内容时的等待,这里的消息队列和任务链表出现频率很高,不只是队列。
LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)//消息队列模块初始化 { LosQueueCB *queueNode = NULL; UINT32 index; UINT32 size; size = LOSCFG_BASE_IPC_QUEUE_LIMIT * sizeof(LosQueueCB);//支持1024个IPC队列 /* system resident memory, don't free */ g_allQueue = (LosQueueCB *)LOS_MemAlloc(m_aucSysMem0, size);//常驻内存 if (g_allQueue == NULL) { return LOS_ERRNO_QUEUE_NO_MEMORY; } (VOID)memset_s(g_allQueue, size, 0, size);//清0 LOS_ListInit(&g_freeQueueList);//初始化空闲链表 for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) {//循环初始化每个消息队列 queueNode = ((LosQueueCB *)g_allQueue) + index;//一个一个来 queueNode->queueID = index;//这可是 队列的身份证 LOS_ListTailInsert(&g_freeQueueList, &queueNode->readWriteList[OS_QUEUE_WRITE]);//通过写节点挂到空闲队列链表上 }//这里要注意是用 readWriteList 挂到 g_freeQueueList链上的,所以要通过 GET_QUEUE_LIST 来找到 LosQueueCB if (OsQueueDbgInitHook() != LOS_OK) {//调试队列使用的. return LOS_ERRNO_QUEUE_NO_MEMORY; } return LOS_OK; }
调用部分:
消息队列解决任务间大数据的传递
以一种异步,解耦的方式实现任务通讯
全局由消息队列池统一管理
在创建消息队列时申请内存块存储消息内存.
读/写操作统一管理,分开执行,A任务 读/写完消息后会立即唤醒等待写/读的B任务.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。