Блокировка шины и семафоры

Для совместного использования в многопроцессорной системе ресурсов, таких

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

многопроцессорной системе.

Ключевым требованием в многопроцессорных системах является выполнение считывания и изменения семафора в одной неделимой операции. Это возможно реализовать при использовании блокировки шины.

Из_за того, что внешняя память и внутренняя память каждого ADSP_2106x (и регистры IOP) доступны любому другому ADSP_2106x, семафоры могут размещаться почти везде. Операция чтение_модификация_запись семафора может выполняться, если все ADSP_2106x следуют двум простым правилам:

1. ADSP_2106x не должен записывать семафор, если он не является ведущим.

Это особенно важно, если семафор размещен в собственной внутренней памяти или регистрах IOP ADSP_2106x.

2. При операции чтение_модификация_запись семафора ADSP_2106x должен

иметь управление шиной на продолжении всей операции.

Этих правил придерживаются и тогда, когда процессор использует возможность

блокировки шины, т. е. когда он «блокирует» свое управление шиной и предотвращает одновременный доступ других процессоров к семафорам. Блокировка шины запрашивается путем установки бита BUSLK в регистре MODE2. Когда это происходит, ADSP_2106x инициализирует процесс арбитража шины обычным образом, выставляя сигнал на линии. Когда процессор становится ведущим, он блокирует шину (т. е. сохраняет управление шиной), удерживая сигнал на линии установленным даже в том случае, если он не выполняет внешнего чтения или записи. При блокировке шины запрос шины хост_процессором () игнорируется. Когда бит BUSLK обнуляется, ADSP_2106x уступает шину, освобождая линию. Когда бит BUSLK установлен, ADSP_2106x МОжет определить, имеет ли он управление шиной, выполняя условную команду с кодами условий BM или NOT BM, например:

IF NOT BM JUMP (PC,0)/*ОЖИДАНИЕ ПОЛУЧЕНИЯ УПРАВЛЕНИЯ ШИНОЙ

Если ADSP_2106x стал ведущим, то он может продолжать операции внешнего чтения или записи. Если же нет, то он может сбросить бит BUSLK, а позже попробовать снова.

Операция чтение_модификация_запись выполняется следующим образом:

1. Запрос блокировки шины путем установки бита BUSLK в MODE2.

2. Ожидание получения управления шиной.

3. Ожидание, пока бит DWPD не станет равен нулю.

4. Считывание семафора, проверка его и затем запись нового значения

семафора.

Блокировка шины предотвращает запись семафора другими процессорами в то

время, как выполняется операция чтение_модификация_запись. Замечание: Если семафор взаимный и размещен во внутренней памяти или регистрах IOP процессора, то ADSP_2106x должен записывать его только тогда, когда он заблокировал шину. После получения управления шиной должно проверяться состояние бита DWPD в регистре SYSTAT для того, чтобы гарантировать, что нет отложенной записи семафора другим процессором. Блокировка шины может использоваться в комбинации с широковещательной записью для реализации взаимных семафоров в многопроцессорной системе.

Взаимный семафор должен размещаться по одинаковому адресу во внутренней памяти (или регистре IOP) каждого ADSP_2106x. Для проверки семафора каждый ADSP_2106x просто считывает его из собственной внутренней памяти.

Для изменения семафора процессор запрашивает блокировку шины, а затем

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: