jcxz 84 July 30, 2019 Posted July 30, 2019 · Report post А вообще конечно - можно ещё кучу других способов придумать. Например: Если известно, что оба процессора всегда включено вместе (не может быть такого что один включен, а другой в это время - выключен), то назначаем (жёстко аппаратно) один процессор мастером, другой - слэйвом. Мастер генерит clock-сигнал с периодом 6мс (раз у вас передача занимает максимум 5 мс). Каждый период этого сигнала - тайм-слот. Передача возможна внутри тайм-слота. Ведомый процессор получает прерывания в начале каждого тайм-слота и если ему есть что передать - передаёт. Тайм-слоты можно сделать и намного меньше, например == 100 мкс. И использовать дополнительную линию BUSY от ведомого процессора к мастеру (или без неё - анализировать сигналы шины SPI). Если ведомый хочет передать что-то внутри тайм-слота, то он при входе в ISR в начале тайм-слота выставляет BUSY на линию и далее передаёт. Если передавать нужно мастеру, то он просто в начале очередного тайм-слота проверяет - "нет ли BUSY от ведомого?". Если есть - выходит из ISR и повторяет проверку в следующем (пока не обнаружит освобождение). Если нет - прекращает генерацию сигнала тайм-слотов и запускает свою передачу. Когда закончит свою передачу - возобновляет генерацию тайм-слотов. Quote Share this post Link to post Share on other sites More sharing options...
KiV 0 July 30, 2019 Posted July 30, 2019 · Report post 22 часа назад, KiV сказал: Но есть один нюанс - любой процессор может быть включен или выключен в произвольный момент. Вот это и портит всю картину. Если-бы всё было включено постоянно - не было-бы никаких проблем. Изначально всё и работало как мастер-слэйв - причем кто первый включился, тот и мастер. Но потом кто-то выдернул разъем мастера... Quote Share this post Link to post Share on other sites More sharing options...
KiV 0 July 30, 2019 Posted July 30, 2019 · Report post 1 час назад, jcxz сказал: Межпроцессорную синхронизацию в Вашем случае как мне видится можно организовать следующими способами: 1) 2 цифровых линии запроса захвата шины от двух процессоров с логикой анализа и разрешения коллизий на прерываниях и задержках; Именно так и реализовано. Проблема в разрешении коллизий при включении/выключении. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 84 July 30, 2019 Posted July 30, 2019 · Report post 6 часов назад, KiV сказал: Именно так и реализовано. Проблема в разрешении коллизий при включении/выключении. Значит - криво реализовано. Если процессоры могут быть произвольно быть включёнными/выключенными, то можно доработать мой алгоритм с тайм-слотами, так чтобы любой процессор мог стать мастером если он какое-то время не получает импульсов тайм-слотов от другого CPU. При старте ПО он некоторое время слушает линию, если там тишина - стартует свой клок (сам генерит импульс на внешний пин, и сам же по фронту этого импульса входит в ISR). В ISR анализируется чужой пин - если там тоже обнаружен высокий уровень коллизия (одновременно два CPU пытаются стать мастерами), то включаем механизм разрешения коллизий. Например такой: каждый процессор имеет номер, процессор с минимальным номером (N1) продолжает генерить клок, а с максимальным (N2) - отключает свой клок и становится ведомым. Ведомый может снова попытаться стать ведущим в случае если какое-то количество клоков не получает клока от ведущего (ведущий умер). Тогда ведомый становится ведущим, а когда старый ведущий (N1) снова оживёт от обнаружит клок от N2 то он теперь станет ведомым. Можно реализовать механизм разрешения коллизий и без уникальных номеров CPU. На генераторе случайных чисел например. Quote Share this post Link to post Share on other sites More sharing options...
KiV 0 July 30, 2019 Posted July 30, 2019 · Report post 3 часа назад, jcxz сказал: Значит - криво реализовано. Именно так. Quote Share this post Link to post Share on other sites More sharing options...