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/nuttx.git

commit 72bdc9d9b4fce67573b13f6636375a700dbcea71
Author: ligd <[email protected]>
AuthorDate: Wed May 29 20:15:40 2024 +0800

    armv7/8-m: change enter_critical_section to up_irq_save
    
    caused critical_monitor will gettime, that will caused
    enter_critical_seciton recursive
    
    Signed-off-by: ligd <[email protected]>
---
 arch/arm/src/armv7-m/arm_systick.c | 13 +++++++------
 arch/arm/src/armv8-m/arm_systick.c | 13 +++++++------
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/arch/arm/src/armv7-m/arm_systick.c 
b/arch/arm/src/armv7-m/arm_systick.c
index e45728c0cd..b7c706ba57 100644
--- a/arch/arm/src/armv7-m/arm_systick.c
+++ b/arch/arm/src/armv7-m/arm_systick.c
@@ -135,7 +135,7 @@ static int systick_getstatus(struct timer_lowerhalf_s 
*lower_,
                              struct timer_status_s *status)
 {
   struct systick_lowerhalf_s *lower = (struct systick_lowerhalf_s *)lower_;
-  irqstate_t flags = enter_critical_section();
+  irqstate_t flags = up_irq_save();
 
   status->flags    = lower->callback ? TCFLAGS_HANDLER : 0;
   status->flags   |= systick_is_running() ? TCFLAGS_ACTIVE : 0;
@@ -161,7 +161,7 @@ static int systick_getstatus(struct timer_lowerhalf_s 
*lower_,
       status->timeleft = status->timeout;
     }
 
-  leave_critical_section(flags);
+  up_irq_restore(flags);
   return 0;
 }
 
@@ -169,8 +169,8 @@ static int systick_settimeout(struct timer_lowerhalf_s 
*lower_,
                               uint32_t timeout)
 {
   struct systick_lowerhalf_s *lower = (struct systick_lowerhalf_s *)lower_;
+  irqstate_t flags = up_irq_save();
 
-  irqstate_t flags = enter_critical_section();
   if (lower->next_interval)
     {
       /* If the timer callback is in the process,
@@ -194,7 +194,7 @@ static int systick_settimeout(struct timer_lowerhalf_s 
*lower_,
         }
     }
 
-  leave_critical_section(flags);
+  up_irq_restore(flags);
   return 0;
 }
 
@@ -202,11 +202,12 @@ static void systick_setcallback(struct timer_lowerhalf_s 
*lower_,
                                 tccb_t callback, void *arg)
 {
   struct systick_lowerhalf_s *lower = (struct systick_lowerhalf_s *)lower_;
+  irqstate_t flags = up_irq_save();
 
-  irqstate_t flags = enter_critical_section();
   lower->callback  = callback;
   lower->arg       = arg;
-  leave_critical_section(flags);
+
+  up_irq_restore(flags);
 }
 
 static int systick_maxtimeout(struct timer_lowerhalf_s *lower_,
diff --git a/arch/arm/src/armv8-m/arm_systick.c 
b/arch/arm/src/armv8-m/arm_systick.c
index d9733aefd7..0db961a76d 100644
--- a/arch/arm/src/armv8-m/arm_systick.c
+++ b/arch/arm/src/armv8-m/arm_systick.c
@@ -135,7 +135,7 @@ static int systick_getstatus(struct timer_lowerhalf_s 
*lower_,
                              struct timer_status_s *status)
 {
   struct systick_lowerhalf_s *lower = (struct systick_lowerhalf_s *)lower_;
-  irqstate_t flags = enter_critical_section();
+  irqstate_t flags = up_irq_save();
 
   status->flags    = lower->callback ? TCFLAGS_HANDLER : 0;
   status->flags   |= systick_is_running() ? TCFLAGS_ACTIVE : 0;
@@ -161,7 +161,7 @@ static int systick_getstatus(struct timer_lowerhalf_s 
*lower_,
       status->timeleft = status->timeout;
     }
 
-  leave_critical_section(flags);
+  up_irq_restore(flags);
   return 0;
 }
 
@@ -169,8 +169,8 @@ static int systick_settimeout(struct timer_lowerhalf_s 
*lower_,
                               uint32_t timeout)
 {
   struct systick_lowerhalf_s *lower = (struct systick_lowerhalf_s *)lower_;
+  irqstate_t flags = up_irq_save();
 
-  irqstate_t flags = enter_critical_section();
   if (lower->next_interval)
     {
       /* If the timer callback is in the process,
@@ -194,7 +194,7 @@ static int systick_settimeout(struct timer_lowerhalf_s 
*lower_,
         }
     }
 
-  leave_critical_section(flags);
+  up_irq_restore(flags);
   return 0;
 }
 
@@ -202,11 +202,12 @@ static void systick_setcallback(struct timer_lowerhalf_s 
*lower_,
                                 tccb_t callback, void *arg)
 {
   struct systick_lowerhalf_s *lower = (struct systick_lowerhalf_s *)lower_;
+  irqstate_t flags = up_irq_save();
 
-  irqstate_t flags = enter_critical_section();
   lower->callback  = callback;
   lower->arg       = arg;
-  leave_critical_section(flags);
+
+  up_irq_restore(flags);
 }
 
 static int systick_maxtimeout(struct timer_lowerhalf_s *lower_,

Reply via email to