示例#1
0
/* 通过时差校准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;
			}
		}
	}
}
示例#2
0
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;
}