Files
Sprinter-SDCC/tests/irqtest/irqtest.c
T
snark13 a6fe50e247 libc: IM2 user-ISR, Phase 1 — libc/irq (irq_install/irq_remove) + irqtest
Проще исходного плана (docs/im2_isr_design.md обновлён): отдельный
--memory im2 не понадобился.

- <irq.h>: irq_install(handler) — вызов ~50 Гц только на КАДРОВЫХ
  прерываниях (клавиатура bit0:0x19 и CBL bit7:0xFE отфильтровываются);
  штатный обработчик DSS чейнится ВСЕГДА (SMC-jp, адрес из старой
  IM2-таблицы по регистру I) — клавиатура/SYSTIME/мышь живут
- вектор-таблица: 513 Б BSS + runtime-выравнивание; Sprinter шлёт
  только вектор 0xFF, поэтому jp-заглушка лежит внутри самой таблицы
  по смещению H — без linker-областей и правок crt0
- трамплин: полный сейв обоих наборов+IX/IY вокруг user-handler'а
  (ex af,af' как .db 0x08 — апостроф ломает препроцессор SDCC)
- tiny/big: работает (код в W2); small/huge: EINVAL по проверке
  адресов; irq_remove идемпотентен и висит на atexit (выход без
  снятия = I в памяти умершего процесса = крах шелла); old_I==0 → IM1
- tests/irqtest: тики за 3 с против time() (~50 Гц), живая клавиатура
  под handler'ом, остановка после remove, чистый выход
- docs: im2_isr_design (статус+дельты), libc-reference (<irq.h>), TODO

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 21:21:16 +03:00

66 lines
1.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* irqtest — smoke-тест IM2-модуля (Phase 1, docs/im2_isr_design.md).
*
* Проверяет:
* 1. тикает ~50 Гц (сверка с time() за 3 секунды);
* 2. клавиатура/SYSTIME живы при установленном handler'е (чейн к DSS);
* 3. irq_remove останавливает тики;
* 4. чистый выход в шелл (I восстановлен).
*/
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <errno.h>
#include <irq.h>
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;
}