/** * Start periodic timer. * * @param period_in_micro_secs */ void ac_start_periodic_timer(ac_u32 period_in_micro_secs) { // Register our handler and iacs ac_exception_irq_register(&periodic_handler, &periodic_iacs, (ac_uptr)&periodic_param); // Start the timer ac_timer_periodic(periodic_param.timer, period_in_micro_secs); }
int main(void) { ac_bool error = AC_FALSE; #if defined(Posix) ac_printf("test_ac_timer: no tests for Posix\n"); #elif defined(VersatilePB) ac_u32 result; //ac_printf("test_ac_timer: initial routes=0x%x enable=0x%x\n", // ac_interrupts_rd_int_routes(), ac_interrupts_rd_int_enable()); // Set to route to irq then fiq ac_interrupts_int_route_to_irq(PIC_ALL); error |= AC_TEST(ac_interrupts_rd_int_routes() == 0); ac_interrupts_int_route_to_fiq(PIC_ALL); error |= AC_TEST(ac_interrupts_rd_int_routes() == 0xFFFFFFFF); // Set interrupts disable then enabled ac_interrupts_int_disable(PIC_ALL); error |= AC_TEST(ac_interrupts_rd_int_enable() == 0); ac_interrupts_int_enable(PIC_ALL); error |= AC_TEST(ac_interrupts_rd_int_enable() == 0xFFFFFFFF); // Back to route to irq and no interrupts ac_interrupts_int_route_to_irq(PIC_ALL); error |= AC_TEST(ac_interrupts_rd_int_routes() == 0); ac_interrupts_int_disable(PIC_ALL); error |= AC_TEST(ac_interrupts_rd_int_enable() == 0); // Expect 4 timers ac_u32 count = ac_timer_get_count(); error |= AC_TEST(count == 4); ac_printf("test_ac_timer: count=%u\n", count); /* Loop through all of the timers printing the registers */ for (ac_u32 i = 0; i < count; i++) { ac_u32 value = ac_timer_rd_value(i); ac_u32 load = ac_timer_rd_load(i); ac_u32 control = ac_timer_rd_control(i); ac_u32 ris = ac_timer_rd_ris(i); ac_u32 mis = ac_timer_rd_mis(i); ac_u32 bgload = ac_timer_rd_bgload(i); ac_printf("test_ac_timer: value=%u\n", value); ac_printf("test_ac_timer: load=0x%x\n", load); ac_printf("test_ac_timer: control=0x%x\n", control); ac_printf("test_ac_timer: ris=0x%x\n", ris); ac_printf("test_ac_timer: mis=0x%x\n", mis); ac_printf("test_ac_timer: bgload=0x%x\n", bgload); } ac_u32 cur_value = 0; ac_timer_free_running(3); for (ac_u32 i = 0; i < 10; i++) { cur_value = ac_timer_rd_free_running(3); ac_printf("test_ac_timer: new free_running_value=%u\n", cur_value); } irq_param one_shot_param = { .timer = 2, .source = AC_FALSE, }; cur_value = 1; one_shot_counter = cur_value; ac_u32 prev_value = cur_value; ac_u32 terminal_value = cur_value + 1; ac_printf("test_ac_timer: one_shot_counter is %u\n", cur_value); result = ac_exception_irq_register(&one_shot_handler, &one_shot_iacs, (ac_uptr)&one_shot_param); error |= AC_TEST(result == 0); ac_timer_one_shot(one_shot_param.timer, 1000); for (ac_u32 i = 0; i < 10000 && cur_value != terminal_value; i++) { ac_u32 timer_value = ac_timer_rd_value(0); ac_u32 timer_ris = ac_timer_rd_ris(0); ac_u32 timer_mis = ac_timer_rd_mis(0); ac_u32 timer_control = ac_timer_rd_control(0); ac_printf("test_ac_timer: new value=%u timer_ris=0x%x" " timer_mis=0x%x timer_control=0x%x\n", timer_value, timer_ris, timer_mis, timer_control); ac_u32 irq_status = ac_interrupts_rd_irq_status(); ac_u32 fiq_status = ac_interrupts_rd_fiq_status(); ac_u32 ris_status = ac_interrupts_rd_ris_status(); ac_u32 int_routes = ac_interrupts_rd_int_routes(); ac_u32 int_enable = ac_interrupts_rd_int_enable(); ac_printf("test_ac_timer: irq_status=0x%x fiq_status=0x%x" " ris_status=0x%x\n", irq_status, fiq_status, ris_status); ac_printf("test_ac_timer: int_routes=0x%x int_enable=0x%x\n", int_routes, int_enable); cur_value = __atomic_load_n(&one_shot_counter, __ATOMIC_ACQUIRE); if (cur_value != prev_value) { prev_value = cur_value; ac_printf("test_ac_timer: one_shot_counter changed to %u\n", cur_value); } } error |= AC_TEST(one_shot_counter == terminal_value); irq_param periodic_param = { .timer = 3, .source = AC_FALSE, }; result = ac_exception_irq_register(&periodic_handler, &periodic_iacs, (ac_uptr)&periodic_param); error |= AC_TEST(result == 0); ac_timer_periodic(periodic_param.timer, 1000000); cur_value = 1; periodic_counter = cur_value; prev_value = cur_value; terminal_value = cur_value + 3; ac_printf("test_ac_timer: periodic_counter is %u\n", cur_value); for (ac_u64 i = 0; i < 1000000000 && cur_value != terminal_value; i++) { cur_value = __atomic_load_n(&periodic_counter, __ATOMIC_ACQUIRE); if (cur_value != prev_value) { prev_value = cur_value; ac_printf("test_ac_timer: periodic_counter changed to %u\n", cur_value); } } error |= AC_TEST(cur_value == terminal_value); #else ac_printf("test_ac_timer: Unknown Platform\n"); #endif if (!error) { // Succeeded ac_printf("OK\n"); } return error; }