NXP i.MX7D
и механизм семафоров
Семафор передаёт сигналы между всеми ядрами А7 и М4.
И представляет собой однобитный флаг, который можно программно установить или сбросить.
Всего в процессоре 16 семафоров.
@ Затактировать модуль Semaphore
MOV32 R10, CCM_BASE + CCGR40
MOV R9, 0x00003333
STR R9, [R10]
@ Пользуйтесь!
Идея довольно простая: если любое из ядер А7 устанавливает флаг в 1, то сбросить его может только это же ядро.
При этом любое ядро может в любое время считывать флаг, но занять его можно при условии,
что флаг был освобождён ядром-хозяином.
Если два ядра одномоментно попытаются установить флаг (семафор),
то одному из ядер конечно повезёт,
а другое ядро получит сообщение о неудаче.
Cortex-M4 так же включён в эту игру. Но если А7 устанавливают семафор в "1",
то М4 может установить его в "2".
@ Установить нулевой семафор
@ Со стороны Cortex-A7
MOV32 R10, SEMA4_BASE
MOV R12, 1 @ A7 может ставить только единичку
STRB R12, [R10, Gate00] @ Обращение к семафорам байтовое
Таким образом, можно организовать эксклюзивный доступ, например в общее хранилище данных.
Различные сценарии использования семафоров описаны в референсе.