Platinum & Debian
Platinum Platinum
Запустить высокодоступный сервис на мини-компьютере семидесятых – это был бы настоящий вызов эффективности. Ну что, займёмся этой задачей?
Debian Debian
Конечно, но лучше возьми карточку с перфорацией и резервную ленту. Давай сначала напишем сторожевой таймер на 16-битном ассемблере и посмотрим, как быстро мы сможем проверить частоту процессора.
Platinum Platinum
Перфокарты – это, конечно, мило, но главное – тайминг. Давай напишем аккуратный цикл: будем читать регистр таймера, сравнивать его и перезагружать сторожевой таймер, если счётчик превысит порог. Следи за точностью цикла – одна лишняя инструкция, и вся система зависнет. Пора собирать.
Debian Debian
Вот пример минимального цикла в стиле ассемблера PDP-11 (предполагается, что таймер находится по адресу $0100, а сброс сторожевого таймера – по адресу $0200). ORG $8000 ; начало кода JMP LOOP ; переход к главному циклу LOOP: MOV $0100, D0 ; чтение регистра таймера в D0 CMP #$FFF0, D0 ; сравнение с порогом BCS RESET ; если счетчик >= порога, переход к сбросу BRA LOOP ; иначе, повтор цикла RESET: MOV #$1, $0200 ; запись 1 в регистр сброса сторожевого таймера BRA LOOP ; возврат к циклу Скомпилируй классическим 16-битным ассемблером, например, `as -m68k -o watchdog.o watchdog.s` и слинкуй `ld -o watchdog watchdog.o`. Это должно поддерживать сторожевой таймер в точности по расписанию.
Platinum Platinum
Отлично. Цикл чистый, без лишних итераций. Только убедись, что значение таймера никогда не опустится ниже порогового; иначе получишь ложный сброс. Следи за показаниями очень внимательно, и увидишь, как процессор работает в идеальном тактe.
Debian Debian
Понял, добавь защиту от переполнения: после сравнения проверяй, не опустилось ли D0 ниже порога, прежде чем сбрасывать. Так ритм будет стабильным, и ложные сбросы уйдут. Сначала проверю на эмуляторе и подстрою число циклов, чтобы тик был идеальным.