Инструменты пользователя

Инструменты сайта


interrupt

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
interrupt [2026/10/25 16:18] – geckointerrupt [2026/10/25 17:06] (текущий) – gecko
Строка 30: Строка 30:
   * 2 - Зарезервировано;   * 2 - Зарезервировано;
   * 3 - Обработчики аппаратных прерываний периферии.   * 3 - Обработчики аппаратных прерываний периферии.
 +
 +Перед вызовом очереди BIOS сохраняет все регистры общего назначения (GPR) в специальный буфер, так что самостоятельно это делать не нужно.
  
 ===== Установка пользовательских обработчиков ===== ===== Установка пользовательских обработчиков =====
Строка 51: Строка 53:
  
 Чтобы безопасно поместить элемент в очередь, необходимо обернуть этот вызов в критическую секцию, временно отключив аппаратные прерывания. Это предотвратит сбой в работе консоли, который мог бы произойти, если бы во время изменения указателей очереди возникло другое прерывание. Чтобы безопасно поместить элемент в очередь, необходимо обернуть этот вызов в критическую секцию, временно отключив аппаратные прерывания. Это предотвратит сбой в работе консоли, который мог бы произойти, если бы во время изменения указателей очереди возникло другое прерывание.
 +
 +BIOS по цепочке вызывает все зарегистрированные обработчики прерываний. Каждый обработчик должен проверить нужный бит регистра I_STAT и подтвердить его, записав в него ноль. Например:
 +
 +<code c>
 +int irqVBlank()
 +{
 +    if ((*I_STAT & IRQ0) && (*I_MASK & IRQ0))
 +    {
 +        // Reset VBlank bit
 +        *I_STAT = ~IRQ0;
 +    }
 +    return 0;
 +}
 +</code>
 +
 +Поскольку такой подход может привести к конфликтам, не рекомендуется навешивать на одну и ту же линию прерываний более одного обработчика.
  
 ===== Функции BIOS, относящиеся к обработке прерываний ===== ===== Функции BIOS, относящиеся к обработке прерываний =====
Строка 57: Строка 75:
  
   * С(03h) - SysDeqIntRP(priorityIndex, handler) - убирает обработчик прерывания из очереди.   * С(03h) - SysDeqIntRP(priorityIndex, handler) - убирает обработчик прерывания из очереди.
 +
 +  * B(18h) - ResetEntryInt() - удаляет все пользовательские обработчики.
  
   * int EnterCriticalSection(), вызов через syscall с номером 0x01 в регистре $a0 - отключает обработку прерываний, зануляя биты 2 и 10 регистра SR (cop0r12). Возвращает 1, если оба бита были установлены, и 0 в противном случае. Эту функцию нужно вызывать в редких случаях, когда нужно выполнить код, который не должен прерываться.   * int EnterCriticalSection(), вызов через syscall с номером 0x01 в регистре $a0 - отключает обработку прерываний, зануляя биты 2 и 10 регистра SR (cop0r12). Возвращает 1, если оба бита были установлены, и 0 в противном случае. Эту функцию нужно вызывать в редких случаях, когда нужно выполнить код, который не должен прерываться.
interrupt.1792945096.txt.gz · Последнее изменение: — gecko

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki