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

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

commit 017df835ba42dd0a4a189244aee825197e178dcc
Author: fangpeina <[email protected]>
AuthorDate: Fri Jun 13 16:35:38 2025 +0800

    drivers/motor: use small lock to replace enter_critical_section
    
    replace critical_section with spinlock, and use atomic to
    protect state.
    
    Signed-off-by: fangpeina <[email protected]>
---
 drivers/motor/foc/foc_dummy.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/motor/foc/foc_dummy.c b/drivers/motor/foc/foc_dummy.c
index 69416fbbd1e..da05cae9857 100644
--- a/drivers/motor/foc/foc_dummy.c
+++ b/drivers/motor/foc/foc_dummy.c
@@ -33,6 +33,8 @@
 #include <assert.h>
 #include <debug.h>
 
+#include <nuttx/atomic.h>
+#include <nuttx/spinlock.h>
 #include <nuttx/motor/foc/foc_dummy.h>
 #include <nuttx/motor/foc/foc_lower.h>
 
@@ -92,7 +94,7 @@ struct foc_dummy_data_s
 
   /* FOC worker loop helpers */
 
-  bool     state;
+  atomic_t state;
   uint32_t notifier_cntr;
   uint32_t pwm_freq;
   uint32_t notifier_freq;
@@ -172,6 +174,8 @@ static struct foc_lower_s 
g_foc_dummy_lower[CONFIG_MOTOR_FOC_INST];
 
 static struct foc_dev_s g_foc_dev[CONFIG_MOTOR_FOC_INST];
 
+static spinlock_t g_foc_lock = SP_UNLOCKED;
+
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
@@ -213,7 +217,6 @@ static int foc_dummy_pwm_setup(FAR struct foc_dev_s *dev, 
uint32_t freq)
 static int foc_dummy_start(FAR struct foc_dev_s *dev, bool state)
 {
   FAR struct foc_dummy_data_s *sim = FOC_DUMMY_DATA_FROM_DEV_GET(dev);
-  irqstate_t                   flags;
   int                          ret = OK;
 
   mtrinfo("[FOC_START] state=%d\n", state);
@@ -238,9 +241,7 @@ static int foc_dummy_start(FAR struct foc_dev_s *dev, bool 
state)
 
   /* Store FOC worker state */
 
-  flags = enter_critical_section();
-  sim->state = state;
-  leave_critical_section(flags);
+  atomic_set(&sim->state, state);
 
 errout:
   return ret;
@@ -686,7 +687,7 @@ void foc_dummy_update(void)
   int                          i    = 0;
   irqstate_t                   flags;
 
-  flags = enter_critical_section();
+  flags = spin_lock_irqsave_nopreempt(&g_foc_lock);
 
   /* Update all FOC instances */
 
@@ -704,12 +705,12 @@ void foc_dummy_update(void)
 
           sim = FOC_DUMMY_DATA_FROM_DEV_GET(dev);
 
-          if (sim->state == true)
+          if (atomic_read(&sim->state))
             {
               foc_dummy_notifier_handler(dev);
             }
         }
     }
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore_nopreempt(&g_foc_lock, flags);
 }

Reply via email to