2016-09-06 4 views
2

Я изучаю, как сделать операционную систему для малины Pi, а в учебнике OSDev для barebones для малины Pi следующий код используется для очистки любых ожидающих прерываний.Как очистить регистр прерываний BCM2835?

// Clear pending interrupts. 
mmio_write(UART0_ICR, 0x7FF); 

Функция mmio_write заключается в следующем.

static inline void mmio_write(uint32_t reg, uint32_t data){ 
    *(volatile uint32_t *)reg = data; 
} 

Почему эта величина значительна и как она устраняет прерывания?

+0

Вам необходимо прочитать определение UART0_ICR. Вероятно, биты, которые вы пишете на него (0x7ff), используются для очистки отложенных флагов прерывания для каждого канала прерывания (в этом случае это будет 12 бит/12 каналов прерываний очищено) – PaulHK

ответ

2

Эта линия:

// Clear pending interrupts. 
mmio_write(UART0_ICR, 0x7FF); 

будет записывать значение 0x7FF в регистр по адресу UART0_ICR. Скорее всего, UART0_ICR это значение определено некоторое другое, где в коде, который ссылается на адрес соответствующего регистра внутри BCM2835, может быть что-то похожее на это:

#define UART0_ICR (UART0_BASE + 0x44) 

Почему это значение существенным, и как он очищает прерывания?

Чтобы понять это, вам нужно прочитать спецификацию устройства, которое BCM2835 в вашем случае (быстрый поиск дает мне эту link). Посмотрите раздел реестра UART, вы можете увидеть описание для регистра UART_ICR, который является регистром очистки Interupt.

В таблице бит описание этого регистра вполне очевидно: это 32-разрядный регистр, бит 31-11 не используется, а бит от 0 до 10 (11 бит) используется в качестве флагов для очистки различных видов прерывание. Запись значения 0x7FF в этот регистр буквально устанавливается на всех этих флагах, следовательно, он очистит все ожидающие прерывания UART.

+0

Возможно, это очевидно, но соглашение об очистке флагов прерывания путем записи 1-бит в соответствующее положение упакованного флага, вместо того, чтобы вручную разоблачить позицию и записать требуемое состояние, состоит в том, что может произойти расстановка между другим входящим прерыванием, помеченным и циклом чтения-изменения-записи, тем самым заканчивая молча игнорируя событие. – doynax

+0

@doynax Спасибо за вашу идею. Не могли бы вы подробнее рассказать о том, как это сделать, чтобы очистить прерывания? Что такое цикл гонки, чтение-изменение-запись? Можете ли вы показать пример кода? – theman

+0

Это не идея, или, по крайней мере, не моя. Когда он впервые встречается, он может быть немного контр-интуитивным, чтобы записывать один бит для очистки флагов. _reason_ для этого соглашения заключается в том, что если записи должны были непосредственно устанавливать и очищать ожидающий статус, тогда ручное уменьшение бита (которое считывает значение регистра, маскирует желаемый флаг и записывает результат) может в конечном итоге подтвердить любые прерывания, возникающие между чтение и запись. Следовательно, сам аппаратный модуль обычно берет на себя ответственность за атомарное подтверждение событий. – doynax

 Смежные вопросы

  • Нет связанных вопросов^_^