Skip to content

Commit 481011a

Browse files
committed
driver: timer: nrf: Remove redundant RTC_COUNTER reads.
This commit removes redundant reads of RTC_COUNTER register propagating optimizations made in the k_cycle_get_32() function. Signed-off-by: Piotr Zięcik <piotr.ziecik@nordicsemi.no>
1 parent 2747916 commit 481011a

File tree

1 file changed

+28
-35
lines changed

1 file changed

+28
-35
lines changed

drivers/timer/nrf_rtc_timer.c

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -266,23 +266,23 @@ u32_t _get_remaining_program_time(void)
266266

267267
u32_t _get_elapsed_program_time(void)
268268
{
269-
u32_t rtc_now, rtc_prev, rtc_elapsed;
269+
u32_t rtc_elapsed, rtc_past_copy;
270270

271271
if (!expected_sys_ticks) {
272272
return 0;
273273
}
274274

275-
rtc_now = RTC_COUNTER;
275+
/* Read rtc_past before RTC_COUNTER */
276+
rtc_past_copy = rtc_past;
276277

277-
/* Discard value of RTC_COUNTER read at LFCLK transition */
278-
do {
279-
/* Number of RTC cycles passed since last RTC Programing*/
280-
rtc_elapsed = (rtc_now - rtc_past) & RTC_MASK;
281-
rtc_prev = rtc_now;
282-
rtc_now = RTC_COUNTER;
283-
} while (rtc_prev != rtc_now);
278+
/* Make sure that compiler will not reverse access to RTC and
279+
* rtc_past.
280+
*/
281+
compiler_barrier();
284282

285-
/*Convert number of Machine cycles to SYS TICS*/
283+
rtc_elapsed = (RTC_COUNTER - rtc_past_copy) & RTC_MASK;
284+
285+
/* Convert number of Machine cycles to SYS_TICKS */
286286
return (rtc_elapsed / sys_clock_hw_cycles_per_tick);
287287
}
288288

@@ -329,22 +329,17 @@ void _set_time(u32_t time)
329329
*/
330330
s32_t _get_max_clock_time(void)
331331
{
332-
u32_t rtc_now, rtc_prev, rtc_away, sys_away = 0;
332+
u32_t rtc_away, sys_away = 0;
333333

334-
rtc_now = RTC_COUNTER;
335-
/* Discard value of RTC_COUNTER read at LFCLK transition */
336-
do {
337-
rtc_away = (RTC_MASK - rtc_now);
338-
rtc_away = rtc_away > RTC_HALF ? RTC_HALF : rtc_away;
339-
rtc_prev = rtc_now;
340-
/* Calculate time to programe into RTC*/
341-
rtc_now = RTC_COUNTER;
342-
} while (rtc_now != rtc_prev);
334+
/* Calculate time to program into RTC */
335+
rtc_away = (RTC_MASK - RTC_COUNTER);
336+
rtc_away = rtc_away > RTC_HALF ? RTC_HALF : rtc_away;
343337

344338
/* Convert RTC Ticks to SYS TICKS*/
345339
if (rtc_away >= sys_clock_hw_cycles_per_tick) {
346340
sys_away = rtc_away / sys_clock_hw_cycles_per_tick;
347341
}
342+
348343
return sys_away;
349344
}
350345

@@ -371,25 +366,23 @@ void _enable_sys_clock(void)
371366
u64_t _get_elapsed_clock_time(void)
372367
{
373368
u64_t elapsed;
374-
u32_t rtc_now, rtc_elapsed, rtc_prev, sys_elapsed;
369+
u32_t rtc_elapsed, rtc_past_copy;
375370

376-
rtc_now = RTC_COUNTER;
371+
/* Read _sys_clock_tick_count and rtc_past before RTC_COUNTER */
372+
elapsed = _sys_clock_tick_count;
373+
rtc_past_copy = rtc_past;
377374

378-
/* Discard value of RTC_COUNTER read at LFCLK transition */
379-
do {
380-
/* Calculate number of rtc cycles elapsed since RTC programing*/
381-
rtc_elapsed = (rtc_now - rtc_past) & RTC_MASK;
382-
elapsed = _sys_clock_tick_count;
383-
rtc_prev = rtc_now;
384-
rtc_now = RTC_COUNTER;
385-
} while (rtc_now != rtc_prev);
375+
/* Make sure that compiler will not reverse access to RTC and
376+
* variables above.
377+
*/
378+
compiler_barrier();
386379

380+
rtc_elapsed = (RTC_COUNTER - rtc_past_copy) & RTC_MASK;
387381
if (rtc_elapsed >= sys_clock_hw_cycles_per_tick) {
388-
/* Convert RTC cycles to SYS TICKS*/
389-
sys_elapsed = rtc_elapsed / sys_clock_hw_cycles_per_tick;
390-
/* Update total number of SYS_TICKS passed*/
391-
elapsed += sys_elapsed;
382+
/* Update total number of SYS_TICKS passed */
383+
elapsed += (rtc_elapsed / sys_clock_hw_cycles_per_tick);
392384
}
385+
393386
return elapsed;
394387
}
395388
#endif
@@ -557,7 +550,7 @@ u32_t _timer_cycle_get_32(void)
557550
ticked_cycles = _sys_clock_tick_count * sys_clock_hw_cycles_per_tick;
558551

559552
/* Make sure that compiler will not reverse access to RTC and
560-
* _sys_clock_tick_count
553+
* _sys_clock_tick_count.
561554
*/
562555
compiler_barrier();
563556

0 commit comments

Comments
 (0)