--Почему тут два проце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? Вот так выглядит схема тандема из ядер.

Структура Core0 внутри FC7300F8MDT
Структура Core0 внутри FC7300F8MDT

Надо заметить, что на самом деле внутри 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)

https://en.wikipedia.org/wiki/Lockstep_(computing)

Обзор безопасных микроконтроллеров Flagchip для автомобильной электроники

https://habr.com/ru/companies/3rdman/articles/771894/

Настройка ToolChain-a для программирования MCU FlagChip FC7300F8MDT

https://habr.com/ru/articles/742274/

SPC58NN84E7

https://www.st.com/en/automotive-microcontrollers/spc58nn84e7.html#overview

UART-CLI

https://habr.com/ru/articles/694408/

ISO 26262-6 разбор документа (или как писать безопасный софт)

https://habr.com/ru/articles/757216/

Вопросы:

1--Как ядро Core0 может узнать, что зависло ядро Core1? И наоборот.
2--Что можно предпринять, если сработало прерывание по Lockstep? Перезагружаться? Игнорировать? Увеличить счетчик в NVRAM?
3--Можно ли отключить механизм lockstep, чтобы в два раза уменьшить энергопотребление SoC-а?

Комментарии (3)


  1. nerudo
    20.06.2025 19:12

    На сколько в среднем падает производительность в lockstep при работе из какой-нибудь общей (разделяемой) памяти?


    1. aabzel Автор
      20.06.2025 19:12

      Хороший вопрос.
      Проверить это проблематично, так как в спеке на SoC FC7300F8MDT не указаны регистры и битовые поля для отключения lockstep режима.


  1. Radisto
    20.06.2025 19:12

    Мне кажется, надо три ядра, иначе будет как с часами: если у вас есть часы, вы можете узнать, который час, но если у вас двое часов, то вы никогда не будете уверены в результате