Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Руководство пользователя по сигнальным процессорам Sharc

.pdf
Скачиваний:
143
Добавлен:
01.05.2014
Размер:
9.49 Mб
Скачать

Многопроцессорная система 7

обрабатывается по другому для предотвращения конфликтов при управлении линией ACK. Линии сигналов подтверждения, использующиеся для ответа на эти передачи, объединяются по схеме «монтажное ИЛИ». Этот сигнал обрабатывается следующим образом:

1.В первом цикле широковещательной записи (и во всех последующих нечетных циклах) ведомый ADSP 2106x сбрасывает сигнал ACK, если не готов к приему данных. Если он готов, то не изменяет сигнал на линии ACK.

Если ведущий процессор видит установленный сигнал ACK, указывающий, что все ведомые приняли широковещательную запись, то он ее завершает.

2.Если широковещательная запись не закончена, то во всех следующих четных циклах ведомый ADSP 2106x не управляет сигналом ACK. Вместо этого ведущий процессор устанавливает сигнал ACK в 1 и продолжает запись (возврат к шагу 1).

В большинстве случаев сигнал ACK будет выставлен (высокий уровень) и ведомые ADSP 2106x будут готовы принять данные к началу широковещательной записи – запись выполняется за один цикл. Однако если сигнал ACK сброшен (низкий уровень) или один из ведомых не готов принять данные, то широковещательная запись будет занимать минимум три цикла.

Если разрешено состояние ожидания при обращении к пространству памяти многопроцессорной системы (установлен бит MMSWS в регистре WAIT), то ни один из процессоров не будет управлять сигналом ACK в первом цикле. Ведущий процессор установит сигнал ACK во втором цикле, а ведомые смогут управлять им в третьем цикле. В этом случае широковещательная запись также будет занимать минимум три цикла.

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

7.4.4. FIFO теневой записи

Из за того что внутренняя память ADSP 2106x должна работать с высокой скоростью, запись в память осуществляется не прямо в массив памяти, а в буфер FIFO, состоящий из двух ячеек, который называется FIFO теневой записи.

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

251

7 Многопроцессорная система

обычно никак себя не проявляет, т. к. любое чтение последних двух записей прерывается и выполняется не из памяти, а из FIFO. Есть только один случай, когда вам нужно учитывать существование FIFO теневой записи – при обращении 48 разрядным и 32 разрядным словам по одинаковому адресу.

FIFO теневой записи не может отличать отображения в память 48 разрядных и 32 разрядных слов (см. рис. 5.8 и рис. 5.9 в главе Память). Т. о., если вы записываете 48 разрядное слово в память, а затем делаете попытку прочитать данные, как 32 разрядное слово, то FIFO теневой записи не прервет чтение и будут возвращены неправильные данные.

Если обращения к 48 разрядным и 32 разрядным словам по одинаковому адресу должны обязательно следовать друг за другом, то перед чтением данных вы должны освободить FIFO теневой записи с помощью двух фиктивных записей.

7.5. Передача данных через буферы EPBx

Ведущий процессор помимо прямых чтения и записи может передавать данные в ведомый и из него через буферы FIFO EPB0, EPB1, EPB2, EPB3 внешнего порта. Каждый из этих буферов состоит из 6 ячеек и является частью набора регистров IOP. Через буферы EPBx могут выполняться передачи одиночных слов данных и передачи по DMA. Передачи по DMA обрабатываются внутренним контроллером DMA ADSP 2106x, передачи одиночных слов данных

– ядром ADSP 2106x.

Каждый буфер EPBx имеет порт чтения и порт записи, которые могут подключаться внутри либо к шине данных внешнего порта (EPD), либо к локальной шине, которая, в свою очередь, может соединяться с шиной данных ввода вывода (IOD), шиной данных PM или шиной данных DM. Это показано на рис. 8.1 в главе Хост интерфейс. Заметим, что прямое чтение или прямая запись минуют буферы EPBx и обращаются непосредственно во внутреннюю память.

7.5.1. Передача одиночных слов данных

Когда ведущий процессор записывает одно слово данных в буфер EPBx ведомого, программа ядра ведомого должна считать эти данные. И наоборот, когда ведомый записывает данные в один из буферов EPBx, ведущий должен выполнить внешний цикл чтения, чтобы получить их. Поскольку буферы EPBx состоят из 6 ячеек (в обоих направлениях), ведущий и ядро ведомого получают дополнительное время для эффективного и непрерывного чтения данных. Т. о., передачи одиночных слов данных могут выполняться в реальном времени, без задержек и без использования DMA.

252

Многопроцессорная система 7

