Skip to content

Commit 59a849a

Browse files
hujun260xiaoxiang781216
authored andcommitted
esp_rtc: use small lock in arch/risc-v/src/common/espressif/esp_rtc.c
reason: We would like to replace the big lock with a small lock. Signed-off-by: hujun5 <[email protected]>
1 parent 48c4391 commit 59a849a

File tree

3 files changed

+48
-36
lines changed

3 files changed

+48
-36
lines changed

arch/risc-v/src/common/espressif/esp_hr_timer.c

+14-15
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ void IRAM_ATTR esp_hr_timer_start(struct esp_hr_timer_s *timer,
369369

370370
if (timer->state != HR_TIMER_IDLE)
371371
{
372-
esp_hr_timer_stop(timer);
372+
esp_hr_timer_stop_nolock(timer);
373373
}
374374

375375
/* Calculate the timer's alarm value */
@@ -481,12 +481,10 @@ void esp_hr_timer_start_periodic(struct esp_hr_timer_s *timer,
481481
*
482482
****************************************************************************/
483483

484-
void IRAM_ATTR esp_hr_timer_stop(struct esp_hr_timer_s *timer)
484+
void IRAM_ATTR esp_hr_timer_stop_nolock(struct esp_hr_timer_s *timer)
485485
{
486486
struct esp_hr_timer_context_s *priv = &g_hr_timer_context;
487487

488-
irqstate_t flags = spin_lock_irqsave(&priv->lock);
489-
490488
/* "start" function can set the timer's repeat flag, and "stop" function
491489
* should remove this flag.
492490
*/
@@ -546,14 +544,16 @@ void IRAM_ATTR esp_hr_timer_stop(struct esp_hr_timer_s *timer)
546544

547545
list_delete(&timer->list);
548546
timer->state = HR_TIMER_IDLE;
549-
550-
spin_unlock_irqrestore(&priv->lock, flags);
551-
552547
timer->callback(timer->arg);
553-
554-
flags = spin_lock_irqsave(&priv->lock);
555548
}
549+
}
550+
551+
void IRAM_ATTR esp_hr_timer_stop(struct esp_hr_timer_s *timer)
552+
{
553+
struct esp_hr_timer_context_s *priv = &g_hr_timer_context;
556554

555+
irqstate_t flags = spin_lock_irqsave(&priv->lock);
556+
esp_hr_timer_stop_nolock(timer);
557557
spin_unlock_irqrestore(&priv->lock, flags);
558558
}
559559

@@ -578,23 +578,25 @@ void esp_hr_timer_delete(struct esp_hr_timer_s *timer)
578578

579579
struct esp_hr_timer_context_s *priv = &g_hr_timer_context;
580580

581-
flags = enter_critical_section();
581+
flags = spin_lock_irqsave(&priv->lock);
582582

583583
if (timer->state == HR_TIMER_READY)
584584
{
585-
esp_hr_timer_stop(timer);
585+
esp_hr_timer_stop_nolock(timer);
586586
}
587587
else if (timer->state == HR_TIMER_TIMEOUT)
588588
{
589589
list_delete(&timer->list);
590590
}
591591
else if (timer->state == HR_TIMER_DELETE)
592592
{
593-
goto exit;
593+
spin_unlock_irqrestore(&priv->lock, flags);
594+
return;
594595
}
595596

596597
list_add_after(&priv->toutlist, &timer->list);
597598
timer->state = HR_TIMER_DELETE;
599+
spin_unlock_irqrestore(&priv->lock, flags);
598600

599601
/* Wake up the thread to process deleted timers */
600602

@@ -603,9 +605,6 @@ void esp_hr_timer_delete(struct esp_hr_timer_s *timer)
603605
{
604606
tmrerr("Failed to post sem ret=%d\n", ret);
605607
}
606-
607-
exit:
608-
leave_critical_section(flags);
609608
}
610609

611610
/****************************************************************************

arch/risc-v/src/common/espressif/esp_hr_timer.h

+1
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ void esp_hr_timer_start_periodic(struct esp_hr_timer_s *timer,
181181
****************************************************************************/
182182

183183
void esp_hr_timer_stop(struct esp_hr_timer_s *timer);
184+
void esp_hr_timer_stop_nolock(struct esp_hr_timer_s *timer);
184185

