@@ -266,23 +266,23 @@ u32_t _get_remaining_program_time(void)
266266
267267u32_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 */
330330s32_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)
371366u64_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