/****************************************************************************** * 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);