185186
/****************************************************************************
186187
* Name: esp_hr_timer_delete

arch/risc-v/src/common/espressif/esp_rtc.c

+33-21
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ struct esp_rtc_lowerhalf_s
102102

103103
struct alm_cbinfo_s alarmcb[CONFIG_RTC_NALARMS];
104104
#endif /* CONFIG_RTC_ALARM */
105+
106+
spinlock_t lock;
105107
};
106108

107109
#endif/* CONFIG_RTC_DRIVER */
@@ -420,13 +422,12 @@ static bool esp_rtc_havesettime(struct rtc_lowerhalf_s *lower)
420422
****************************************************************************/
421423

422424
#if defined(CONFIG_RTC_DRIVER) && defined(CONFIG_RTC_ALARM)
423-
static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
424-
const struct lower_setalarm_s *alarminfo)
425+
static int esp_rtc_setalarm_nolock(struct rtc_lowerhalf_s *lower,
426+
const struct lower_setalarm_s *alarminfo)
425427
{
426428
struct esp_rtc_lowerhalf_s *priv = (struct esp_rtc_lowerhalf_s *)lower;
427429
struct alm_cbinfo_s *cbinfo;
428430
uint64_t timeout;
429-
irqstate_t flags;
430431
int id;
431432

432433
DEBUGASSERT(priv != NULL);
@@ -446,8 +447,6 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
446447

447448
/* Create the RT-Timer alarm */
448449

449-
flags = spin_lock_irqsave(NULL);
450-
451450
if (cbinfo->alarm_hdl == NULL)
452451
{
453452
struct esp_hr_timer_args_s hr_timer_args;
@@ -461,7 +460,6 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
461460
if (ret < 0)
462461
{
463462
rtcerr("Failed to create HR Timer=%d\n", ret);
464-
spin_unlock_irqrestore(NULL, flags);
465463
return ret;
466464
}
467465
}
@@ -474,10 +472,22 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
474472

475473
esp_hr_timer_start(cbinfo->alarm_hdl, cbinfo->deadline_us, false);
476474

477-
spin_unlock_irqrestore(NULL, flags);
478-
479475
return OK;
480476
}
477+
478+
static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
479+
const struct lower_setalarm_s *alarminfo)
480+
{
481+
struct esp_rtc_lowerhalf_s *priv = (struct esp_rtc_lowerhalf_s *)lower;
482+
irqstate_t flags;
483+
int ret;
484+
485+
flags = spin_lock_irqsave(&priv->lock);
486+
ret = esp_rtc_setalarm_nolock(lower, alarminfo);
487+
spin_unlock_irqrestore(&priv->lock, flags);
488+
489+
return ret;
490+
}
481491
#endif /* CONFIG_RTC_DRIVER && CONFIG_RTC_ALARM */
482492

483493
/****************************************************************************
@@ -501,6 +511,7 @@ static int esp_rtc_setalarm(struct rtc_lowerhalf_s *lower,
501511
static int esp_rtc_setrelative(struct rtc_lowerhalf_s *lower,
502512
const struct lower_setrelative_s *alarminfo)
503513
{
514+
struct esp_rtc_lowerhalf_s *priv = (struct esp_rtc_lowerhalf_s *)lower;
504515
struct lower_setalarm_s setalarm;
505516
time_t seconds;
506517
int ret = -EINVAL;
@@ -510,7 +521,7 @@ static int esp_rtc_setrelative(struct rtc_lowerhalf_s *lower,
510521

511522
if (alarminfo->reltime > 0)
512523
{
513-
flags = spin_lock_irqsave(NULL);
524+
flags = spin_lock_irqsave(&priv->lock);
514525

515526
seconds = alarminfo->reltime;
516527
gmtime_r(&seconds, (struct tm *)&setalarm.time);
@@ -520,9 +531,9 @@ static int esp_rtc_setrelative(struct rtc_lowerhalf_s *lower,
520531
setalarm.id = alarminfo->id;
521532
setalarm.cb = alarminfo->cb;
522533
setalarm.priv = alarminfo->priv;
523-
ret = esp_rtc_setalarm(lower, &setalarm);
534+
ret = esp_rtc_setalarm_nolock(lower, &setalarm);
524535

525-
spin_unlock_irqrestore(NULL, flags);
536+
spin_unlock_irqrestore(&priv->lock, flags);
526537
}
527538

528539
return ret;
@@ -566,7 +577,7 @@ static int esp_rtc_cancelalarm(struct rtc_lowerhalf_s *lower, int alarmid)
566577
return -ENODATA;
567578
}
568579

569-
flags = spin_lock_irqsave(NULL);
580+
flags = spin_lock_irqsave(&priv->lock);
570581

571582
/* Stop and delete the alarm */
572583

