/* 通过时差校准rtc */ void cali_rtc_by_sec(int diff_sec_per_month) { int Deviation = 0; int i,diff; if((diff_sec_per_month > 314) || (diff_sec_per_month < 0)) { printf_syn("give different sec per month value error, diff_sec_per_month:%d\n",diff_sec_per_month); return; } diff = 100; for (i=0; i<sizeof(rtc_secinmonth); ++i) { Deviation = sub_abs(diff_sec_per_month,rtc_secinmonth[i]); if (Deviation < diff) { diff = Deviation; if ((0 == Deviation) || (1 == Deviation)) { set_rtc_cali_param(i); if (rt_rtc_control != rtc.control) { rtc.control(&rtc, RT_DEVICE_CTRL_RTC_CALI_SET, NULL); } else { rt_kprintf("no rtc device fail\n"); } //BKP_SetRTCCalibrationValue(i); break; } } } }
int ticketepfl_mutex_lock(ticketepfl_mutex_t *impl, ticketepfl_context_t *UNUSED(me)) { // Acquire the local lock uint32_t my_ticket = __sync_add_and_fetch(&impl->u.s.request, 1); uint32_t wait = TICKET_BASE_WAIT; uint32_t distance_prev = 1; while (1) { PREFETCHW(&impl->u.u); uint32_t cur = impl->u.s.grant; if (cur == my_ticket) { break; } uint32_t distance = sub_abs(cur, my_ticket); if (distance > 1) { if (distance != distance_prev) { distance_prev = distance; wait = TICKET_BASE_WAIT; } nop_rep(distance * wait); /* wait = (wait + TICKET_BASE_WAIT) & TICKET_MAX_WAIT; */ } else { nop_rep(TICKET_WAIT_NEXT); } if (distance > 20) { sched_yield(); /* pthread_yield(); */ } } #if COND_VAR int ret = REAL(pthread_mutex_lock)(&impl->posix_lock); assert(ret == 0); #endif return 0; }