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

Пролог

В этом тексте попробуем разобраться что же такое Lock-step. Термин «lock-step» происходит из тюремного лексикона. Да.. Там он относится муштре, которая свойственна местам не столь отдаленным. То есть синхронной ходьбе, при которой марширующие идут так близко друг к другу, как это только возможно.

Однако, как водится, это понятие оказалось также пригодным к аппаратной архитектуре многоядерных процессорных SoC-компьютеров. Вот такие пирожки с капустой.

Определения

Для начала условимся на терминологии

компонент (component) - элемент несистемного уровня, который логически или технически разделим и состоит из более чем одной аппаратной части или одного или нескольких программных единиц.

система (system) - набор компонентов или подсистем, которые связывают по крайней мере датчик, контроллер и исполнительный механизм друг с другом

элемент (element) - система, компоненты (аппаратные или программные), части оборудования или программные блоки.

агрегат (item) - система или комбинация систем, которая реализует функцию или часть функции.

сбой, неисправность (fault) — ненормальное состояние, которое может привести к отказу элемента или агрегата.

Сбой в электронике может быть спровоцирован естественным радиоактивным фоном (заряженные частицы из мирового пространства).

Мажорирование - процесс нечетного резервирования при котором в качестве финального результата выбирается тот результат, который оказался чаще.

Системы Lockstep — это отказоустойчивые компьютерные системы, которые выполняют один и тот же набор операций одновременно и параллельно. Происходит избыточность. Избыточность (дублирование) позволяет обнаруживать и исправлять ошибки: выходные данные операций Lockstep можно сравнить, чтобы определить, произошла ли ошибка.

--Если есть по крайней мере две системы (двойная модульная избыточность DMR), и ошибка может быть только обнаружена

--если есть по крайней мере три системы (тройная модульная избыточность TMR), с помощью большинства голосов можно даже починить ошибку на лету.

Для работы в lockstep каждая система настроена на переход от одного четко определенного состояния к следующему четко определенному состоянию. Когда новый набор входов достигает системы, она обрабатывает их, генерирует новые выходы и обновляет свое состояние. Этот набор изменений (новые входы, новые выходы, новое состояние) считается определяющим этот шаг и должен рассматриваться как атомарная транзакция.

Механизм Lockstep

Структура процессора Lockstep аналогична структуре параллельных компьютеров, но параллельное соединение используется не для увеличения вычислительной мощности. Вместо этого все ядра ЦП обрабатывают одну и ту же программу или алгоритм.

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

Цель Lockstep: как можно раньше обнаружить сбои в работе процессора путем пошагового сравнения внутренних или внешних результатов, полученных двумя процессорами, работающими синхронно.

Достигаемая таким образом избыточность позволяет обнаруживать и реагировать на аппаратные сбои в одном из ядер процессора, как в случае двухъядерного процессора в режиме Lockstep.

Или еще возможно не только обнаруживать ошибки, но и в определенной степени исправлять их посредством принятия большинства решений, как в случае трехъядерных процессоров в случае единичной ошибки.

Другими словами, либо все это происходит, либо ничего из этого не происходит, но не что-то среднее. Иногда между системами устанавливается временной сдвиг (задержка), что увеличивает вероятность обнаружения ошибок, вызванных внешними воздействиями (например, скачками напряжения или ионизирующим излучением).

 delayed Lockstep
delayed Lockstep

Достоинства Lock-step

++Lock-step позволяет в run-time выявить сбой в работе процессора. Зарегистрировать факт возникновения сбоя.

Недостатки Lock-step

  1. Два процессорных блока обеспечивают производительность только одного процессорного блока.

  2. LockStep не чинит возникший сбой, а только сообщает о его наличии.

  3. LockStep пропустить ошибку, если два CPU выдут из строя одновременно. Но это решается при delayed lockstep

  4. В два раза увеличивается электропитание

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

Структура 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

Сравнение микроконтроллеров

