Подсистема программируемых соединений между периферийными устройствами (Programmable Peripheral Interconnect, PPI) позволяет им взаимодействовать автономно друг с другом, используя задачи и события [2], и все это независимо от CPU. PPI позволяет осуществить точную синхронизацию между периферийными устройствами, когда для приложения существуют жесткие ограничения реального времени, и устраняет необходимость в активности CPU для реализации поведения, которое может быть предварительно запрограммировано с использованием PPI.
Примечание: расшифровку терминов и сокращений см. в словарике [3].
Рис. 1. Блок-схема PPI.
В дополнение к полностью программируемым соединениям между периферийными устройствами, у PPI есть набор предварительно запрограммированных каналов, где конечная точка события (event end point, EEP) и конечные точки задач (task end points, TEP) зафиксированы аппаратно. Эти фиксированные каналы можно индивидуально разрешать, запрещать или добавлять к группам каналов PPI точно так же, как и обычные каналы PPI.
Таблица 1. Конфигурируемые и фиксированные каналы PPI.
Экз.
Канал
Количество каналов
Количество групп каналов
PPI
0 .. 19
20
6
PPI фикс.
20 .. 31
12
PPI предоставляет механизм автоматического запуска задачи на одном периферийном устройстве как результат возникновения события на дpугом периферийном устройстве. Задача соединяется с событием через канал PPI. Канал PPI скомпонован из трех регистров конечной точки, одного EEP и двух TEP. Задача периферийного устройства подсоединяется к TEP с использованием адреса регистра задачи, связанного с задачей. Подобным образом событие периферийного устройства подключается к EEP с использованием адреса регистра события, связанного с событием.
На каждом канале PPI сигналы синхронизируются с частотой тактов 16 МГц, чтобы избежать любого внутреннего нарушения таймингов установки и удержания. Как следствие события, которые синхронны с частотой тактов 16 МГц, будут задержаны на 1 период тактов, в то время как другие, асинхронные события будут задерживаться на интервал времени до 1 периода тактов 16 МГц.
Обратите внимание, что на шорткаты (shortcuts, как определено в регистре SHORTS в каждом периферийном устройстве) не влияет эта синхронизация 16 МГц, и поэтому они не задерживаются.
Каждая TEP реализует механизм ветвления (fork), который позволяет запустить вторую задачу одновременно с задачей, которая сработала в TEP. Эта вторая задача конфигурируется регистре TEP, в группах регистров FORK, например FORK.TEP[0] связан с PPI-каналом CH[0].
Существует 2 способа разрешения и запрета каналов PPI:
• Разрешение или запрет каналов PPI индивидуально, используя регистры CHEN, CHENSET и CHENCLR. • Разрешение или запрет каналов PPI в группах каналов PPI через ENABLE и DISABLE задач этих групп. Перед тем, как эти задачи сработают, группа каналов PPI должна быть сконфигурирована для определения, какие каналы PPI какой группе принадлежат.
Примечание: обратите внимание, что когда канал принадлежит двум группам m и n, и CHG[m].EN и CHG[n].DIS произошли одновременно (m и n могут быть равны или отличаться), то EN на этом канале имеет приоритет.
Задачи PPI (например, CHG[0].EN) могут сработать через PPI наподобие любой другой задачи. Это означает, что они могут быть подключены к каналу PPI в качестве TEP. Одно событие может запустить несколько задач при использовании нескольких каналов, и таким же способом одна задача может быть запущена несколькими событиями.
Некоторые каналы PPI запрограммированы изначально. Эти каналы не могут быть сконфигурированы кодом CPU, но они могут быть добавлены в группы, и разрешены или запрещены так же, как и обычные, программируемые каналы PPI. FORK TEP для этих каналов все еще можно запрограммировать и использовать в приложении. Ниже в таблице 2 показаны эти предварительно запрограммированные каналы.