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

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

Затем происходит контроль и оценка путем сравнения результатов отдельных ядер ЦП выполняются отдельными, ограниченными по времени и непрерываемыми этапами. Т.е. процессорные ядра одновременно или с небольшим смещением по времени выполняют одинаковые инструкции. В архитектуре CPU lockstep, выходы обоих CPU сравниваются инструкция в инструкцию. Если результат не совпал - прерывание или сброс CPU.
Цель Lockstep: как можно раньше обнаружить сбои в работе процессора путем пошагового сравнения внутренних или внешних результатов, полученных двумя процессорами, работающими синхронно.
Достигаемая таким образом избыточность позволяет обнаруживать и реагировать на аппаратные сбои в одном из ядер процессора, как в случае двухъядерного процессора в режиме Lockstep.
Или еще возможно не только обнаруживать ошибки, но и в определенной степени исправлять их посредством принятия большинства решений, как в случае трехъядерных процессоров в случае единичной ошибки.
Другими словами, либо все это происходит, либо ничего из этого не происходит, но не что-то среднее. Иногда между системами устанавливается временной сдвиг (задержка), что увеличивает вероятность обнаружения ошибок, вызванных внешними воздействиями (например, скачками напряжения или ионизирующим излучением).
Достоинства LockStep
++LockStep позволяет в run-time выявить сбой в работе процессора. Зарегистрировать факт возникновения сбоя.
Недостатки LockStep
1--Два процессорных блока обеспечивают производительность только одного процессорного блока.
2--LockStep не чинит возникший сбой, а только сообщает о его наличии.
3--LockStep пропустить ошибку, если два CPU выдут из строя одновременно.
4--В два раза увеличивается электропитание
Какие процессоры используют технологию Lockstep?
Процессоры с Lockstep это обычно процессоры серии ARM Cortex-R или MPC57xx PowerPC. Из реально существующих можно отметить два
# |
MCU |
Vendor |
Ядро |
1 |
FC7300F8MDT |
FlagChip |
ARM Cortex-M7 |
2 |
SPC58NN84E7RMHBR |
ST |
PowerPC |
Такие 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 разбор документа (или как писать безопасный софт) |
Вопросы:
1--Как ядро Core0 может узнать, что зависло ядро Core1? И наоборот.
2--Что можно предпринять, если сработало прерывание по Lockstep? Перезагружаться? Игнорировать? Увеличить счетчик в NVRAM?
3--Можно ли отключить механизм lockstep, чтобы в два раза уменьшить энергопотребление SoC-а?
Комментарии (3)
Radisto
20.06.2025 19:12Мне кажется, надо три ядра, иначе будет как с часами: если у вас есть часы, вы можете узнать, который час, но если у вас двое часов, то вы никогда не будете уверены в результате
nerudo
На сколько в среднем падает производительность в lockstep при работе из какой-нибудь общей (разделяемой) памяти?
aabzel Автор
Хороший вопрос.
Проверить это проблематично, так как в спеке на SoC FC7300F8MDT не указаны регистры и битовые поля для отключения lockstep режима.