Exemple #1
0
/******************************************************************************
 *                                 Global Functions                           *
 ******************************************************************************/
void *task_test_main(void *arg)
{
    u32 random;
    etos_tick tick_cur;
    u32 sleep_s = (u32)arg;
    etos_tick tick_begin = etos_sched_get_tick();

    xlogt(LOG_MODULE_T_TASK, "TEST%d: enter tick:%u\r\n", sleep_s, tick_begin);
    xlogt(LOG_MODULE_T_TASK, "irq:0x%x\r\n", os_get_cpu_intr_enabled());

    while (1) {
        random = etos_random_sys_get() % 200;
        random += (sleep_s * 1000);
        xlogt(LOG_MODULE_T_TASK, "TEST%d: sleep:%u ms\r\n", sleep_s, random);
        etos_sleep_ms(random);
        xlogt(LOG_MODULE_T_TASK, "TEST%d: wakeup: 0x%x\r\n", sleep_s, os_get_cpu_intr_enabled());
        if (sleep_s & 1){
            count_to_delay(0x30a025);
        }
        tick_cur = etos_sched_get_tick();
        if (tick_to_ms(tick_cur - tick_begin) > (1000 * 50)) {
            break;
        }
        xlogt(LOG_MODULE_T_TASK, "TEST%d: irq: 0x%x\r\n", sleep_s, os_get_cpu_intr_enabled());
    }

    xlogt(LOG_MODULE_T_TASK, "TEST%d: exit tick:%u\r\n", sleep_s, tick_cur);

    return (void *)0;
}
static uint64_t time_delta_ms(void){
	uint64_t abs_now = mach_absolute_time();
	uint64_t cnt_now = mach_continuous_time();;
	return tick_to_ms(cnt_now) - tick_to_ms(abs_now);
}
	T_ASSERT_POSIX_ZERO(kevent64(kq, &change, 1, NULL, 0, 0, NULL), NULL);

	uint64_t abs_then = mach_absolute_time();
	uint64_t cnt_then = mach_continuous_time();;

	trigger_sleep(1);
	int sleep_secs = wait_for_sleep();

	struct kevent64_s event = {0};
	T_WITH_ERRNO; T_ASSERT_EQ(kevent64(kq, NULL, 0, &event, 1, 0, NULL), 1, "kevent() should have returned one event");
	T_LOG("event = {.ident = %llx, .filter = %d, .flags = %d, .fflags = %d, .data = %lld, .udata = %lld}", event.ident, event.filter, event.flags, event.fflags, event.data, event.udata);
	T_ASSERT_EQ(event.flags & EV_ERROR, 0, "event should not have EV_ERROR set: %s", event.flags & EV_ERROR ? strerror((int)event.data) : "no error");

	uint64_t abs_now = mach_absolute_time();
	uint64_t cnt_now = mach_continuous_time();;
	uint64_t ct_ms_progressed = tick_to_ms(cnt_now - cnt_then);
	uint64_t ab_ms_progressed = tick_to_ms(abs_now - abs_then);

	T_LOG("ct progressed %llu ms, abs progressed %llu ms", ct_ms_progressed, tick_to_ms(abs_now - abs_then));

	if (run_sleep_tests) {
		T_ASSERT_GT(llabs((int64_t)ct_ms_progressed - (int64_t)ab_ms_progressed), 500LL, "should have > 500ms difference between MCT and MAT");
	} else {
		T_ASSERT_LT(llabs((int64_t)ct_ms_progressed - (int64_t)ab_ms_progressed), 10LL, "should have < 10ms difference between MCT and MAT");
	}

	if (sleep_secs < 4) {
		T_ASSERT_LT(llabs((int64_t)ct_ms_progressed - 4000), 100LL, "mach_continuous_time should progress ~4 seconds (+/- 100ms) between sleeps");
	}

	sleep(1);