--Почему тут два процеccора?
--Потому, что одного - не достаточно.

Пролог
В этом тексте попробуем разобраться что же такое Lock-step. Термин «lock-step» происходит из тюремного лексикона. Да.. Там он относится муштре, которая свойственна местам не столь отдаленным. То есть синхронной ходьбе, при которой марширующие идут так близко друг к другу, как это только возможно.
Однако, как водится, это понятие оказалось также пригодным к аппаратной архитектуре многоядерных процессорных SoC-компьютеров. Вот такие пирожки с капустой.
Определения
Для начала условимся на терминологии
компонент (component) - элемент несистемного уровня, который логически или технически разделим и состоит из более чем одной аппаратной части или одного или нескольких программных единиц.
система (system) - набор компонентов или подсистем, которые связывают по крайней мере датчик, контроллер и исполнительный механизм друг с другом
элемент (element) - система, компоненты (аппаратные или программные), части оборудования или программные блоки.
агрегат (item) - система или комбинация систем, которая реализует функцию или часть функции.
сбой, неисправность (fault) — ненормальное состояние, которое может привести к отказу элемента или агрегата.
Сбой в электронике может быть спровоцирован естественным радиоактивным фоном (заряженные частицы из мирового пространства).
Мажорирование - процесс нечетного резервирования при котором в качестве финального результата выбирается тот результат, который оказался чаще.
Системы Lockstep — это отказоустойчивые компьютерные системы, которые выполняют один и тот же набор операций одновременно и параллельно. Происходит избыточность. Избыточность (дублирование) позволяет обнаруживать и исправлять ошибки: выходные данные операций Lockstep можно сравнить, чтобы определить, произошла ли ошибка.
--Если есть по крайней мере две системы (двойная модульная избыточность DMR), и ошибка может быть только обнаружена
--если есть по крайней мере три системы (тройная модульная избыточность TMR), с помощью большинства голосов можно даже починить ошибку на лету.
Для работы в lockstep каждая система настроена на переход от одного четко определенного состояния к следующему четко определенному состоянию. Когда новый набор входов достигает системы, она обрабатывает их, генерирует новые выходы и обновляет свое состояние. Этот набор изменений (новые входы, новые выходы, новое состояние) считается определяющим этот шаг и должен рассматриваться как атомарная транзакция.
Механизм Lockstep
Структура процессора Lockstep аналогична структуре параллельных компьютеров, но параллельное соединение используется не для увеличения вычислительной мощности. Вместо этого все ядра ЦП обрабатывают одну и ту же программу или алгоритм.

Затем происходит контроль и оценка путем сравнения результатов отдельных ядер ЦП выполняются отдельными, ограниченными по времени и непрерываемыми этапами. Т.е. процессорные ядра одновременно или с небольшим смещением по времени выполняют одинаковые инструкции. В архитектуре CPU lockstep, выходы обоих CPU сравниваются инструкция в инструкцию. Если результат не совпал - прерывание или сброс CPU.
Цель Lockstep: как можно раньше обнаружить сбои в работе процессора путем пошагового сравнения внутренних или внешних результатов, полученных двумя процессорами, работающими синхронно.
Достигаемая таким образом избыточность позволяет обнаруживать и реагировать на аппаратные сбои в одном из ядер процессора, как в случае двухъядерного процессора в режиме Lockstep.
Или еще возможно не только обнаруживать ошибки, но и в определенной степени исправлять их посредством принятия большинства решений, как в случае трехъядерных процессоров в случае единичной ошибки.
Другими словами, либо все это происходит, либо ничего из этого не происходит, но не что-то среднее. Иногда между системами устанавливается временной сдвиг (задержка), что увеличивает вероятность обнаружения ошибок, вызванных внешними воздействиями (например, скачками напряжения или ионизирующим излучением).

Достоинства Lock-step
++Lock-step позволяет в run-time выявить сбой в работе процессора. Зарегистрировать факт возникновения сбоя.
Недостатки Lock-step
Два процессорных блока обеспечивают производительность только одного процессорного блока.
LockStep не чинит возникший сбой, а только сообщает о его наличии.
LockStep пропустить ошибку, если два CPU выдут из строя одновременно. Но это решается при delayed lockstep
В два раза увеличивается электропитание
Какие процессоры используют технологию Lockstep?
Процессоры с Lockstep это обычно процессоры c ядрами ARM Cortex или PowerPC. Из реально существующих можно отметить эти
# | MCU | Vendor | Ядро |
1 | FC7300F8MDT | FlagChip | ARM Cortex-M7 |
2 | MPC5775K | NXP Semiconductors | e200z420 (PowerPC) |
3 | SPC58NN84E7RMHBR | ST | e200z4 (PowerPC) |
4 | AURIX TC27xT | Infineon | TriCore 1.6P |
5 | К1986ВК01 | Milandr | ARM Cortex-M4F |
6 | TMS570LS1227 | Texas Instruments | ARM Cortex-R4F |
Такие MCU в основном используются в критически важных для безопасности приложениях, таких как блоки управления двигателями транспортных средств (ECU) и автономные системы управления двигателями летательных аппаратов (FADEC).
Практическая часть
Рассмотрим FC7300F8MDT. Что можно узнать про Lockstep из datasheet-a? Вот так выглядит схема тандема из ядер.

