Блокировка шины и семафоры
Для совместного использования в многопроцессорной системе ресурсов, таких
как память или ввод_вывод, могут использоваться семафоры. Семафор – это флаг, который может считываться и записываться любым из процессоров, совместно использующим ресурс. Значение семафора сообщает процессору о том, что он может обратиться к ресурсу. Семафоры также полезны для синхронизации задач, выполняемых различными процессорами в
многопроцессорной системе.
Ключевым требованием в многопроцессорных системах является выполнение считывания и изменения семафора в одной неделимой операции. Это возможно реализовать при использовании блокировки шины.
Из_за того, что внешняя память и внутренняя память каждого 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 должен снова проверить его, чтобы убедиться, что другой процессор не изменил его. Внешняя шина используется только для модификации взаимных семафоров, а для их считывания не используется. Это значительно уменьшает трафик шины.