Jump to content
    

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

 

Share this post


Link to post
Share on other sites

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

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

Именно так.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...