/* * irqtest — smoke-тест IM2-модуля (Phase 1, docs/im2_isr_design.md). * * Проверяет: * 1. тикает ~50 Гц (сверка с time() за 3 секунды); * 2. клавиатура/SYSTIME живы при установленном handler'е (чейн к DSS); * 3. irq_remove останавливает тики; * 4. чистый выход в шелл (I восстановлен). */ #include #include #include #include #include static volatile uint16_t ticks; static void on_tick(void) { ticks++; } /* Атомарное чтение 16-битного счётчика, разделяемого с ISR. */ static uint16_t read_ticks(void) { uint16_t v; IRQ_DISABLE(); v = ticks; IRQ_ENABLE(); return v; } int main(void) { if (irq_install(on_tick) != 0) { printf("irq_install failed: errno=%d\n", errno); return 1; } puts("irq installed; measuring 3 s..."); /* Выровняться на границу секунды (time() зовёт ESTEX SYSTIME в * цикле — заодно стресс чейна к DSS). */ time_t t0 = time(0); while (time(0) == t0) ; uint16_t start = read_ticks(); time_t t1 = time(0); while (time(0) < t1 + 3) ; uint16_t got = read_ticks() - start; printf("ticks: %u in 3 s (~%u Hz, expect ~50)\n", got, got / 3); puts("press any key (keyboard must work)..."); getch(); irq_remove(); uint16_t frozen = read_ticks(); time_t t2 = time(0); while (time(0) < t2 + 1) ; if (read_ticks() == frozen) puts("remove: ticks frozen, OK"); else puts("remove: FAIL, still ticking"); puts("irqtest done."); return 0; }