From 6d08f540240e0baad08328f06c66d8e2fb1f336f Mon Sep 17 00:00:00 2001
From: zhangbo <zhangbo@qq.com>
Date: 星期三, 04 十二月 2024 09:16:16 +0800
Subject: [PATCH] 实现,1对1通信,超时时间2ms

---
 keil/include/components/wsf/sources/port/baremetal/wsf_timer.c |  230 ++++++++-------------------------------------------------
 1 files changed, 33 insertions(+), 197 deletions(-)

diff --git a/keil/include/components/wsf/sources/port/baremetal/wsf_timer.c b/keil/include/components/wsf/sources/port/baremetal/wsf_timer.c
index 903d97f..896bf6e 100644
--- a/keil/include/components/wsf/sources/port/baremetal/wsf_timer.c
+++ b/keil/include/components/wsf/sources/port/baremetal/wsf_timer.c
@@ -1,67 +1,14 @@
-/*************************************************************************************************/
-/*!
- *  \file   wsf_timer.c
- *
- *  \brief  Timer service.
- *
- *  Copyright (c) 2009-2019 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_timer.h"
-
-#include "wsf_assert.h"
-#include "wsf_cs.h"
-#include "wsf_trace.h"
-#include "pal_sys.h"
-
-/**************************************************************************************************
-  Macros
-**************************************************************************************************/
-
-#if (WSF_MS_PER_TICK == 10)
-
-/*! \brief  WSF timer ticks per second. */
-#define WSF_TIMER_TICKS_PER_SEC (1000 / WSF_MS_PER_TICK)
-
-/* convert seconds to timer ticks */
-#define WSF_TIMER_SEC_TO_TICKS(sec) (WSF_TIMER_TICKS_PER_SEC * (sec))
-
-/* convert milliseconds to timer ticks */
-#define WSF_TIMER_MS_TO_TICKS(ms) ((ms) / WSF_MS_PER_TICK)
-
-#else
-#error "WSF_TIMER_MS_TO_TICKS and WSF_TIMER_SEC_TO_TICKS not defined for WSF_MS_PER_TICK"
-#endif
-
-/*! \brief  Minimum RTC ticks required to go into sleep. */
-#define WSF_TIMER_MIN_MS_FOR_POWERDOWN (2)
-#define WSF_TIMER_MAX_MS_FOR_POWERDOWN (10000)
+#include "mk_common.h"
+#include "mk_misc.h"
+// #include "mk_trace.h"
 
 /**************************************************************************************************
   Global Variables
 **************************************************************************************************/
 
 static wsfQueue_t wsfTimerTimerQueue; /*!< Timer queue */
-
-/*! \brief  Last SysTick value read. */
-static uint32_t wsfTimerSysTickcLastTick = 0;
 
 /*************************************************************************************************/
 /*!
@@ -88,7 +35,7 @@
         pElem = pElem->pNext;
     }
 
-    /* if timer found remove from queue */
+    /* if timer found, remove from queue */
     if (pElem != NULL)
     {
         WsfQueueRemove(&wsfTimerTimerQueue, pTimer, pPrev);
@@ -106,13 +53,12 @@
  *  \param  mode    Timer work mode.
  */
 /*************************************************************************************************/
-static void wsfTimerInsert(wsfTimer_t *pTimer, wsfTimerTicks_t ticks, uint8_t mode)
+static void wsfTimerInsert(wsfTimer_t *pTimer, uint32_t ticks, uint8_t mode)
 {
     wsfTimer_t *pElem;
     wsfTimer_t *pPrev = NULL;
 
-    /* task schedule lock */
-    uint32_t lock = WsfTaskLock();
+    uint32_t lock = int_lock();
 
     /* if timer is already running stop it first */
     if (pTimer->isStarted)
@@ -138,11 +84,8 @@
         pElem = pElem->pNext;
     }
 
-    /* insert timer into queue */
     WsfQueueInsert(&wsfTimerTimerQueue, pTimer, pPrev);
-
-    /* task schedule unlock */
-    WsfTaskUnlock(lock);
+    int_unlock(lock);
 }
 
 /*************************************************************************************************/
@@ -151,32 +94,24 @@
  *          function can return zero even if a timer is running, indicating a timer
  *          has expired but has not yet been serviced.
  *
