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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now