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
The following commit(s) were added to refs/heads/master by this push:
new 5f77da4c517 Use small lock to protect timer related resources in arch
ARM.
5f77da4c517 is described below
commit 5f77da4c51737a15b0d5cee461a407d8c15fd574
Author: wangzhi16 <[email protected]>
AuthorDate: Mon Jan 20 11:52:51 2025 +0800
Use small lock to protect timer related resources in arch ARM.
Signed-off-by: wangzhi16 <[email protected]>
---
arch/arm/src/cxd56xx/cxd56_timer.c | 22 ++++++++++++++--------
arch/arm/src/lpc17xx_40xx/lpc17_40_timer.c | 15 +++++++++------
arch/arm/src/lpc43xx/lpc43_timer.c | 26 ++++++++++++++++----------
3 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/arch/arm/src/cxd56xx/cxd56_timer.c
b/arch/arm/src/cxd56xx/cxd56_timer.c
index 7735acba991..fb2cecf2215 100644
--- a/arch/arm/src/cxd56xx/cxd56_timer.c
+++ b/arch/arm/src/cxd56xx/cxd56_timer.c
@@ -35,8 +35,10 @@
#include <assert.h>
#include <errno.h>
#include <debug.h>
+#include <sched.h>
#include <nuttx/irq.h>
+#include <nuttx/spinlock.h>
#include <nuttx/timers/timer.h>
#include <arch/board/board.h>
#include <arch/chip/timer.h>
@@ -91,12 +93,13 @@ struct cxd56_lowerhalf_s
/* Private data */
- uint32_t base; /* Base address of the timer */
- tccb_t callback; /* Current user interrupt callback */
- void *arg; /* Argument passed to upper half callback */
- uint32_t timeout; /* The current timeout value (us) */
- uint32_t clkticks; /* actual clock ticks for current interval */
- bool started; /* The timer has been started */
+ uint32_t base; /* Base address of the timer */
+ tccb_t callback; /* Current user interrupt callback */
+ void *arg; /* Argument passed to upper half callback */
+ uint32_t timeout; /* The current timeout value (us) */
+ uint32_t clkticks; /* actual clock ticks for current interval */
+ bool started; /* The timer has been started */
+ spinlock_t lock; /* Spinlock */
};
/****************************************************************************
@@ -430,7 +433,8 @@ static void cxd56_setcallback(struct timer_lowerhalf_s
*lower,
struct cxd56_lowerhalf_s *priv = (struct cxd56_lowerhalf_s *)lower;
irqstate_t flags;
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
+ sched_lock();
DEBUGASSERT(priv);
tmrinfo("Entry: callback=%p\n", callback);
@@ -440,7 +444,8 @@ static void cxd56_setcallback(struct timer_lowerhalf_s
*lower,
priv->callback = callback;
priv->arg = arg;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
+ sched_unlock();
}
/****************************************************************************
@@ -559,6 +564,7 @@ void cxd56_timer_initialize(const char *devpath, int timer)
}
priv->ops = &g_tmrops;
+ spin_lock_init(&priv->lock);
irq_attach(irq, cxd56_timer_interrupt, priv);
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_timer.c
b/arch/arm/src/lpc17xx_40xx/lpc17_40_timer.c
index 6331bda03e6..8900ac0eb22 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_timer.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_timer.c
@@ -33,6 +33,7 @@
#include <debug.h>
#include <nuttx/irq.h>
+#include <nuttx/spinlock.h>
#include <nuttx/arch.h>
#include <nuttx/timers/pwm.h>
#include <arch/board/board.h>
@@ -91,6 +92,7 @@ struct lpc17_40_timer_s
uint32_t pincfg; /* Output pin configuration */
uint32_t pclk; /* The frequency of the peripheral clock
* that drives the timer module. */
+ spinlock_t lock; /* Spinlock */
};
/****************************************************************************
@@ -154,6 +156,7 @@ static struct lpc17_40_timer_s g_pwm1dev =
.base = LPC17_40_TMR1_BASE,
.pincfg = GPIO_MAT0p1_2,
.pclk = (0x1 << 12),
+ .lock = SP_UNLOCKED,
};
#endif
@@ -266,7 +269,7 @@ static int timer_timer(struct lpc17_40_timer_s *priv,
irqstate_t flags;
uint32_t regval;
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
putreg32(info->frequency, LPC17_40_TMR0_MR1); /* Set TIMER0 MR1 = number of
counts */
putreg32(info->frequency, LPC17_40_TMR1_MR0); /* Set TIMER1 MR0 = number of
counts */
@@ -274,7 +277,7 @@ static int timer_timer(struct lpc17_40_timer_s *priv,
putreg32(1, LPC17_40_TMR0_TCR); /* Start timer0 */
putreg32(1, LPC17_40_TMR1_TCR); /* Start timer1 */
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
timer_dumpregs(priv, "After starting");
return OK;
}
@@ -361,7 +364,7 @@ static int timer_setup(struct pwm_lowerhalf_s *dev)
irqstate_t flags;
uint32_t regval;
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
/* Power on the timer peripherals */
@@ -423,7 +426,7 @@ static int timer_setup(struct pwm_lowerhalf_s *dev)
/* lpc17_40_configgpio(GPIO_MAT0p1_2); */
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
pwm_dumpgpio(priv->pincfg, "TIMER setup");
return OK;
}
@@ -511,7 +514,7 @@ static int timer_stop(struct pwm_lowerhalf_s *dev)
* to prevent any concurrent access to the reset register.
*/
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
/* Disable further interrupts and stop the timer */
@@ -529,7 +532,7 @@ static int timer_stop(struct pwm_lowerhalf_s *dev)
* into a state where timer_start() can be called.
*/
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
pwminfo("regaddr: %08x resetbit: %08x\n", regaddr, resetbit);
timer_dumpregs(priv, "After stop");
diff --git a/arch/arm/src/lpc43xx/lpc43_timer.c
b/arch/arm/src/lpc43xx/lpc43_timer.c
index aa93024801b..fa16bd2c754 100644
--- a/arch/arm/src/lpc43xx/lpc43_timer.c
+++ b/arch/arm/src/lpc43xx/lpc43_timer.c
@@ -34,8 +34,10 @@
#include <assert.h>
#include <errno.h>
#include <debug.h>
+#include <sched.h>
#include <nuttx/irq.h>
+#include <nuttx/spinlock.h>
#include <nuttx/timers/timer.h>
#include <arch/board/board.h>
@@ -78,14 +80,15 @@ struct lpc43_lowerhalf_s
/* Private data */
- uint32_t base; /* Base address of the timer */
- tccb_t callback; /* Current user interrupt callback */
- void *arg; /* Argument passed to the callback function */
- uint32_t timeout; /* The current timeout value (us) */
- uint32_t adjustment; /* time lost due to clock resolution truncation (us) */
- uint32_t clkticks; /* actual clock ticks for current interval */
- bool started; /* The timer has been started */
- uint16_t tmrid; /* Timer id */
+ uint32_t base; /* Base address of the timer */
+ tccb_t callback; /* Current user interrupt callback */
+ void *arg; /* Argument passed to the callback function */
+ uint32_t timeout; /* The current timeout value (us) */
+ uint32_t adjustment; /* time lost due to clock resolution truncation (us)
*/
+ uint32_t clkticks; /* actual clock ticks for current interval */
+ bool started; /* The timer has been started */
+ uint16_t tmrid; /* Timer id */
+ spinlock_t lock; /* Spinlock */
};
/****************************************************************************
@@ -632,7 +635,8 @@ static void lpc43_setcallback(struct timer_lowerhalf_s
*lower,
struct lpc43_lowerhalf_s *priv = (struct lpc43_lowerhalf_s *)lower;
irqstate_t flags;
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&priv->lock);
+ sched_lock();
DEBUGASSERT(priv);
tmrinfo("Entry: callback=%p\n", callback);
@@ -642,7 +646,8 @@ static void lpc43_setcallback(struct timer_lowerhalf_s
*lower,
priv->callback = callback;
priv->arg = arg;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&priv->lock, flags);
+ sched_unlock();
}
/****************************************************************************
@@ -749,6 +754,7 @@ void lpc43_tmrinitialize(const char *devpath, int irq)
}
priv->ops = &g_tmrops;
+ spin_lock_init(&priv->lock);
irq_attach(irq, lpc43_interrupt, NULL);