Если ведущий процессор делает попытку чтения из пустого буфера EPBx ведомого, то обращение будет задержано путем сброса сигнала ACK до получения буфером данных от ядра ведомого. Если ядро ведомого делает попытку записи в полный буфер EPBx, то обращение также будет задержано и ядро «зависнет» на время, пока буфер не будет считан ведущим. Для предотвращения этого бит BHD (Buffer Hang Disable – запрет зависания буфера) в регистре SYSCON должен быть установлен в 1. Состояние буфера EPBx – полный или пустой – можно определить путем считывания соответствующего регистра управления/состояния DMACx.

Аналогично, если ведущий процессор делает попытку записи в полный буфер EPBx ведомого, то обращение будет задержано путем сброса сигнала ACK до считывания буфера ядром ведомого. Если ядро ведомого пытается считать из пустого буфера, то обращение также будет задержано и ядро «зависнет» в ожидании выполнения внешней записи ведущим. В этом случае для предотвращения условия зависания также может использоваться бит BHD.

Каждый буфер EPBx можно очистить, записав 1 в бит FLSH в соответствующем регистре управления DMACx. Этот бит не фиксируется и всегда считывается как 0. Состояние буфера изменится в следующем за записью цикле. Буфер EPBx не должен активизироваться и обнуляться в одном и том же цикле.

Замечание: для выполнения передачи одного слова через буфер EPBx без DMA должен быть обнулен бит разрешения DMA (DEN) в соответствующем регистре DMACx.

7.5.1.1. Прерывания при передаче одиночных слов данных

Прерывания четырех каналов DMA внешнего порта могут использоваться для управления передачей одиночных слов данных между ведущим и ведомым процессорами. Для этого в регистре управления DMACx должны быть установлены DEN=0 и INTIO=1. Это запрещает DMA (DEN =0) и разрешает управляемый прерываниями ввод вывод (INTIO=1) (полное описание регистров управления DMACx см. в главе DMA или приложении Регистры управления/состояния этого руководства).

В этом случае генерация прерывания происходит, когда данные становятся доступными в порту чтения буфера EPBx или когда порт записи не имеет новых данных для передачи. Затем буфер EPBx может быть считан или записан изнутри ядром ведомого ADSP 2106x или извне ведущим процессором. Такая генерация прерываний полезна для осуществления управляемого прерываниями ввода вывода, контролируемого ядром ADSP 2106x.

253

7 Многопроцессорная система

Эти прерывания могут маскироваться (запрещаться) в регистре IMASK. Если прерывание позже демаскируется в IMASK, то соответствующий бит фиксации в регистре IRPTL должен быть сброшен, чтобы очистить любой запрос прерывания, который мог произойти ранее.

7.5.2. Передачи по DMA

Ведущий процессор может инициализировать передачу данных по DMA в ведомый и из него. Ведущий может изменять содержимое регистров управления и параметров DMA ведомого для настройки операции DMA через внешний порт. Это самый эффективный способ передачи блоков данных между двумя ADSP 2106x.

Передачи по DMA во внутреннюю память. Ведущий ADSP 2106x может настраивать канал DMA внешнего порта для передачи данных во внутреннюю память ведомого и из нее.

Передачи по DMA во внешнюю память. Ведущий ADSP 2106x может настраивать канал DMA внешнего порта для передачи данных непосредственно во внешнюю память, при передаче используются линии запроса и предоставления (, ).

Более подробно о настройке операций по DMA см. в главе DMA этого руководства. На рис. 6.10 в разделе «Конфигурация системы для межпроцессорного DMA» главы DMA показаны различные способы настройки передач по DMA через внешний порт между двумя ADSP 2106x, а также достоинства и недостатки каждой конфигурации.

7.5.2.1. Передача данных по DMA во внутреннюю память

Ведущий ADSP 2106x может настраивать каналы DMA внешнего порта для передачи блока данных во внутреннюю память ведомого и из нее. Для настройки передачи по DMA ведущий должен инициализировать регистры управления и параметров ведомого для этого канала. Как только канал DMA настроен, ведущий может просто считывать из (или записывать в) соответствующего буфера EPBx ведомого или он может настроить собственный контроллер DMA для выполнения передачи. Если буфер ведомого пустой (или полный), то обращение будет продлено, пока данные не станут доступны (или сохранены). Этот метод позволяет быстро и эффективно осуществлять передачу данных.

Режим упаковки и распаковки слов данных определяется битом PMODE в регистре управления DMA через внешний порт (DMAC6, DMAC7, DMAC8 и

254

Многопроцессорная система 7

DMAC9). Могут быть выбраны следующие режимы упаковки/распаковки – 16→32, 16→48 или 32→48 бит.