Надо заметить, что на самом деле внутри SoC FC7300F8MDT процессоров аж 5 штук. Да... Core0 - это на самом деле сдвоенный процессор. Ровно как и Core1. Core2 одинарный процессор. Смотрите внимательно блок-схему. Видите двойную рамку?

точно так же сделано у SPC58NNx

В связи с этим, физически невозможно на процессоры группы Core0 записать разные прошивки.
В FC7300F8MDT LockStep работает по умолчанию. Это показывает регистр SCM_CHIPCFG0. При чтении регистра SCM_CHIPCFG0 появляется значение 0xc000FFFF = 1100_0000_0000_0000_1111_1111_1111_1111. Судя по спеке можно заключить, что LOCKSTEP включен по умолчанию.
bit num | Type | Field name | Description | RST |
31 | RO | CPU1_LOCKSTEP_EN | CPU1 Lockstep Enable | 1 |
30 | RO | CPU0_LOCKSTEP_EN | CPU0 Lockstep Enable | 1 |
14 | RO | OSPI | OSPI Enable | 1 |
9 | RO | ENET | Ethernet enable | 1 |
8 | RO | CAN_FD | CANFD Enable | 1 |
2-0 | RO | FLEXCAN_NUM | FLEXCAN NUM Enable | 7 |
Далее можно в активировать FCSMU - прерывания. Настроить каналы посвященные lockstep-у: 4 и 5 (Table 38. FCSMU channel assignments).
Channel Number | Failure | Failure Description |
4 | LS0 ERR | CPU0 lockstep compare fault |
5 | LS1 ERR | CPU1 lockstep compare fault |
Далее берем ионизирующую ампулу с эманациями изотопа Кобальт-60 и подносим к корпусу 176LQFP-EP. После этого должны появляться прерывания FCSMU0_IRQHandler по каналам lockstep-а.
Если же у Вас сегодня не оказалось с собой радио нуклидов или хотя бы циклотрона, то можно инжектировать события lockstep чисто программно отладочной функцией из SDK FCSMU_InjectionFault.
/*
Injects a fault into the specified channel in the FCSMU module.
This function injects a fault into the specified channel in the
specified FCSMU module instance by setting the injection register.
pHandle - Pointer to the FCSMU handle structure.
u32ChannelIndex - The channel index where the fault should be injected.
return FCSMU_StatusType Indicates the status of the fault injection process
(FCSMU_STATUS_SUCCESS or FCSMU_STATUS_FAIL).
If the handle pointer or instance index is invalid, a device
error will be reported, and the function returns FCSMU_STATUS_FAIL.
*/
FCSMU_StatusType
FCSMU_InjectionFault(FCSMU_HandleType *const pHandle,
uint32_t u32ChannelIndex);
Такой эксперимент я проделал через главную консоль управления (UART-CLI), инжектировал ошибку LockStep0 и обнаружил, как сработало прерывание FCSMU0_IRQHandler.

Когда срабатывает прерывание FCSMU0_IRQn (NVIC номер 40), то оно срабатывает на всех трёх ядрах. Поэтому ядро Core1 узнает, что на ядре Core0 произошло прерывание, через прерывание FCSMU. И наоборот, Core0 узнает о lockstep прерывании на Core1. Надо лишь сделать три отдельные функции обработчиков прерываний FCSMU0_IRQHandler для каждого ядра: core0, core1 и core2.

Итоги
Удалось отлавливать LockStep события на микроконтроллере FC7300F8MDT. LockStep работает полностью аппаратно. Сигнализирует об ошибках процессора подсистема FCSMU.
Словарь
Акроним | Расшифровка |
DMR | dual modular redundancy |
NVIC | Nested Vectored Interrupt Controller |
TMR | triple modular redundancy |
ITCM | Instruction Tightly-Coupled Memory |
DTCM | Data Tightly-Coupled Memory |
TCM | Tightly-Coupled Memory |
CTI | Cross Trigger Interface |
ЦП | Центральный Процессор |
EIM | Error Injection Module |
SCM | System Control Module |
FCSMU | Fault Control and Safety Manage Unit |
ECC | Error Correcting Code |
ECU | Electronic Control Unit |
FADEC | Full Authority Digital Engine Control |
Ссылки
Название | URL |
Lockstep (computing) | |
Обзор безопасных микроконтроллеров Flagchip для автомобильной электроники | |
Настройка ToolChain-a для программирования MCU FlagChip FC7300F8MDT | |
SPC58NN84E7 | https://www.st.com/en/automotive-microcontrollers/spc58nn84e7.html#overview |
UART-CLI | |
ISO 26262-6 разбор документа (или как писать безопасный софт) |
Вопросы
Как ядро Core0 может узнать, что зависло ядро Core1? И наоборот.
Что можно предпринять, если сработало прерывание по Lockstep? Перезагружаться? Игнорировать? Увеличить счетчик в NVRAM?
Можно ли отключить механизм lockstep, чтобы в два раза уменьшить энергопотребление SoC-а?