93#ifdef LOSCFG_BASE_IPC_QUEUE
94#if (LOSCFG_BASE_IPC_QUEUE_LIMIT <= 0)
95#error "queue maxnum cannot be zero"
111 size = LOSCFG_BASE_IPC_QUEUE_LIMIT *
sizeof(
LosQueueCB);
115 return LOS_ERRNO_QUEUE_NO_MEMORY;
119 for (index = 0; index < LOSCFG_BASE_IPC_QUEUE_LIMIT; index++) {
126 return LOS_ERRNO_QUEUE_NO_MEMORY;
143 if (queueID == NULL) {
144 return LOS_ERRNO_QUEUE_CREAT_PTR_NULL;
147 if (maxMsgSize > (OS_NULL_SHORT -
sizeof(
UINT32))) {
148 return LOS_ERRNO_QUEUE_SIZE_TOO_BIG;
151 if ((len == 0) || (maxMsgSize == 0)) {
152 return LOS_ERRNO_QUEUE_PARA_ISZERO;
155 msgSize = maxMsgSize +
sizeof(
UINT32);
162 return LOS_ERRNO_QUEUE_CREATE_NO_MEMORY;
165 SCHEDULER_LOCK(intSave);
167 SCHEDULER_UNLOCK(intSave);
170 return LOS_ERRNO_QUEUE_CB_UNAVAILABLE;
175 queueCB = GET_QUEUE_LIST(unusedQueue);
189 SCHEDULER_UNLOCK(intSave);
192 OsHookCall(LOS_HOOK_TYPE_QUEUE_CREATE, queueCB);
199 if (GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) {
200 return LOS_ERRNO_QUEUE_INVALID;
202 if ((bufferAddr == NULL) || (bufferSize == NULL)) {
203 return LOS_ERRNO_QUEUE_READ_PTR_NULL;
206 if ((*bufferSize == 0) || (*bufferSize > (OS_NULL_SHORT -
sizeof(
UINT32)))) {
207 return LOS_ERRNO_QUEUE_READSIZE_IS_INVALID;
212 if (timeout != LOS_NO_WAIT) {
214 return LOS_ERRNO_QUEUE_READ_IN_INTERRUPT;
223 if (GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) {
224 return LOS_ERRNO_QUEUE_INVALID;
227 if (bufferAddr == NULL) {
228 return LOS_ERRNO_QUEUE_WRITE_PTR_NULL;
231 if (*bufferSize == 0) {
232 return LOS_ERRNO_QUEUE_WRITESIZE_ISZERO;
237 if (timeout != LOS_NO_WAIT) {
239 return LOS_ERRNO_QUEUE_WRITE_IN_INTERRUPT;
247 UINT8 *queueNode = NULL;
252 switch (OS_QUEUE_OPERATE_GET(operateType)) {
253 case OS_QUEUE_READ_HEAD:
257 case OS_QUEUE_WRITE_HEAD:
261 case OS_QUEUE_WRITE_TAIL:
266 PRINT_ERR(
"invalid queue operate type!\n");
272 if (OS_QUEUE_IS_READ(operateType)) {
275 PRINT_ERR(
"get msgdatasize failed\n");
278 msgDataSize = (*bufferSize < msgDataSize) ? *bufferSize : msgDataSize;
279 if (memcpy_s(bufferAddr, *bufferSize, queueNode, msgDataSize) != EOK) {
280 PRINT_ERR(
"copy message to buffer failed\n");
284 *bufferSize = msgDataSize;
286 if (memcpy_s(queueNode, queueCB->
queueSize, bufferAddr, *bufferSize) != EOK) {
287 PRINT_ERR(
"store message failed\n");
292 PRINT_ERR(
"store message size failed\n");
302 return LOS_ERRNO_QUEUE_NOT_CREATE;
305 if (OS_QUEUE_IS_WRITE(operateType) && (*bufferSize > (queueCB->
queueSize -
sizeof(
UINT32)))) {
306 return LOS_ERRNO_QUEUE_WRITE_SIZE_TOO_BIG;
325 UINT32 readWrite = OS_QUEUE_READ_WRITE_GET(operateType);
327 OsHookCall(LOS_HOOK_TYPE_QUEUE_READ, (
LosQueueCB *)GET_QUEUE_HANDLE(queueID), operateType, *bufferSize, timeout);
329 SCHEDULER_LOCK(intSave);
337 if (timeout == LOS_NO_WAIT) {
338 ret = OS_QUEUE_IS_READ(operateType) ? LOS_ERRNO_QUEUE_ISEMPTY : LOS_ERRNO_QUEUE_ISFULL;
343 ret = LOS_ERRNO_QUEUE_PEND_IN_LOCK;
350 if (ret == LOS_ERRNO_TSK_TIMEOUT) {
351 ret = LOS_ERRNO_QUEUE_TIMEOUT;
363 resumedTask->
ops->
wake(resumedTask);
364 SCHEDULER_UNLOCK(intSave);
373 SCHEDULER_UNLOCK(intSave);
391 return OsQueueOperate(queueID, operateType, bufferAddr, bufferSize, timeout);
408 return OsQueueOperate(queueID, operateType, bufferAddr, &bufferSize, timeout);
425 return OsQueueOperate(queueID, operateType, bufferAddr, &bufferSize, timeout);
451 if (bufferAddr == NULL) {
452 return LOS_ERRNO_QUEUE_WRITE_PTR_NULL;
454 bufferSize =
sizeof(
CHAR *);
471 if (bufferAddr == NULL) {
472 return LOS_ERRNO_QUEUE_WRITE_PTR_NULL;
474 bufferSize =
sizeof(
CHAR *);
493 if (GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) {
494 return LOS_ERRNO_QUEUE_NOT_FOUND;
497 SCHEDULER_LOCK(intSave);
498 queueCB = (
LosQueueCB *)GET_QUEUE_HANDLE(queueID);
500 ret = LOS_ERRNO_QUEUE_NOT_CREATE;
505 ret = LOS_ERRNO_QUEUE_IN_TSKUSE;
510 ret = LOS_ERRNO_QUEUE_IN_TSKUSE;
515 ret = LOS_ERRNO_QUEUE_IN_TSKUSE;
521 ret = LOS_ERRNO_QUEUE_IN_TSKWRITE;
528 queueCB->
queueID = SET_QUEUE_ID(GET_QUEUE_COUNT(queueCB->
queueID) + 1, GET_QUEUE_INDEX(queueCB->
queueID));
532 SCHEDULER_UNLOCK(intSave);
533 OsHookCall(LOS_HOOK_TYPE_QUEUE_DELETE, queueCB);
538 SCHEDULER_UNLOCK(intSave);
549 if (queueInfo == NULL) {
550 return LOS_ERRNO_QUEUE_PTR_NULL;
553 if (GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) {
554 return LOS_ERRNO_QUEUE_INVALID;
558 SCHEDULER_LOCK(intSave);
560 queueCB = (
LosQueueCB *)GET_QUEUE_HANDLE(queueID);
562 ret = LOS_ERRNO_QUEUE_NOT_CREATE;
587 SCHEDULER_UNLOCK(intSave);
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListTailInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the tail of a doubly linked list.
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT8 * m_aucSysMem1
系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ???
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHeadCopy(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
接口函数从队列头开始写
LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteHead(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
Write data into a queue header.
LITE_OS_SEC_BSS LosQueueCB * g_allQueue
消息队列池
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_QueueInfoGet(UINT32 queueID, QUEUE_INFO_S *queueInfo)
外部接口, 获取队列信息,用queueInfo 把 LosQueueCB数据接走,QUEUE_INFO_S对内部数据的封装
LITE_OS_SEC_TEXT UINT32 LOS_QueueReadCopy(UINT32 queueID, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeout)
接口函数定时读取消息队列
LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(CHAR *queueName, UINT16 len, UINT32 *queueID, UINT32 flags, UINT16 maxMsgSize)
创建一个队列,根据用户传入队列长度和消息节点大小来开辟相应的内存空间以供该队列使用,参数queueID带走队列ID
LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueDelete(UINT32 queueID)
Delete a queue.
LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteCopy(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
接口函数 从队列尾部开始写
LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
Read a queue.
LITE_OS_SEC_TEXT UINT32 LOS_QueueWrite(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
Write data into a queue.
struct tagQueueInfo QUEUE_INFO_S
VOID LOS_Schedule(VOID)
Trigger active task scheduling.
VOID LOS_MpSchedule(UINT32 target)
STATIC LITE_OS_SEC_TEXT UINT32 OsQueueReadParameterCheck(UINT32 queueID, const VOID *bufferAddr, const UINT32 *bufferSize, UINT32 timeout)
读队列参数检查
STATIC UINT32 OsQueueOperateParamCheck(const LosQueueCB *queueCB, UINT32 queueID, UINT32 operateType, const UINT32 *bufferSize)
队列操作参数检查
UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeout)
队列操作.是读是写由operateType定 本函数是消息队列最重要的一个函数,可以分析出读取消息过程中 发生的细节,涉及任务的唤醒和阻塞,阻塞链表任务的相互提醒.
STATIC LITE_OS_SEC_TEXT UINT32 OsQueueWriteParameterCheck(UINT32 queueID, const VOID *bufferAddr, const UINT32 *bufferSize, UINT32 timeout)
写队列参数检查
STATIC VOID OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize)
队列buf操作,注意队列数据是按顺序来读取的,要不从头,要不从尾部,不会出现从中间读写,所有可由 head 和 tail 来管理队列.
LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)
LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_freeQueueList
空闲队列链表,管分配的,需要队列从这里申请
STATIC INLINE VOID OsQueueDbgTimeUpdateHook(UINT32 queueID)
STATIC INLINE VOID OsQueueCheckHook(VOID)
STATIC INLINE VOID OsQueueDbgUpdateHook(UINT32 queueID, TSK_ENTRY_FUNC entry)
STATIC INLINE UINT32 OsQueueDbgInitHook(VOID)
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
STATIC INLINE BOOL OsPreemptableInSched(VOID)
STATIC INLINE VOID OsTaskWaitSetPendMask(UINT16 mask, UINTPTR lockID, UINT32 timeout)
设置事件阻塞掩码,即设置任务的等待事件.
STATIC INLINE VOID OsTaskWakeClearPendMask(LosTaskCB *resumeTask)
清除事件阻塞掩码,即任务不再等待任何事件.
UINT16 readWriteableCnt[OS_QUEUE_N_RW]
LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]
UINT32(* wait)(LosTaskCB *runTask, LOS_DL_LIST *list, UINT32 timeout)
任务等待
VOID(* wake)(LosTaskCB *taskCB)
任务唤醒