Ведущий ADSP 2106x может также использовать сигналы квитирования

, для управления передачей по DMA, но только не в том случае, когда хост процессор управляет шиной.

7.5.2.2. Передачи по DMA во внешнюю память

Контроллер DMA может использоваться для передачи данных непосредственно во внешнюю память. Внешний режим с квитированием для 7 или 8 каналов DMA

внешнего порта обеспечивает сигналы квитирования / для

передачи этого типа. Выполнение этих передач невозможно, когда хост процессор управляет шиной.

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

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

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

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

1.ADSP 2106x не должен записывать семафор, если он не является ведущим. Это особенно важно, если семафор размещен в собственной внутренней памяти или регистрах IOP ADSP 2106x.

2.При операции чтение модификация запись семафора ADSP 2106x должен иметь управление шиной на продолжении всей операции.

255

7 Многопроцессорная система

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

Блокировка шины запрашивается путем установки бита 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 для того, чтобы гарантировать, что нет отложенной записи семафора другим процессором.

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

256

Многопроцессорная система 7

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

7.6.1. Пример: взаимные семафоры при совместном использовании канала DMA

Один канал DMA может совместно использоваться несколькими ADSP 2106x, применяя регистр управления каналом в качестве взаимного семафора. Регистр управления каналом DMA – это отображенный в памяти каждого ADSP 2106x регистр IOP. Если содержимое регистра управления равно нулю, то канал заблокирован и не используется никаким процессором. Если содержимое регистра управления не равно нулю, то канал DMA используется.

Прежде чем ADSP 2106x сможет использовать канал DMA, он должен считать семафор, чтобы определить, используется ли канал. Если не используется, то процессор может запросить блокировку шины, а затем выполнить операцию чтение модификация запись для установки семафора в каждом из процессоров, совместно использующих канал DMA. Перед выполнением операции чтение модификация запись процессор должен повторно проверить семафор, чтобы убедиться, что канал DMA все еще свободен. Как только это выполнено, ADSP 2106x должен обнулить бит BUSLK для освобождения шины и может продолжить передачу по DMA. После завершения передачи процессор должен обнулить семафор, чтобы сообщить другим процессорам, что канал доступен для использования.

Пример кода, выполняющего описанную выше операцию чтение модификация запись:

#define semaphore 0x0038001C

/*Широковещательная запись в */

 

/*регистр управления DMAC6 */

 

/*âî âñåõ ADSP-2106x */

...

 

BIT SET MODE2 BUSLK;

/*Запрос блокировки шины */

IF NOT BM JUMP(PC,0);

/*Ожидание получения управления

 

шиной */

USTAT1=DM(SYSTAT);

 

257

7 Многопроцессорная система

BIT TST USTAT1 0X1000;

 

IF NE JUMP (PC,-2);

/*Проверка бита DWPD */

 

/* для выяснения того, что после

 

блокировки шины не произошла

 

запись */

R0=DM(semaphore);

/*Чтение семафора */

R0=PASS RO

/*Установка кода условия */

IF NE JUMP(PC,3);

/*Проверка семафора - нет записи,

 

если ресурс не доступен */

R0=R0+1;

/*Изменение семафора */

DM(semaphore)=R0;

/*Запись семафора */

BIT CLR MODE2 BUSLK;

/*Освобождение шины */

Замечания:

1.Команды от IF NOT BM JUMP(PC,0) до IF NE JUMP(PC, 2) необходимы только для внутренних семафоров.

2.Команда R0=DM(semaphore) не будет выполнена, пока не будет получено управление шиной и она не будет блокирована.

3.DM(semaphore)=R0 – команда широковещательной записи.

7.7. Межпроцессорные сообщения и векторные прерывания

Ведущий процессор может связываться с ведомыми ADSP 2106x путем записи сообщений в их регистры IOP. Для передачи сообщений между процессорами могут использоваться универсальные регистры MSGR0 MSGR7. Они также полезны при реализации семафоров и для совместного использования ресурсов между процессорами. Регистры MSGRx и VIRPT могут использоваться для передачи сообщения следующими способами:

Передача сообщения. Ведущий процессор может связываться с ведомым ADSP 2106x путем записи и/или считывания любого из восьми регистров сообщений MSGR0 MSGR7 ведомого.

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

Регистры MSGRx и VIRPT также поддерживают интерфейс с хост процессором. Из за того что эти регистры могут быть совместно используемым ресурсом в одном ADSP 2106x, могут случаться конфликты, которые ваше программное обеспечение

258

Многопроцессорная система 7

