This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit e64390d5e96a7e5100e27ef4e2a01e92bb53a6aa
Author: Abdelatif Guettouche <[email protected]>
AuthorDate: Thu Sep 9 12:03:06 2021 +0200

    esp32_rt_timer.c: Use device specific locks.
    
    Signed-off-by: Abdelatif Guettouche <[email protected]>
---
 arch/xtensa/src/esp32/esp32_rt_timer.c | 44 ++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/arch/xtensa/src/esp32/esp32_rt_timer.c 
b/arch/xtensa/src/esp32/esp32_rt_timer.c
index 9c8988d..d9c95f6 100644
--- a/arch/xtensa/src/esp32/esp32_rt_timer.c
+++ b/arch/xtensa/src/esp32/esp32_rt_timer.c
@@ -37,6 +37,7 @@
 #include <nuttx/kthread.h>
 #include <nuttx/kmalloc.h>
 #include <nuttx/semaphore.h>
+#include <nuttx/spinlock.h>
 
 #include "hardware/esp32_soc.h"
 #include "esp32_tim.h"
@@ -70,6 +71,7 @@ static sem_t s_toutsem;
 static struct list_node s_runlist;
 static struct list_node s_toutlist;
 
+static spinlock_t g_lock;
 static struct esp32_tim_dev_s *s_esp32_tim_dev;
 
 /****************************************************************************
@@ -103,7 +105,7 @@ static void start_rt_timer(struct rt_timer_s *timer,
   uint64_t counter;
   struct esp32_tim_dev_s *tim = s_esp32_tim_dev;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
 
   /* Only idle timer can be started */
 
@@ -160,7 +162,7 @@ static void start_rt_timer(struct rt_timer_s *timer,
         }
     }
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_lock, flags);
 }
 
 /****************************************************************************
@@ -186,7 +188,7 @@ static void stop_rt_timer(struct rt_timer_s *timer)
   uint64_t alarm;
   struct esp32_tim_dev_s *tim = s_esp32_tim_dev;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
 
   /* "start" function can set the timer's repeat flag, and function "stop"
    * should remove this flag.
@@ -233,7 +235,7 @@ static void stop_rt_timer(struct rt_timer_s *timer)
         }
     }
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_lock, flags);
 }
 
 /****************************************************************************
@@ -256,7 +258,7 @@ static void delete_rt_timer(struct rt_timer_s *timer)
 {
   irqstate_t flags;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
 
   if (timer->state == RT_TIMER_READY)
     {
@@ -275,7 +277,7 @@ static void delete_rt_timer(struct rt_timer_s *timer)
   timer->state = RT_TIMER_DELETE;
 
 exit:
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_lock, flags);
 }
 
 /****************************************************************************
@@ -312,7 +314,7 @@ static int rt_timer_thread(int argc, char *argv[])
           assert(0);
         }
 
-      flags = enter_critical_section();
+      flags = spin_lock_irqsave(&g_lock);
 
       /* Process all the timers in the list */
 
@@ -334,7 +336,7 @@ static int rt_timer_thread(int argc, char *argv[])
 
           timer->state = RT_TIMER_IDLE;
 
-          leave_critical_section(flags);
+          spin_unlock_irqrestore(&g_lock, flags);
 
           if (raw_state == RT_TIMER_TIMEOUT)
             {
@@ -347,7 +349,7 @@ static int rt_timer_thread(int argc, char *argv[])
 
           /* Enter critical section for next scanning list */
 
-          flags = enter_critical_section();
+          flags = spin_lock_irqsave(&g_lock);
 
           if (raw_state == RT_TIMER_TIMEOUT)
             {
@@ -360,7 +362,7 @@ static int rt_timer_thread(int argc, char *argv[])
             }
         }
 
-      leave_critical_section(flags);
+      spin_unlock_irqrestore(&g_lock, flags);
     }
 
   return 0;
@@ -398,7 +400,7 @@ static int rt_timer_isr(int irq, void *context, void *arg)
 
   nxsem_post(&s_toutsem);
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
 
   /* Check if there is a timer running */
 
@@ -440,7 +442,7 @@ static int rt_timer_isr(int irq, void *context, void *arg)
         }
     }
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_lock, flags);
 
   return 0;
 }
@@ -595,7 +597,7 @@ uint64_t IRAM_ATTR rt_timer_get_alarm(void)
   struct esp32_tim_dev_s *tim = s_esp32_tim_dev;
   uint64_t alarm_value = 0;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
 
   ESP32_TIM_GETCTR(tim, &counter);
   ESP32_TIM_GETALRVL(tim, &alarm_value);
@@ -609,7 +611,7 @@ uint64_t IRAM_ATTR rt_timer_get_alarm(void)
       alarm_value -= counter;
     }
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_lock, flags);
 
   return alarm_value;
 }
@@ -634,12 +636,14 @@ void IRAM_ATTR rt_timer_calibration(uint64_t time_us)
   struct esp32_tim_dev_s *tim = s_esp32_tim_dev;
   irqstate_t flags;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
+
   ESP32_TIM_GETCTR(tim, &counter);
   counter += time_us;
   ESP32_TIM_SETCTR(tim, counter);
   ESP32_TIM_RLD_NOW(tim);
-  leave_critical_section(flags);
+
+  spin_unlock_irqrestore(&g_lock, flags);
 }
 
 /****************************************************************************
@@ -689,7 +693,7 @@ int esp32_rt_timer_init(void)
   s_esp32_tim_dev = tim;
   s_pid = pid;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
 
   /* ESP32 hardware timer configuration:
    *   - 1 counter = 1us
@@ -707,7 +711,7 @@ int esp32_rt_timer_init(void)
 
   ESP32_TIM_START(tim);
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_lock, flags);
 
   return 0;
 }
@@ -730,13 +734,13 @@ void esp32_rt_timer_deinit(void)
 {
   irqstate_t flags;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave(&g_lock);
 
   ESP32_TIM_STOP(s_esp32_tim_dev);
   esp32_tim_deinit(s_esp32_tim_dev);
   s_esp32_tim_dev = NULL;
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_lock, flags);
 
   kthread_delete(s_pid);
   nxsem_destroy(&s_toutsem);

Reply via email to