https://docs.google.com/spreadsheets/d/1pztt0Y6h62IAo6vEm7VCVCsu2gySOYglRZk4XugqYFQ/edit?gid=1532921950#gid=1532921950

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-а?

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


  1. nerudo
    20.06.2025 19:12

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


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

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


    1. VelocidadAbsurda
      20.06.2025 19:12

      Не падает. Между парой ядер и шинами памяти/периферии находится проверочный модуль, который со стороны шин выглядит как одно ядро. Сами ядра в норме полностью синхронны и читают/пишут одни и те же адреса/данные на каждом такте, проверяющий следит как раз за этим, и либо пускает на шины полностью совпадающую активность (по сути, выходные сигналы одного ядра, второе пассивно принимает входные), либо сигналит ошибку.


      1. buinovb
        20.06.2025 19:12

        А в случае использования задержки (временного сдвига) тоже не падает? Получается проверочный модуль хранит все изменения на этот временной сдвиг и сравнивает результат первого и второго?


        1. VelocidadAbsurda
          20.06.2025 19:12

          Да, как на блок-схеме в статье - буферы на требуемое кол-во тактов для входных/выходных сигналов ядра. Обратите внимание на этот момент: сравниваются не внутренние состояния ядер, а их внешние сигналы, они куда более обозримы/легкодоступны. Сами ядра рассматриваются как "чёрные ящики", которые стартуют из одинаковых внутренних состояний (обеспечивается общим сбросом), далее в них подаётся одна и та же последовательность сигналов, а они должны выдавать одинаковые реакции на неё. Если в какой-то момент сбивается внутреннее состояние, рано или поздно это выходит наружу.


  1. Radisto
    20.06.2025 19:12

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


  1. roma_turkin
    20.06.2025 19:12

    Забавно, как в примере указывается семейство MPC57x, а в ссылке на чип - SPC58

    (первый - еще со времен Freescale, второй - уже NXP)

    И от PowerPC NXP тоже уже отказались, их заменил ARM S32G.

    Еще крупный известный индустриально-автомобильный локстеп чип - Tricore TCxxx


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

      И от PowerPC NXP тоже уже отказались, их заменил ARM S32G.

      Почему они так поступили?


      1. roma_turkin
        20.06.2025 19:12

        мое понимание - издержки от поддержки PowerPC слишком высоки. NXP сфокусировалось на интеграции IP компонентов, и по сути отдали полностью разработку непосредственно ядра ARM.

        PowerPC, судя по всему, остался только в радстойких процах


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

          А SPC58NN84E7RMHBR сейчас где-н используется?
          Но же e200z4 (PowerPC) и не радиационно стойкий.


          1. roma_turkin
            20.06.2025 19:12

            а, ошибочка, SPC вообще у ST (причем до этого у них не было PowerPC, насколько я помню).
            на сайте статус Active, значит, рекомендован к использованию
            как минимум в BDC BMW используется.


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

    Существуют ли российские микроконтроллеры с функцией lockstep?


    1. Azeront
      20.06.2025 19:12

      Миландр К1986ВК01. Согласно документации, два ядра ARM Cortex M4F могли работать либо независимо (DualCore), либо в режиме LockStep (вроде, настаивалось boot-опциями).

      Правда, я лично этот МК в серийных изделиях не встречал (только инженерный образец на демо-плате). И вряд-ли вообще его кто-нибудь увидит, т.к. Миландру запретили производить МК с ядрами ARM.


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

        Миландру запретили производить МК с ядрами ARM.

        Пусть тогда разрабатывают MCU c RISC-V как Микрон (K1948BK018 )


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

        Миландру запретили производить МК с ядрами ARM.

        А НПЦ ЭЛВИС не запрещали ARM ядра встраивать? У них же ELIoT с двумя ARM Cortex-M33.


  1. VM1989
    20.06.2025 19:12

    Есть ещё Техасский инструментальный завод, и их серия TMS570, тоже умеет lock-step


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

      Техасский инструментальный завод

      Шедеврально!


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

      Техасский инструментальный завод

      А STMicroelectronics получается Полупроводники и Микроэлектроника им. Томсона. (ПиМ им. Томсона).