- *  \param  pTimerRunning   Returns TRUE if a timer is running, FALSE if no timers running.
- *
  *  \return The number of ticks until the next timer expiration.
  */
 /*************************************************************************************************/
-static wsfTimerTicks_t WsfTimerNextExpiration(bool_t *pTimerRunning)
+uint32_t WsfTimerNextExpiration(void)
 {
-    wsfTimerTicks_t ticks;
-
-    /* task schedule lock */
-    uint32_t lock = WsfTaskLock();
+    uint32_t ticks;
+    uint32_t lock = int_lock();
 
     if (wsfTimerTimerQueue.pHead == NULL)
     {
-        *pTimerRunning = FALSE;
-        ticks = 0;
+        ticks = UINT32_MAX;
     }
     else
     {
-        *pTimerRunning = TRUE;
         ticks = ((wsfTimer_t *)wsfTimerTimerQueue.pHead)->ticks;
     }
 
-    /* task schedule unlock */
-    WsfTaskUnlock(lock);
-
+    int_unlock(lock);
     return ticks;
 }
 
@@ -193,19 +128,16 @@
 
 /*************************************************************************************************/
 /*!
- *  \brief  Start a timer in units of seconds.
+ *  \brief  Start a timer in units of 32768Hz ticks.
  *
  *  \param  pTimer  Pointer to timer.
- *  \param  sec     Seconds until expiration.
+ *  \param  ticks   32768Hz ticks until expiration.
  *  \param  mode    Timer work mode.
  */
 /*************************************************************************************************/
-void WsfTimerStartSec(wsfTimer_t *pTimer, wsfTimerTicks_t sec, uint8_t mode)
+void WsfTimerStartTick(wsfTimer_t *pTimer, uint32_t ticks, uint8_t mode)
 {
-    WSF_TRACE_INFO2("WsfTimerStartSec pTimer:0x%x ticks:%u", (uint32_t)pTimer, WSF_TIMER_SEC_TO_TICKS(sec));
-
-    /* insert timer into queue */
-    wsfTimerInsert(pTimer, WSF_TIMER_SEC_TO_TICKS(sec), mode);
+    wsfTimerInsert(pTimer, ticks, mode);
 }
 
 /*************************************************************************************************/
@@ -217,12 +149,9 @@
  *  \param  mode    Timer work mode.
  */
 /*************************************************************************************************/
-void WsfTimerStartMs(wsfTimer_t *pTimer, wsfTimerTicks_t ms, uint8_t mode)
+void WsfTimerStartMs(wsfTimer_t *pTimer, uint32_t ms, uint8_t mode)
 {
-    WSF_TRACE_INFO2("WsfTimerStartMs pTimer:0x%x ticks:%u", (uint32_t)pTimer, WSF_TIMER_MS_TO_TICKS(ms));
-
-    /* insert timer into queue */
-    wsfTimerInsert(pTimer, WSF_TIMER_MS_TO_TICKS(ms), mode);
+    wsfTimerInsert(pTimer, __MS_TO_32K_CNT(ms), mode);
 }
 
 /*************************************************************************************************/
@@ -234,15 +163,11 @@
 /*************************************************************************************************/
 void WsfTimerStop(wsfTimer_t *pTimer)
 {
-    WSF_TRACE_INFO1("WsfTimerStop pTimer:0x%x", pTimer);
-
-    /* task schedule lock */
-    uint32_t lock = WsfTaskLock();
+    uint32_t lock = int_lock();
 
     wsfTimerRemove(pTimer);
 
-    /* task schedule unlock */
-    WsfTaskUnlock(lock);
+    int_unlock(lock);
 }
 
 /*************************************************************************************************/
@@ -252,12 +177,11 @@
  *  \param  ticks  Number of ticks since last update.
  */
 /*************************************************************************************************/
-void WsfTimerUpdate(wsfTimerTicks_t ticks)
+void WsfTimerUpdate(uint32_t ticks)
 {
     wsfTimer_t *pElem;
 
-    /* task schedule lock */
-    uint32_t lock = WsfTaskLock();
+    uint32_t lock = int_lock();
 
     pElem = (wsfTimer_t *)wsfTimerTimerQueue.pHead;
 
@@ -272,37 +196,36 @@
         else
         {
             pElem->ticks = 0;
+        }
 
+        if (pElem->ticks < POWER_DOWN_TIME_TICK_MIN)
+        {
+            pElem->ticks = 0;
             /* timer expired; set task for this timer as ready */
             WsfTaskSetReady(pElem->handlerId, WSF_TIMER_EVENT);
         }
 
+        // LOG_INFO(TRACE_MODULE_OS, "WsfTimerUpdate  %u %u %u %u\r\n", pElem->handlerId, pElem->msg.event, pElem->ticks, ticks);
+
         pElem = pElem->pNext;
     }
 