@@ -579,7 +590,7 @@ static int esp_rtc_cancelalarm(struct rtc_lowerhalf_s *lower, int alarmid)
579590
cbinfo->deadline_us = 0;
580591
cbinfo->alarm_hdl = NULL;
581592

582-
spin_unlock_irqrestore(NULL, flags);
593+
spin_unlock_irqrestore(&priv->lock, flags);
583594

584595
return OK;
585596
}
@@ -616,7 +627,7 @@ static int esp_rtc_rdalarm(struct rtc_lowerhalf_s *lower,
616627

617628
priv = (struct esp_rtc_lowerhalf_s *)lower;
618629

619-
flags = spin_lock_irqsave(NULL);
630+
flags = spin_lock_irqsave(&priv->lock);
620631

621632
/* Get the alarm according to the alarm ID */
622633

@@ -630,7 +641,7 @@ static int esp_rtc_rdalarm(struct rtc_lowerhalf_s *lower,
630641
localtime_r((const time_t *)&ts.tv_sec,
631642
(struct tm *)alarminfo->time);
632643

633-
spin_unlock_irqrestore(NULL, flags);
644+
spin_unlock_irqrestore(&priv->lock, flags);
634645

635646
return OK;
636647
}
@@ -664,7 +675,7 @@ time_t up_rtc_time(void)
664675
uint64_t time_us;
665676
irqstate_t flags;
666677

667-
flags = spin_lock_irqsave(NULL);
678+
flags = spin_lock_irqsave(&g_rtc_lowerhalf.lock);
668679

669680
#ifdef CONFIG_RTC_DRIVER
670681
/* NOTE: HR-Timer starts to work after the board is initialized, and the
@@ -694,7 +705,7 @@ time_t up_rtc_time(void)
694705
time_us = esp_rtc_get_time_us() + esp_rtc_get_boot_time();
695706
}
696707

697-
spin_unlock_irqrestore(NULL, flags);
708+
spin_unlock_irqrestore(&g_rtc_lowerhalf.lock, flags);
698709

699710
return (time_t)(time_us / USEC_PER_SEC);
700711
}
@@ -723,7 +734,7 @@ int up_rtc_gettime(struct timespec *tp)
723734
irqstate_t flags;
724735
uint64_t time_us;
725736

726-
flags = spin_lock_irqsave(NULL);
737+
flags = spin_lock_irqsave(&g_rtc_lowerhalf.lock);
727738

728739
#ifdef CONFIG_RTC_DRIVER
729740
if (g_hr_timer_enabled)
@@ -740,7 +751,7 @@ int up_rtc_gettime(struct timespec *tp)
740751
tp->tv_sec = time_us / USEC_PER_SEC;
741752
tp->tv_nsec = (time_us % USEC_PER_SEC) * NSEC_PER_USEC;
742753

743-
spin_unlock_irqrestore(NULL, flags);
754+
spin_unlock_irqrestore(&g_rtc_lowerhalf.lock, flags);
744755

745756
return OK;
746757
}
@@ -770,7 +781,7 @@ int up_rtc_settime(const struct timespec *ts)
770781

771782
DEBUGASSERT(ts != NULL && ts->tv_nsec < NSEC_PER_SEC);
772783

773-
flags = spin_lock_irqsave(NULL);
784+
flags = spin_lock_irqsave(&g_rtc_lowerhalf.lock);
774785

775786
now_us = ((uint64_t) ts->tv_sec) * USEC_PER_SEC +
776787
ts->tv_nsec / NSEC_PER_USEC;
@@ -794,7 +805,7 @@ int up_rtc_settime(const struct timespec *ts)
794805

795806
esp_rtc_set_boot_time(rtc_offset_us);
796807

797-
spin_unlock_irqrestore(NULL, flags);
808+
spin_unlock_irqrestore(&g_rtc_lowerhalf.lock, flags);
798809

799810
return OK;
800811
}
@@ -873,6 +884,7 @@ int esp_rtc_driverinit(void)
873884
return ret;
874885
}
875886

887+
spin_lock_init(&g_rtc_lowerhalf.lock);
876888
g_hr_timer_enabled = true;
877889

878890
/* Get the time difference between HR Timer and RTC */

0 commit comments

Comments
 (0)