From cc432b761c884a0bd8e9d83db0a4e26109fc08b1 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 08 十一月 2024 15:35:38 +0800 Subject: [PATCH] 安邦手环GPS删除部分无用数据和修改4G波特率9600出厂测试固件 --- keil/include/components/wsf/sources/port/baremetal/wsf_queue.c | 355 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 355 insertions(+), 0 deletions(-) diff --git a/keil/include/components/wsf/sources/port/baremetal/wsf_queue.c b/keil/include/components/wsf/sources/port/baremetal/wsf_queue.c new file mode 100644 index 0000000..c98ab67 --- /dev/null +++ b/keil/include/components/wsf/sources/port/baremetal/wsf_queue.c @@ -0,0 +1,355 @@ +/*************************************************************************************************/ +/*! + * \file wsf_queue.c + * + * \brief General purpose queue service. + * + * Copyright (c) 2009-2018 Arm Ltd. All Rights Reserved. + * + * Copyright (c) 2019-2020 Packetcraft, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "wsf_types.h" +#include "wsf_queue.h" + +#include "wsf_assert.h" +#include "wsf_cs.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/* Get next queue element */ +#define WSF_QUEUE_NEXT(p) (((wsfQueueElem_t *)(p))->pNext) + +/************************************************************************************************** + Data Types +**************************************************************************************************/ + +/* Queue element */ +typedef struct wsfQueueElem_tag +{ + struct wsfQueueElem_tag *pNext; /* pointer to next element */ +} wsfQueueElem_t; + +/*************************************************************************************************/ +/*! + * \brief Enqueue and element to the tail of a queue. + * + * \param pQueue Pointer to queue. + * \param pElem Pointer to element. + */ +/*************************************************************************************************/ +void WsfQueueEnq(wsfQueue_t *pQueue, void *pElem) +{ + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + WSF_ASSERT(pElem != NULL); + + /* initialize next pointer */ + WSF_QUEUE_NEXT(pElem) = NULL; + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + /* if queue empty */ + if (pQueue->pHead == NULL) + { + pQueue->pHead = pElem; + pQueue->pTail = pElem; + } + /* else enqueue element to the tail of queue */ + else + { + WSF_QUEUE_NEXT(pQueue->pTail) = pElem; + pQueue->pTail = pElem; + } + + /* exit critical section */ + WSF_CS_EXIT(lock); +} + +/*************************************************************************************************/ +/*! + * \brief Peek the head of a queue. + * + * \param pQueue Pointer to queue. + * + * \return Pointer to element that has been dequeued or NULL if queue is empty. + */ +/*************************************************************************************************/ +void *WsfQueuePeek(wsfQueue_t *pQueue) +{ + wsfQueueElem_t *pElem; + + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + pElem = pQueue->pHead; + + /* exit critical section */ + WSF_CS_EXIT(lock); + + return pElem; +} +/*************************************************************************************************/ +/*! + * \brief Dequeue and element from the head of a queue. + * + * \param pQueue Pointer to queue. + * + * \return Pointer to element that has been dequeued or NULL if queue is empty. + */ +/*************************************************************************************************/ +void *WsfQueueDeq(wsfQueue_t *pQueue) +{ + wsfQueueElem_t *pElem; + + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + pElem = pQueue->pHead; + + /* if queue is not empty */ + if (pElem != NULL) + { + /* set head to next element in queue */ + pQueue->pHead = WSF_QUEUE_NEXT(pElem); + + /* check for empty queue */ + if (pQueue->pHead == NULL) + { + pQueue->pTail = NULL; + } + } + + /* exit critical section */ + WSF_CS_EXIT(lock); + + return pElem; +} + +/*************************************************************************************************/ +/*! + * \brief Push an element to the head of a queue. + * + * \param pQueue Pointer to queue. + * \param pElem Pointer to element. + */ +/*************************************************************************************************/ +void WsfQueuePush(wsfQueue_t *pQueue, void *pElem) +{ + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + WSF_ASSERT(pElem != NULL); + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + /* else push element to head of queue */ + WSF_QUEUE_NEXT(pElem) = pQueue->pHead; + + /* if queue was empty set tail */ + if (pQueue->pHead == NULL) + { + pQueue->pTail = pElem; + } + + /* set head */ + pQueue->pHead = pElem; + + /* exit critical section */ + WSF_CS_EXIT(lock); +} + +/*************************************************************************************************/ +/*! + * \brief Insert an element into a queue. This function is typically used when iterating + * over a queue. + * + * \param pQueue Pointer to queue. + * \param pElem Pointer to element to be inserted. + * \param pPrev Pointer to previous element in the queue before element to be inserted. + * Note: set pPrev to NULL if pElem is first element in queue. + * \return None. + */ +/*************************************************************************************************/ +void WsfQueueInsert(wsfQueue_t *pQueue, void *pElem, void *pPrev) +{ + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + WSF_ASSERT(pElem != NULL); + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + /* if queue empty or inserting at tail */ + if (pQueue->pHead == NULL || pPrev == pQueue->pTail) + { + /* queue as normal */ + WsfQueueEnq(pQueue, pElem); + } + /* else if inserting at head */ + else if (pPrev == NULL) + { + /* push to head */ + WsfQueuePush(pQueue, pElem); + } + else + { + /* insert in middle of queue */ + WSF_QUEUE_NEXT(pElem) = WSF_QUEUE_NEXT(pPrev); + WSF_QUEUE_NEXT(pPrev) = pElem; + } + + /* exit critical section */ + WSF_CS_EXIT(lock); +} + +/*************************************************************************************************/ +/*! + * \brief Remove an element from a queue. This function is typically used when iterating + * over a queue. + * + * \param pQueue Pointer to queue. + * \param pElem Pointer to element to be removed. + * \param pPrev Pointer to previous element in the queue before element to be removed. + * Note: set pPrev to NULL if pElem is first element in queue. + * \return None. + */ +/*************************************************************************************************/ +void WsfQueueRemove(wsfQueue_t *pQueue, void *pElem, void *pPrev) +{ + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + WSF_ASSERT(pQueue->pHead != NULL); + WSF_ASSERT(pElem != NULL); + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + /* if first element */ + if (pElem == pQueue->pHead) + { + /* remove from head of queue */ + pQueue->pHead = WSF_QUEUE_NEXT(pElem); + } + else if (pPrev) + { + /* remove from middle of queue, pPrev will never be null */ + WSF_QUEUE_NEXT(pPrev) = WSF_QUEUE_NEXT(pElem); + } + + /* if last element */ + if (pElem == pQueue->pTail) + { + /* update tail */ + pQueue->pTail = pPrev; + } + + /* exit critical section */ + WSF_CS_EXIT(lock); +} + +/*************************************************************************************************/ +/*! + * \brief Count the number of elements in a queue. + * + * \param pQueue Pointer to queue. + * + * \return Number of elements in queue. + */ +/*************************************************************************************************/ +uint16_t WsfQueueCount(wsfQueue_t *pQueue) +{ + wsfQueueElem_t *pElem; + uint16_t count = 0; + + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + pElem = pQueue->pHead; + + /* iterate over queue */ + while (pElem != NULL) + { + count++; + pElem = pElem->pNext; + } + + /* exit critical section */ + WSF_CS_EXIT(lock); + + return count; +} + +/*************************************************************************************************/ +/*! + * \brief Return TRUE if queue is empty. + * + * \param pQueue Pointer to queue. + * + * \return TRUE if queue is empty, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t WsfQueueEmpty(wsfQueue_t *pQueue) +{ + bool_t empty; + + WSF_CS_INIT(cs); + + WSF_ASSERT(pQueue != NULL); + + /* enter critical section */ + uint32_t lock = WSF_CS_ENTER(); + + empty = (pQueue->pHead == NULL); + + /* exit critical section */ + WSF_CS_EXIT(lock); + + return empty; +} + +/*************************************************************************************************/ +/*! + * \brief Check for a queue depth of 1 element. + * + * \param pQueue Queue. + * + * \return TRUE if Queue only has 1 element, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t WsfIsQueueDepthOne(wsfQueue_t *pQueue) +{ + return pQueue->pHead == pQueue->pTail; +} -- Gitblit v1.9.3