-    /* task schedule unlock */
-    WsfTaskUnlock(lock);
+    int_unlock(lock);
 }
 
 /*************************************************************************************************/
 /*!
  *  \brief  Service expired timers for the given task.
  *
- *  \param  taskId      Task ID.
- *
  *  \return Pointer to timer or NULL.
  */
 /*************************************************************************************************/
-wsfTimer_t *WsfTimerServiceExpired(wsfTaskId_t taskId)
+wsfTimer_t *WsfTimerServiceExpired(void)
 {
     wsfTimer_t *pElem;
     wsfTimer_t *pPrev = NULL;
 
-    /* Unused parameters */
-    (void)taskId;
-
-    /* task schedule lock */
-    uint32_t lock = WsfTaskLock();
+    uint32_t lock = int_lock();
 
     /* find expired timers in queue */
     pElem = (wsfTimer_t *)wsfTimerTimerQueue.pHead;
@@ -314,101 +237,14 @@
         }
         else
         {
-            /* remove timer from queue */
             WsfQueueRemove(&wsfTimerTimerQueue, pElem, pPrev);
-
             pElem->isStarted = FALSE;
         }
 
-        /* task schedule unlock */
-        WsfTaskUnlock(lock);
-
-        WSF_TRACE_INFO1("Timer expired pTimer:0x%x", pElem);
-
-        /* return timer */
+        int_unlock(lock);
         return pElem;
     }
 
-    /* task schedule unlock */
-    WsfTaskUnlock(lock);
-
+    int_unlock(lock);
     return NULL;
-}
-
-/*************************************************************************************************/
-/*!
- *  \brief  Function for checking if there is an active timer and if there is enough time to
- *          go to sleep and going to sleep.
- */
-/*************************************************************************************************/
-uint8_t WsfTimerSleepCheck(uint32_t *sleep_ms)
-{
-    wsfTimerTicks_t nextExpiration;
-
-    /* If PAL system is busy, no need to sleep. */
-    if (PalSysIsBusy())
-    {
-        // active
-        return 0;
-    }
-
-    bool_t running;
-    nextExpiration = WsfTimerNextExpiration(&running);
-
-    if (running)
-    {
-        uint32_t awake = WSF_MS_PER_TICK * nextExpiration;
-        uint32_t elapsed = PalSysTickElapse();
-
-        /* if we have time to sleep before timer expiration */
-        if ((awake - elapsed) > WSF_TIMER_MIN_MS_FOR_POWERDOWN)
-        {
-            *sleep_ms = awake - elapsed;
-            // Power down
-            return 2;
-        }
-        else
-        {
-            /* Not enough time to go to powerdown. Let the system sleep. */
-            // Sleep
-            return 1;
-        }
-    }
-    else
-    {
-        *sleep_ms = WSF_TIMER_MAX_MS_FOR_POWERDOWN;
-        // Power down
-        return 2;
-    }
-}
-
-//*****************************************************************************
-//
-// Calculate the elapsed time, and update the WSF software timers.
-//
-//*****************************************************************************
-void WsfTimerUpdateTicks(void)
-{
-    uint32_t ui32CurrentTick, ui32ElapsedTicks;
-
-    //
-    // Read the continuous systick.
-    //
-    ui32CurrentTick = PalSysTickGet();
-
-    //
-    // Figure out how long it has been since the last time we've read the
-    // continuous systick.
-    //
-    if (ui32CurrentTick > wsfTimerSysTickcLastTick)
-    {
-        ui32ElapsedTicks = ui32CurrentTick - wsfTimerSysTickcLastTick;
-    }
-    else
-    {
-        ui32ElapsedTicks = 0xffffffff - wsfTimerSysTickcLastTick + ui32CurrentTick;
-    }
-
-    WsfTimerUpdate(ui32ElapsedTicks);
-    wsfTimerSysTickcLastTick = ui32CurrentTick;
 }

--
Gitblit v1.9.3