должно предотвращать. Подробнее о конфликтах при обращении к регистрам IOP см. приложение Регистры управления/состояния этого руководства.

7.7.1. Прохождение сообщения (MSGRx)

Есть три программных протокола, в соответствии с которыми ведущий процессор может связываться с ведомым ADSP 2106х через регистры сообщений MSGRx: с помощью 1) векторных прерываний, 2) регистров квитирования и 3) обратной записи в регистры.

При использовании метода на основе векторных прерываний ведущий заполняет заранее определенные регистры MSGRx ведомого данными и вызывает векторное прерывание путем записи адреса программы обработки в VIRPT. Программа обработки ведомого должна считать данные из регистров MSGRx и затем обнулить VIRPT, сообщая тем самым ведущему о своем завершении. Программа обработки может также использовать один из сигналов FLAG3 0 ведомого ADSP 2106х, чтобы сообщить ведущему о своем окончании.

При использовании метода регистров квитирования четыре регистра МSGRx должны быть обозначены следующим образом: регистр приема (R), регистр квитирования приема (RH), регистр передачи (T) и регистр квитирования передачи (TH). Для передачи данных в ADSP 2106х ведущий должен записать данные в T и затем записать «1» в TH. Когда ведомый увидит «1» в TH, он считает данные из T и запишет «0» в TH. Когда ведущий увидит «0» в TH, он поймет, что передача завершилась. Аналогичная последовательность происходит при передаче данных из ведомого в ведущий с использованием R и RH.

Метод обратной записи в регистры подобен методу регистров квитирования, но использует только регистры данных T и R. Ведущий записывает данные в T. Когда ведомый видит в Т ненулевую величину, он считывает ее и записывает «0» обратно в T. Подобная последовательность осуществляется при приеме данных ведущим. Это более простой метод, и он хорошо работает, пока данные, подлежащие передаче, не содержат «0».

7.7.2. Векторные прерывания (VIRPT)

Векторные прерывания используются для межпроцессорного взаимодействия между двумя ADSP 2106х или между хост процессором и ADSP 2106х. Когда внешний процессор записывает адрес в регистр VIRPT ADSP 2106х, вызывается векторное прерывание.

При обработке векторного прерывания ADSP 2106х автоматически помещает данные в стек состояния и начинает выполнять программу обработки,

259

7 Многопроцессорная система

размещенную по адресу, указанному в VIRPT. Младшие 24 бита VIRPT содержат адрес; в старшие 8 бит могут по желанию помещаться данные, которые впоследствии могут быть использованы программой обработки прерывания. При сбросе VIRPT инициализируется стандартным адресом из таблицы векторов прерываний ADSP 2106х.

Минимальная задержка начала обработки векторного прерывания равна шести циклам, пять из которых являются пустыми (NOP). Когда программа обработки достигает команды RTI (Return From Interrupt, возврат из прерывания), ADSP 2106х автоматически извлекает данные из стека состояния.

Бит VIPD регистра SYSTAT отражает состояние регистра VIRPT. Если в VIRPT записывается адрес в то время, когда отложена обработка предыдущего прерывания, то адрес нового вектора заменяет адрес отложенного. Если в VIRPT записывается адрес во время обработки предыдущего векторного прерывания, то адрес нового вектора игнорируется, и новое прерывание не генерируется. Если ADSP 2106х записывает адрес в свой собственный регистр VIRPT, то прерывание также не генерируется.

Для использования векторного прерывания в ведомом, ведущий ADSP 2106х должен выполнить следующее:

1.Опрашивать регистр VIRPT, пока процессор не считает определенное значение маркера (то есть ноль).

2.Записать адрес программы обработки векторного прерывания в VIRPT.

3.Когда программа обработки закончена, ведомый должен записать маркер обратно в VIRPT для указания того, что программа закончена и можно инициировать следующее векторное прерывание.

Бит DWPD регистра SYSTAT (см. раздел «Биты состояния в регистре SYSTAT» ниже) указывает, есть ли отложенная прямая запись во внутреннюю память. Прямые записи могут завершаться в различной последовательности. Например, если ведущий выполняет прямую запись в память ADSP 2106х и затем записывает данные в регистр IOP ADSP 2106х, то запись в регистр IOP может завершиться раньше прямой записи. По этой причине прямая запись, выполняемая непосредственно перед записью адреса векторного прерывания в VIRPT, может задерживаться до окончания перехода к обработке прерывания:

1.Ведущий выполняет прямую запись во внутреннюю память ведомого.

2.Ведущий генерирует векторное прерывание путем записи адреса в регистр VIRPT ведомого. Прямая запись при этом задерживается.

3.Ведомый переходит к программе обработки векторного прерывания.

260