Перейти к содержанию
    

Доступ к одному аппаратному интерфейсу двух процессоров

А вообще конечно - можно ещё кучу других способов придумать. Например:

Если известно, что оба процессора всегда включено вместе (не может быть такого что один включен, а другой в это время - выключен), то назначаем (жёстко аппаратно) один процессор мастером, другой - слэйвом. Мастер генерит clock-сигнал с периодом 6мс (раз у вас передача занимает максимум 5 мс). Каждый период этого сигнала - тайм-слот. Передача возможна внутри тайм-слота. Ведомый процессор получает прерывания в начале каждого тайм-слота и если ему есть что передать - передаёт.

Тайм-слоты можно сделать и намного меньше, например == 100 мкс. И использовать дополнительную линию BUSY от ведомого процессора к мастеру (или без неё - анализировать сигналы шины SPI). Если ведомый хочет передать что-то внутри тайм-слота, то он при входе в ISR в начале тайм-слота выставляет BUSY на линию и далее передаёт. Если передавать нужно мастеру, то он просто в начале очередного тайм-слота проверяет - "нет ли BUSY от ведомого?". Если есть - выходит из ISR и повторяет проверку в следующем (пока не обнаружит освобождение). Если нет - прекращает генерацию сигнала тайм-слотов и запускает свою передачу. Когда закончит свою передачу - возобновляет генерацию тайм-слотов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 часа назад, KiV сказал:

Но есть один нюанс - любой процессор может быть включен или выключен в произвольный момент.

Вот это и портит всю картину.

Если-бы всё было включено постоянно - не было-бы никаких проблем.

Изначально всё и работало как мастер-слэйв - причем кто первый включился, тот и мастер. Но потом кто-то выдернул разъем мастера...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Межпроцессорную синхронизацию в Вашем случае как мне видится можно организовать следующими способами:

1) 2 цифровых линии запроса захвата шины от двух процессоров с логикой анализа и разрешения коллизий на прерываниях и задержках;

Именно так и реализовано. Проблема в разрешении коллизий при включении/выключении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, KiV сказал:

Именно так и реализовано. Проблема в разрешении коллизий при включении/выключении.

Значит - криво реализовано.

Если процессоры могут быть произвольно быть включёнными/выключенными, то можно доработать мой алгоритм с тайм-слотами, так чтобы любой процессор мог стать мастером если он какое-то время не получает импульсов тайм-слотов от другого CPU.

При старте ПО он некоторое время слушает линию, если там тишина - стартует свой клок (сам генерит импульс на внешний пин, и сам же по фронту этого импульса входит в ISR). В ISR анализируется чужой пин - если там тоже обнаружен высокий уровень коллизия (одновременно два CPU пытаются стать мастерами), то включаем механизм разрешения коллизий. Например такой: каждый процессор имеет номер, процессор с минимальным номером (N1) продолжает генерить клок, а с максимальным (N2) - отключает свой клок и становится ведомым. Ведомый может снова попытаться стать ведущим в случае если какое-то количество клоков не получает клока от ведущего (ведущий умер). Тогда ведомый становится ведущим, а когда старый ведущий (N1) снова оживёт от обнаружит клок от N2 то он теперь станет ведомым.

Можно реализовать механизм разрешения коллизий и без уникальных номеров CPU. На генераторе случайных чисел например.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...