OpenHarmony POSIX和CMSIS接口适配层解读(1):queue_adapter

一、前言

POSIX和CMSIS接口适配层,用于协调M核和A核API之间的差异。本文针对queue_adapter部分进行解读。

二、头文件分析

在samgr\adapter\queue_adapter.h中对队列的操作进行声明。

MQueueId QUEUE_Create(const char *name, int size, int count);//创建队列
int QUEUE_Put(MQueueId queueId, const void *element, uint8 pri, int timeout);//入队列
int QUEUE_Pop(MQueueId queueId, void *element, uint8 *pri, int timeout);//出队列
int QUEUE_Destroy(MQueueId queueId);//销毁队列

在samgr\adapter\posix\lock_free_queue.h中对无锁队列的操作进行声明。

typedef struct LockFreeQueue LockFreeQueue;
struct LockFreeQueue {
    uint32 write;//入队消息的位置
    uint32 read;//出队消息的位置
    uint32 itemSize;//元素大小
    uint32 totalSize;//总字节大小
    uint8 buffer[0];
};
LockFreeQueue *LFQUE_Create(int size, int count);//创建队列
BOOL LFQUE_IsEmpty(LockFreeQueue *queue);//判断队列中消息是否为空
BOOL LFQUE_IsFull(LockFreeQueue *queue);//判断队列是否已满
int LFQUE_Push(LockFreeQueue *queue, const void *element, uint8 pri);//入队操作
int LFQUE_Pop(LockFreeQueue *queue, void *element, uint8 *pri);//出队操作

三、函数实现分析

- CMSIS的队列操作

在samgr\adapter\cmsis\queue_adapter.c中实现CMSIS的队列操作。

队列的创建操作

MQueueId QUEUE_Create(const char *name, int size, int count)
{
    osMessageQueueAttr_t queueAttr = {name, 0, NULL, 0, NULL, 0};//配置队列属性
    /*
        函数功能:创建队列
        函数参数:@param1:队列中消息的最大数量
                @param2:元素所占最大字节数
                @param3:队列属性
        函数返回:成功返回对象指针,失败返回NULL   
    */
    return (MQueueId)osMessageQueueNew(count, size, &queueAttr);
}

队列的入队操作

int QUEUE_Put(MQueueId queueId, const void *element, uint8 pri, int timeout)
{
    //当超时设置为 0 时,函数立即返回
    uint32_t waitTime = (timeout <= 0) ? 0 : (uint32_t)timeout;
    /*
        函数功能:入队操作
        函数参数:@param1:队列ID
                @param2:指向消息缓冲区的指针
                @param3:消息优先级
                @param4:超时值
        函数描述:将 element 指向的消息放入由参数 queueId 指定的消息队列中。
                参数 pri 用于根据插入的优先级对消息进行排序(较高的数字表示较高的优先级)
                waitTime指定系统等待将消息放入队列的时间。
    */
    osStatus_t ret = osMessageQueuePut(queueId, element, pri, waitTime);
    if (ret != osOK)
    {
        return EC_BUSBUSY;
    }
    return EC_SUCCESS;
}

队列的出队操作

int QUEUE_Pop(MQueueId queueId, void *element, uint8 *pri, int timeout)
{
    //当超时设置为 osWaitForever 时,该函数将等待无限时间,直到检索到消息
    uint32_t waitTime = (timeout <= 0) ? osWaitForever : (uint32_t)timeout;
    /*
        函数功能:出队操作
        函数参数:@param1:队列ID
                @param2:指向接收缓冲区的指针
                @param3:消息优先级
                @param4:超时值
        函数描述:从 queueId 指定的消息队列中检索消息,并将其保存到 element 所指向的缓冲区中。
                消息优先级存储到参数 pri 
                waitTime指定系统等待从队列中检索消息的时间。
    */
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值