Межпроцессорное взаимодействие (IPC) в многоядерных микроконтроллерах.
Часть 3. СнК i.MX6 и i.MX7. Модуль обмена сообщениями

№ 5’2018
PDF версия
Статья продолжает цикл публикаций, посвященных межпроцессорному взаимодействию (IPC) в гибридных СнК, одним из ядер которых является ARM Cortex-M3/M4. В предыдущих материалах были представлены варианты реализации IPC в СнК, состоящих из ядер ARM Cortex-M3/M4 и ARM Cortex-M0/M0+, а также ARM Cortex-M3/M4иC28xxx. В предлагаемой статье дано общее описание механизма межпроцессорного взаимодействия (IPC) между ядрами ARM Cortex-M4 и ARM Cortex-A9/A7 в СнК i.MX6/i.MX7 компании Freescale. Кроме того, подробно рассмотрен один из блоков IPC-модуля обмена сообщениями (Messaging Unit, MU).

Все статьи цикла.

Введение

Механизм межпроцессорного взаимодействия (IPC) в процессорах i.MX6 и i.MX7 построен на основе обмена сообщениями с использованием почтовых ящиков (Mailbox). В случае необходимости отправка и прием сообщений сопровождается генерацией прерываний к противоположной стороне обмена данными.

Обмен большими блоками данных осуществляется с помощью выделения областей разделяемой памяти (shared memory) соответствующего размера. Чтобы гарантировать корректную запись сообщений в блоки разделяемой памяти (shared memory), используется механизм семафоров (semaphore) и инструкции исключительного доступа к ресурсам (exclusive access).

 

Аппаратные блоки для организации межпроцессорного взаимодействия

В основе межпроцессорного взаимодействия лежит четыре аппаратных блока:

  1. Модуль обмена сообщениями (Messaging Unit, MU).
  2. Модуль семафоров (SEMA4).
  3. Блоки разделяемой памяти (Shared Memory).
  4. Исключительный доступ к ресурсам (Exclusive Access) на основе специальных инструкций набора команд ARMv7.

Основные функции каждого из перечисленных блоков приведены в таблице 1.

Таблица 1. Основные функции блоков межпроцессорного взаимодействияв СнК i.MX6 и i.MX7

Аппаратный блок

Функции

Модуль обмена сообщениями (Messaging Unit, MU)

Модуль содержит регистры почтовых ящиков (Mailbox register) для отправки/получения сообщений. Кроме того, модуль управляет межпроцессорными прерываниями.

Модуль семафоров (SEMA4)

Аппаратный модуль семафоров общего назначения.

Разделяемая память (Shared Memory)

Топология системной шины позволяет выделять блоки разделяемой памяти (shared memory). Центральный модуль защиты (Central Security Unit, CSU) и контроллер ресурсов (Resource Domain Controller, RDC) позволяют обеспечить защиту/изоляцию выделенных блоков памяти.

Исключительный доступ к ресурсам (Exclusive Access)

В системе команд процессоров ARMv7-A и ARMv7-M определены инструкции исключительного доступа LDREX/STREX.

Перейдем к краткому описанию каждого из блоков межпроцессорного обмена.

Модуль обмена сообщениями

Модуль обмена сообщениями (Messaging Unit, MU) представляет собой симметричную двухстороннюю систему, построенную на основе регистров передачи и приема сообщений (кадров сообщений), к каждой из сторон которой подключено собственное процессорное ядро. Модуль построен с использованием проверенных IP-ядер от СнК (SoC) базовых станций сотовой связи.

Управление обменом сообщений осуществляется с помощью прерываний (interrupt) или опроса соответствующих битов регистра состояния (polling). С каждой стороны модуля MU по четыре регистра для приема (RX register)/передачи (TX register) сообщений.

Для управления обменом сообщений с каждой из сторон модуля MU имеется по 12 запросов на прерывания (IRQ):

  • по четыре запроса на прерывания (IRQ), сигнализирующих о поступлении данных (“register full”) в регистры приема (receive register);
  • по четыре запроса на прерывания (IRQ), сигнализирующих об очистке (“register empty”) регистров передачи (transmit register);
  • по четыре запроса на прерывания (IRQ) общего назначения (general-purpose).

Кроме того, с каждой из сторон имеется по три флага общего назначения.

Блок-схема модуля обмена сообщениями показана на рис. 1.

Блок-схема модуля обмена сообщениями (Messaging Unit, MU)

Рис. 1. Блок-схема модуля обмена сообщениями (Messaging Unit, MU)

Блок семафоров

Блок семафоров (SEMA4) предоставляет программному обеспечению с кооперативной многозадачностью аппаратный механизм для безопасного разделения ресурсов (share resources) в гетерогенных (состоящих из процессоров разного типа) мультипроцессорных системах (HMP system). Блок спроектирован на основе проверенных IP-ядер, применяющихся в процессорах Vybrid и автомобильных микроконтроллерах компании Freescale. Имеется отдельный модуль для семафора контроллера ресурсов (Resource Domain Controller, RDC).

Блок семафоров поддерживает до 16 аппаратных семафоров общего назначения. Чтобы обеспечить однозначность блокировки, разблокировать семафор может только процессор, который его блокировал. Дополнительно для указания момента, когда семафор разблокирован, предусмотрена возможность оповещения с помощью прерываний о неудачной попытке блокировки. Чтобы гарантировать доступ к общим ресурсам только процессору с блокированным семафором, по-прежнему необходимы соглашения по программному обеспечению.

Блок-схема блока семафоров (SEMA4)

Рис. 2. Блок-схема блока семафоров (SEMA4)

На рис. 2 показана блок-схема блока семафоров (SEMA4).

Разделяемая память

Для организации межпроцессорного обмена топология общей шины позволяет выделять блоки разделяемой внутренней/внешней памяти. Для выделения индивидуальных областей памяти и ограничения доступа к ним можно использовать аппаратные возможности контроллера ресурсов (Resource Domain Controller, RDC).

Блок-схема областей разделяемой памяти (shared memory) приведена на рис. 3.

Разделяемая память (Shared Memory)

Рис. 3. Разделяемая память (Shared Memory)

Исключительный доступ

Процессорные ядра Cortex-A (ARMv7‑A) и Cortex-M (ARMv7‑M) поддерживают инструкции исключительного доступа LDREX/STREX. Чтобы поддерживать инструкции монопольной загрузки (load exclusive, LDREX)/записи (store exclusive, STREX), шинные сигналы исключительного доступа (exclusive access), генерируемые CPU, подключены к мониторам на границах областей памяти. Исключительный доступ (exclusive access) широко используется для синхронизации симметричных мультипроцессорных систем (SMP system), но может применяться и в гетерогенных мультипроцессорных системах (HMP system), в которых имеется соответствующая поддержка на уровне аппаратной архитектуры. Для гибридных микропроцессорных систем (HMP system) указатели на память при исключительном доступе необходимо сконфигурировать таким образом, чтобы он осуществлялся в точке когерентности для процессора (CPU).

На этом краткое описание блоков системы межпроцессорного обмена завершено. Прейдем к подробному описанию модуля управления обменом сообщениями (Messaging Unit, MU).

 

Модуль обмена сообщениями

Общий обзор

Модуль обмена сообщениями (Messaging Unit, MU) позволяет двум процессорам внутри СнК (SoC) обмениваться данными и координировать свою работу, обмениваясь сообщениями (например, данные, информация о состоянии и сигналы управления) по интерфейсу MU. Кроме того, MU обеспечивает возможность одному из процессоров посылать сигналы другому процессору, используя прерывания. Модуль MU связывает два процессора внутри кристалла i.MX6SX: процессор ARM Cortex-A9 и процессор ARM Cortex-M4.

Поскольку MU управляет процессом обмена сообщениями между процессорами, то MU применяет различные сигналы тактирования (с каждой из сторон различных периферийных шин). Поэтому модуль MU должен синхронизировать процессы доступа от одной из сторон к другой с помощью двух наборов согласованных регистров (со стороны процессора А и со стороны процессора Б).

Основные функции

Модуль MU управляет потоком сообщений с использованием прерываний или опроса регистров. Для выполнения требуемых операций процессор Б может вывести процессор А из режимов пониженного энергопотребления, выставив одно из 12 старших прерываний к процессору А и наоборот. Со стороны каждого из процессоров имеются симметричные процессорные интерфейсы, поддерживающие четыре запроса на прерывание общего назначения, предназначенные для противоположной стороны. Для организации обмена данными имеются три флага общего назначения, предназначенные для противоположной стороны, четыре приемных регистра с маскируемыми прерываниями и четыре регистра обмена данными с маскируемыми прерываниями.

Режимы работы

Режимы работы, поддерживаемые модулем MU, описаны в разделах «Режимы работы (Operating Modes)» и «Режимы пониженного энергопотребления (Low Power Modes)».

Внешние сигналы

Модуль Messaging Unit не имеет сигналов, непосредственно доступных за пределами кристалла СнК (SoC).

Функциональное описание

Модуль обмена сообщениями (MU) имеет ряд функциональных особенностей, которые приведены в таблице 2.

Таблица 2. Основные функциональные особенности MU

Функция

Описание

Межпроцессорные прерывания (Inter-processor Interrupts)

С каждой из сторон модуля MU имеется 12 источников прерываний (со стороны процессора А и со стороны процессора Б), которые используются для оповещения противоположного процессора. Прерывания могут быть предназначены для уведомления о событиях RX/TX и передачи сигналов общего назначения между двумя процессорами.

Сброс MU (MU Reset)

Процессор А может выполнить сброс всего модуля MU, используя управляющий бит (MUR) регистра управления процессора A (А Control Register, ACR). Бит MUR является самоочищаемым.

Конфигурация загрузки
процессора Б
(B Boot Configuration)

Источник загрузки (Boot Source) для процессора Б может быть сконфигурирован с помощью бита BBOOT регистра ACR.

Варианты настройки Boot Source:

  • базовый адрес DMEM;
  • базовый адрес IMEM;
  • адрес 0x00.

После сброса значение загружается из IFR Flash-памяти.

Удержание процессора Б в состоянии сброса (B Reset Hold)

Процессор Б удерживается в состоянии сброса любым из событий сброса. Это достигается установкой бита BRSTH регистра ACR. Процессор Б будет выведен из состояния сброса после очистки этого бита. После сброса значение загружается из IFR Flash-памяти.

Разрешение тактирования процессора А/Б (А/B Clock Enable)

Тактирование процессора А/Б может быть активировано для продолжения работы после перевода процессора А/Б в режим останова (Stop Mode). До этого момента процессор Б/A будет продолжать находиться в состоянии останова (Stop Mode).
Это позволяет процессору Б/A продолжать доступ к периферийным модулям процессора А/Б по шине AIPS, даже если процессор находится в режиме останова (Stop Mode).

Регистры состояния и регистры управления при обмене данными между ядрами (Status and Control Communications between Cores)

Модуль MU предоставляет двум ядрам способ обмениваться между собой данными, используя регистры состояния (Status registers) и регистры управления (Control registers), имеющиеся как со стороны процессора Б, так и со стороны процессора А модуля MU. Регистр состояния (Status register) с одной из сторон MU отражает состояние другой стороны MU.
Регистр управления (Control register) используется для операций управления, таких как разрешение прерываний и выставление прерываний другому процессору.

Синхронизация обмена сообщений между процессорными ядрами (Synchronized Message Transfers between Cores)

При обмене сообщениями между ядрами используются флаги «передатчик пуст» (transmit empty) и «приемник заполнен» (receive full), имеющиеся с обеих сторон MU. Обновление этих флагов передачи (transmit flag) и приема (receive flag) осуществляется с помощью механизма синхронизации.
Имеется внутренняя задержка между обновлением флага с одной стороны и отражением его состояния с другой стороны.

Прямой доступ к разделяемой памяти и предотвращение коллизий (Accessing Shared Memory Directly and Avoiding Collisions)

Для передачи данных или сообщения с одной стороны MU на другую сторону MU, с каждой из сторон MU имеется четыре регистра передачи (Transmit register) и четыре регистра приема (Receive register). Процессор А или процессор Б может получать непосредственный доступ к разделяемым ресурсам в памяти (shared memory) СнК (SoC). Однако для предотвращения одновременного доступа к разделяемой памяти (shared memory) со стороны обоих ядер MU предоставляет способ (предотвращения одновременного доступа) с использованием прерываний и регистров приема/передачи (transmit-receive registers) для обоих процессоров.

Поддержка различных частот тактирования ядер (Different Clocks in the Two Cores)

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

Отображенные на общую карту памяти регистры (Memory-Mapped Registers)

Модуль MU подключен как периферийный модуль на периферийной шине (Peripheral bus) с обеих сторон: со стороны процессора А — к периферийной шине процессора А (А Peripheral Bus), а со стороны процессора Б — к периферийной шине процессора Б (Б Peripheral Bus).

Карта памяти со стороны процессора А

Регистры сообщений (messaging registers), управления (control registers) и состояния (status registers) со стороны процессора А для MU отображаются на карту памяти процессора А как стандартные периферийные устройства. Шина данных (data bus) периферийной шины (Peripheral bus) внутри модуля MU имеет ширину 32 бит.

Карта памяти со стороны процессора Б

Регистры сообщений (messaging registers), управления (control registers) и состояния (status registers) со стороны процессора Б для MU отображаются на карту памяти процессора Б как стандартные периферийные устройства. Шина данных (data bus) периферийной шины (Peripheral bus) внутри модуля MU имеет ширину 32 бит.

Обмен сообщениями MU

Модуль MU предоставляет 32‑битные регистры состояния (status registers) и регистры управления (control registers) со стороны процессора Б и процессора А для операций управления (control operations), таких как прерывания (interrupts) и сброс (reset), и для проверки состояния другой стороны MU.

Для обмена сообщениями MU имеет четыре 32‑битных, доступных только для записи (write-only) регистра передачи (transmit registers) и четыре 32-битных, доступных только для чтения (read-only) регистра приема (receive registers) как со стороны процессора Б, так и со стороны процессора А. Эти регистры используются для отправки сообщений от одного процессора другому. Кроме того, передачей сообщений можно управлять, используя три флага общего назначения, имеющихся в регистрах управления (control registers) и регистрах состояния (status registers) с каждой из сторон MU.

Модель программирования

Логика обмена сообщениями используется совместно с внешней памятью. Есть различные методы, применяемые для реализации протокола обмена сообщениями. Некоторые из этих сообщений могут означать: «Я только что написал сообщение из N слов, начиная со смещения X в памяти» или «Я закончил чтение предыдущего блока памяти, который был прислан». Наличие логики обмена сообщениями, независимой от массива памяти, не ограничивается каким-либо предопределенным аппаратным протоколом. В то же время программное обеспечение, необходимое для управления сообщениями, является небольшим и простым.

Многие из механизмов обмена сообщениями симметричны; они продублированы и доступны как со стороны процессора Б, так и со стороны процессора А. Имеются следующие механизмы обмена сообщениями:

Четыре 32‑битных, доступных только для записи (write-only) регистра передачи (transmit registers), которые отображаются на четыре доступных только для чтения (read-only) регистра приема (receive registers) со стороны сопряженного процессора. Эти регистры можно использовать для обмена 32‑битными словами сообщений или кадром информации о сообщении, записанном в разделяемую память (количество слов, начальный адрес и код типа сообщения).

Запись в регистр передачи (transmit register) на передающей стороне очищает бит «передатчик пуст» (transmitter empty) в регистре состояния (Status Register) на стороне передатчика и устанавливает бит «приемник полон» (receiver full) в регистре состояния (Status Register) на стороне приемника. Установка бита на стороне приемника может дополнительно вызвать прерывание на стороне приемника (маскируемое прерывание при приеме).

Чтение одного из регистров приема (receive registers) на приемной стороне очищает бит «приемник полон» (receiver full) в регистре состояния (Status Register) на приемной стороне и устанавливает бит «передатчик пуст» (transmitter empty) в регистре состояния (Status Register) на стороне передатчика. Установка бита «передатчик пуст» (transmitter empty) может дополнительно вызывать прерывание на стороне передатчика (маскируемое прерывание при передаче).

Четыре флага общего назначения отображаются на биты регистра состояния (Status Register) на стороне приемника.

Доступ на чтение/запись к любым зарезервированным областям и запись в регистры, доступные только для чтения (read-only) на стороне процессора А модуля MU, приведет к генерации ошибки обмена данными для процессора А.

Доступ на чтение/запись к любым зарезервированным областям и запись в регистры, доступные только для чтения (read-only) на стороне процессора Б модуля MU, приведет к генерации ошибки обмена данными для процессора Б.

Примеры обмена сообщениями

В таблице 3 приведены примеры обмена сообщениями.

Таблица 3. Примеры обмена сообщениями

Пример

Описание

Обмен короткими сообщениями (Passing short messages)

Регистры передачи (transmit registers) можно использовать для обмена короткими сообщениями, длиной 1–4 слова. Например, если требуется пересылка сообщения, состоящего из четырех слов, то только один из регистров на стороне приемника должен иметь установленным соответствующий бит разрешения прерывания.
Первые три слова сообщения записываются в регистры с маскированными прерываниями, а четвертое слово записывается в другой регистр, который запускает прерывание на стороне приемника.

Обмен кадром информации (Passing frame information)

Регистры передачи (transmit registers) можно использовать для обмена кадрами информации для длинных сообщений, записанных в разделяемую память (SDRAM или SyncFLASH). Такой кадр информации обычно состоит из начального адреса, количества слов и, возможно, кода типа сообщения.

Обмен уведомлениями о событиях и запросами
(Passing event notices and requests)

События и запросы, в состав которых не входят слова данных, можно передать с помощью сигналов от процессора Б к процессору А, используя прерывание общего типа, такие как уведомления о том, что из разделяемой системной памяти (shared system memory) было прочитано длинное сообщение.

Обмен блоками данных фиксированной длины
(Passing fixed length data)

Форматированные данные фиксированной длины могут быть записаны в предопределенные области разделяемой памяти (shared memory). Процессор может использовать прерывание общего типа (процессор А или процессор Б), чтобы сообщить другому процессору о готовности данных.

Обмен уведомлениями (Passing announcements)

Три флага могут использоваться процессором для сообщения другому процессору о текущем состоянии программы или других сообщений с доски объявлений.

На рис. 4 показана схема распределения регистров MU.

Режимы работы

Перейдем к описанию всех функциональных режимов работы модуля.

Режимы пониженного энергопотребления

Начнем с описания рабочих режимов пониженного энергопотребления (low power modes) модуля MU.

Тактирование и синхронизация в режиме пониженного энергопотребления

Тактирование процессора Б и процессора А осуществляется на разных частотах и из различных источников. Архитектура MU какого-то определенного соотношения между частотами тактирования процессора А и процессора Б не предполагает. Однако следует иметь в виду, что соотношение этих частот влияет на значение пропускной способности MU. Буферы данных и управляющая логика с каждой из сторон MU работают от собственной соответствующей частоты тактирования.

Режимы пониженного энергопотребления процессора

Процессоры Processor имеют четыре режима энергопотребления:

  • рабочий режим или режим полной загрузки (Run);
  • режим ожидания (WAIT);
  • режим останова (STOP);
  • режим приостановки (SUSPEND или DSM).

Из режима пониженного энергопотребления процессор Processor можно вывести любым разрешенным с его стороны прерыванием MU, как отражено в регистре состояния (Status register) xSR (RF0–3, TE0–3, GIP0 — можно установить 3 бит) и разрешено в регистре управления (Control register) xCR. Используя эти биты, один из процессоров Processor может активно управлять выходом другого процессора Processor из режима пониженного энергопотребления.

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

Пока процессор Processor находится в режиме STOP, чтобы вывести процессор Processor из этого состояния, будет выставлено асинхронное прерывание:

  • Если любой из регистров передачи данных (transmit data register) со стороны другого процессора Processor заполнен, поскольку была осуществлена запись в него (регистр данных передачи) со стороны другого процессора Processor; то есть бит «пуст» (empty) его регистра xSR очищен, а его соответствующее прерывание по приему данных разрешено на стороне процессора Processor.
  • Если любой из регистров приема данных (receive data register) со стороны другого процессора Processor пуст, поскольку было выполнено чтение со стороны другого процессора Processor; то есть бит «полон» (full) его регистра xSR очищен, а его соответствующее прерывание по передаче разрешено на стороне процессора Processor.
  • Если любое прерывание общего вида установлено в регистре xCR, в то время как соответствующее прерывание разрешено со стороны процессора Processor.
  • Если другой процессор Processor выставляет немаскируемое прерывание к процессору Processor.

Логика позволяет одному из процессоров Processor функционировать независимо, в то время как другой процессор Processor находится в любом из режимов энергопотребления (включая режим STOP). Однако протокол изменения режима энергопотребления (power mode) процессора Processor должен обрабатываться с осторожностью:

  • Прерывания, разрешенные на стороне процессора Processor.
  • События, которые могут быть инициированы со стороны другого процессора Processor.
  • Совместимость с протоколом другого процессора Processor перехода в режим STOP.

Если процессор Processor находится в режиме STOP и запущено событие к другому процессору Processor, то бит EP (регистра xSR) будет пребывать в состоянии с высоким логическим уровнем до тех пор, пока не проснется процессор Processor.

Перед переходом в режим STOP программист процессора Processor должен убедиться, что бит EP (регистра xSR) очищен. Эта проверка необходима, чтобы быть уверенным, что все ожидающие обновления от процессора Processor, включая изменение режима работы при нахождении в режимах STOP или WAIT, будут обновлять биты регистра xSR.

Если другой процессор находится в режиме STOP mode или DSM mode, то бит EP (регистра xSR) может оставаться в состоянии с высоким логическим уровнем; в этом случае процессору Processor нет необходимости проверять бит EP перед переходом в режим STOP mode.

Временные параметры обновления событий

Каждая из сторон обмена сообщениями между процессорами MU (от процессора Б и от процессора А) имеет аппаратный механизм отправки «запроса на обновление событий» (event update requests) на сторону другого процессора. «Событие» (event) подразумевается, когда любое изменение информации должно быть отражено в регистре состояния (Status Register) принимающего процессора. Временем задержки обновления событий (event update latency) называется задержка между моментом, когда событие готово со стороны одного из процессоров, и фактическим обновлением регистра состояния (Status Register) со стороны другого процессора.

Минимальной задержкой события (event latency) является «1 цикл частоты тактирования с передающей стороны» + «2½ цикла частоты тактирования с принимающей стороны». Минимальным случаем является отсутствие ожидающего события при возникновении нового события.

Минимальной задержкой события (event latency) является «6 циклов частоты тактирования с передающей стороны» + «6½ цикла частоты тактирования с принимающей стороны». Максимальный случай наступает, если событие произошло сразу после того, как предыдущее событие было отправлено на другую сторону. Задержка обновления события (event update latency) будет располагаться между упомянутым выше минимальным и максимальным значением, в зависимости от момента времени, в который произошло последовательное событие.

Прерывания

Модуль MU управляет запросами на прерывание от процессора Б к процессору А и запросами на прерывание от процессора А к процессору Б. Рассмотрим подробнее все прерывания, которые может генерировать модуль.

Прерывания к процессорам

Имеется 12 источников прерываний от MU к процессорам (Processors):

  • Четыре прерывания по факту приема данных (выставляются, если устанавливаются биты процессоров Processor «приемник полон» (receive full) и в регистре xCR разрешены прерывания) для каждого из регистров приема (receive register).
  • Четыре прерывания по факту передачи данных (выставляются, если устанавливаются биты процессоров Processor «передатчик пуст» (transmit empty) и в регистре xCR разрешены прерывания) для каждого из регистров передачи (transmit register).
  • Четыре прерывания общего назначения (выставляются, когда установлены биты GIP и в регистре xCR разрешены прерывания).

Все прерывания являются маскируемыми в регистре управления процессором (Processor Control Register, xCR). Модуль MU не предполагает наличия каких-либо внутренних приоритетов для этих прерываний. Одновременно может быть выставлено несколько прерываний (например, прерывания по приему Receive 0 и Receive 1 или любые другие прерывания по передаче и прерывания общего назначения). Предполагается, что приоритет этих прерываний будет определяться контроллером прерываний на уровне всей микросхемы.

Для снятия прерываний к контроллеру прерываний микросхемы биты General Purpose Interrupt Pending bits (GIP0, GIP1, GIP2, and GIP3) должны очищаться программным образом (как часть процедуры обработки прерывания).

Последовательность очистки прерываний общего назначения

Когда процессор Processor осуществляет запись в бит прерывания общего назначения (general interrupt bit, GIR), событие записи синхронизируется по частоте тактирования другого процессора Processor для установки бита ожидания запроса прерывания общего вида (general interrupt request pending bit, GIP). Если бит GIP установлен и прерывание общего вида (general purpose interrupt) разрешено со стороны передающего процессора Processor (бит GIE установлен), то прерывание общего вида (general purpose interrupt) со стороны принимающего процессора Processor направляется передающему процессору Processor. Передающий процессор Processor очищает это прерывание записью «1» в бит GIP. Прерывание снимается сразу после того, как была произведена запись в бит GIP. Событие записи в бит GIP является асинхронным по отношению к частоте тактирования другого процессора Processor. Синхронизированный сигнал очищает бит GIR. Программное обеспечение не должно осуществлять повторную запись в бит GIR до тех пор, пока бит GIR не будет очищен.

Протоколы обмена сообщениями по прерываниям

Протоколы обмена сообщениями с использованием прерываний

Рассмотрим пример, когда процессор Processor отправляет другому процессору Processor последовательность сообщений из четырех слов. В этом примере прерывания по приему первого, второго и третьего слова запрещены, а прерывание по приему четвертого слова разрешено. Запись в регистры осуществляется последовательно n = 0, 1, 2, 3. Для n = 0, 1, 2, прерывания запрещены, поэтому к противоположному ядру не будет поступать никаких прерываний (хотя условия выставления прерываний выполняются). Для n = 3 прерывание разрешено, и по приему четвертого слова генерируется запрос на прерывание по приему данных (Receive Interrupt request).

  1. Последовательность записи данных:
    • процессор А записывает информацию из сообщения последовательно в свои регистры передачи (Регистры передачи (Transmit registers) могут быть использованы для прохождения информационных кадров о длинных сообщениях, записанных в разделяемой памяти (shared memory). В состав такого информационного кадра обычно входит начальный адрес, количество слов и, возможно, код типа сообщения) данных Transmit Registers 0, 1, 2;
    • затем происходит запись последнего блока информации в регистр передачи данных Transmit Register 3, после события синхронизации устанавливается бит RF3 регистра xSR, и немедленно выставляется прерывание по приему данных Receive 3 interrupt к другому процессору Б.
  1. Последовательность приема данных:
    • другой процессор Б принимает прерывание по приему данных Receive 3 interrupt и начинает чтение сообщения из приемных регистров;
    • после чтения приемного регистра Receive Register 3 очищается бит прерывания Receive 3 interrupt.

На рис. 5 показана модель программирования протокола обмена сообщениями с использованием регистров передачи (transmit register) и приема (receive register). Чтобы разобраться в последовательности действий при реализации протокола, используйте совместно таблицу 4 и рис. 5.

Таблица 4. Обобщенный протокол обмена сообщениями по прерываниям

Шаг

Действие

Описание

1

Запись данных процессором А

Данные, записанные в регистр ATRn на стороне процессора А, немедленно отображаются в регистре BRRn на стороне процессора Б.

2

Очистка бит Tx Empty и установка бита Rx Full

При записи данных в регистр ATRn:

  • очищается бит «передатчик пуст» (transmitter empty, TEn) в регистре состояния передачи (Transmit Status Register) процессора А;
  • устанавливается бит «приемник полон» (receiver full, RFn) в регистре состояния приема (Receive Status Register) процессора Б

3

Генерация запроса на прерывание по приему (Receive Interrupt request)

Установка бита «приемник полон» (receiver full, RFn) в регистре состояния приема (Receive Status Register) генерирует запрос на прерывание по приему (Receive Interrupt request) к процессору Б.

4

Чтение данных процессором Б

После приема запроса на прерывание (Receive Interrupt request) процессор Б выполняет чтение данных из регистра BRRn.

5

Очистка бита Rx Full и установка бита Tx Empty

При чтении данных из регистра BRRn:

  • очищается бит «приемник полон» (receiver full, RFn)
    в регистре состояния приема (Receive Status Register) процессора Б;
  • устанавливается бит «передатчик пуст» (transmitter empty, TEn) в регистре состояния передачи (Transmit Status Register) процессора А

6

Генерация запроса на прерывание (Transmit Interrupt request)

Установка бита «передатчик пуст» (transmitter empty, TEn) в регистре состояния передачи (Transmit Status Register) генерирует запрос на прерывание (Transmit Interrupt request) к процессору А, означающий готовность процессора Б к приему новой порции данных.

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

Протокол обмена сообщениями с использованием прерываний по событиям

События и запросы, не содержащие слов данных, могут быть переданы в виде сигналов процессором Б процессору А с помощью двух прерываний общего вида.

Форматированные данные фиксированной длины могут быть записаны в предопределенное место разделяемой памяти (shared memory). Процессор использует прерывание общего вида, чтобы сигнализировать другому процессору о готовности данных.

Три флага могут использоваться процессором, чтобы сообщить другому процессору о состоянии программы, которую он выполняет, или передать аналогичные сообщения.

В таблице 5 и на рис. 6 описана последовательность событий, когда процессор Processor выставляет прерывание.

Таблица 5. Обобщенный протокол обмена сообщениями по прерываниям

Шаг

Действие

Описание

1

Процессор А устанавливает бит запроса прерывания общего вида (General Interrupt request bit)

Процессор А устанавливает бит, связанный с прерыванием общего вида (General Interrupt request bit, GIRn = 1), в своем регистре управления (Control Register, ACR).

2

Устанавливается бит состояния ожидания прерывания общего вида (General Interrupt Request Pending status bit)

Бит состояния ожидания прерывания общего вида (General Interrupt Request Pending status bit, GIPn) регистра состояния процессора Б (Control Register, BSR) устанавливается в «1».

3

Генерируется запрос на прерывание общего вида (General Interrupt request) к процессору Б

Установка бита GIPn генерирует запрос на прерывание общего вида (General Interrupt request) к процессору Б. Для процессора Б должен быть установлен бит разрешения запроса на прерывание (Interrupt Request Enable bit, GIEn).

4

Процессор Б читает регистр состояния (Status Register)

Процессор Б читает бит GIPn регистра BSR.

5

Процессор Б обрабатывает прерывание

6

Процессор Б устанавливает бит GIPn, чтобы очистить прерывание

Процессор Б, чтобы очистить прерывание, записывает «1» в соответствующий бит GIPn.

7

Очищается бит GIRn

Установка бита GIPn в «1» очищает бит запроса на прерывание общего вида (General Interrupt request bit, GIRn) в регистре управления (Control Register, ACR) процессора А.

Исключительный доступ к разделяемой памяти

Модуль MU можно использовать, чтобы процессор сигнализировал о своем текущем доступе к разделяемой памяти (shared memory) и данные не перезаписывались другим процессором во время исключительного доступа к памяти.

Таблица 6. Выполнение процессором А исключительного доступа к разделяемой памяти

Шаг

Действие

Описание

1

Процессор А отправляет запрос GIRn процессору Б, используя регистр управления (Control Register, ACR) процессора А

Когда процессор А хочет выполнить исключительный доступ (exclusive access) к разделяемой памяти (shared memory), процессор А отправляет запрос на прерывание GIR0 процессору Б.

2

Процессор А отправляет запрос на исключительный доступ (exclusive access request), используя регистр передачи данных (transmit data register, ATRn)

Процессор А отправит запрос (кадр) на исключительный доступ (команда, расположение и размер захватываемой области) процессору Б, используя выбранный регистр передачи данных (transmit data register, ATR0).

3

Процессор А ожидает специализированного прерывания от процессора Б

Процессор А ожидает выставления специализированного прерывания (в качестве ответа), выставляемого процессором Б перед обработкой запроса на исключительный доступ.

4

Процессор А осуществляет исключительный доступ к разделяемой памяти (shared memory)

После приема специализированного прерывания от процессора Б процессор А начинает работу с выбранной областью памяти.

В таблице 6 описан протокол сигнализации, который процессор А применяет для информирования процессора Б о своем текущем доступе (на запись) к разделяемой памяти (shared memory). Предполагается, что набор битов и регистры (бит GIR0, регистр BRR0, регистр BTR0, бит GIR0, регистр ARR0, регистр ATR0) зарезервированы для поддержки исключительного доступа по протоколу разделяемой памяти (shared memory protocol, табл. 7–9).

Таблица 7. Сканирование процессором Б информации о транзакции

Шаг

Действие

Описание

1

Процессор Б принимает прерывание от регистра приема данных (receive data register, BRRn)

2

Процессор Б считывает информацию из регистра приема данных (receive data register, BRRn)

3

Процессор Б сканирует содержимое регистра приема данных (receive data register)

Для получения информации о транзакции (запросил ли процессор А исключительный доступ)

Таблица 8. Процессор Б разрешает процессору А исключительный доступ к памяти

Шаг

Действие

Описание

1

Процессор Б выставляет специализированное прерывание

Процессор Б отвечает на запрос от процессора А выставлением специализированного прерывания (ack) к процессору А.

2

Процессор Б отправляет кодовое сообщение процессору А

Вместе с ответным прерыванием процессор Б отправляет кодовое сообщение процессору А, используя выбранный регистр передачи (transmit register, BTRn). Сообщение информирует процессор А, что он может использовать исключительный доступ к разделяемой памяти (shared memory).

Таблица 9. Процессор Б отклоняет процессору А исключительный доступ к памяти

Шаг

Действие

Описание

1

Процессор Б игнорирует запрос от процессора А на исключительный доступ

Если процессор Б не желает давать процессору А запрошенные привилегии, то процессор Б игнорирует запрос на исключительный доступ.

Передача пакетов данных

Рассмотрим пример последовательности пакетной передачи данных между подсистемами процессора Б и процессора А. Основные этапы процесса представлены в таблице 10.

Таблица 10. Последовательность передачи пакетов данных

Шаг

Действие

Описание

1

Процессор Б запрашивает прямой доступ к памяти (DMA)

Процессор Б отправляет запрос на DMA, чтобы инициализировать пакетную передачу данных.

2

Передача данных по прямому доступу к памяти (DMA)

Ответ на запрос прямого доступа (DMA).

3

Контроллер прямого доступа к памяти (DMA) начинает передачу данных из выбранной процессором Б области в заданную область разделяемой памяти (shared memory).

4

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

5

Процессор Б информирует процессор А о том, что данные находятся в разделяемой памяти (shared memory)

Используя регистр передачи (transmit register) модуля MU на стороне процессора Б, процессор Б отправляет информацию о пакетном сообщении процессору А, чтобы информировать процессор А о поступлении новых пакетных данных, хранящихся в разделяемой памяти (shared memory).

Сообщение содержит информацию о команде, расположении и длине пакетных данных.

6

Процессор А принимает прерывание

Процессор А принимает прерывание (предполагается, что соответствующее прерывание
по приему данных на стороне процессора А модуля MU разрешено), ожидает,
пока обработка задачи станет активной, и обрабатывает пакетные данные из памяти.

7

Процессор А считывает данные и записывает их

Процессор А считывает или обрабатывает пакетные данные из разделяемой памяти (shared memory).

8

Процессор А записывает результаты обработки пакета в отдельный буфер.

9

Процессор А информирует процессор Б о том, что передача данных завершена

После завершения обработки пакета данных процессор А сообщает об этом процессору Б, используя регистр передачи (transmit register, ATRn) со стороны процессора А модуля MU.

10

Процессор А выставляет прерывание к процессору Б (запрос следующей порции данных)

Процессор Б принимает следующее прерывание от процессора А, в котором процессор А требует следующую порцию пакетных данных.

Сброс модуля MU

В модуле MU предусмотрено два источника сброса, и каждый тип сброса имеет различную функцию с точки зрения MU или системы:

  • одну асинхронную подсистему, которая подключена с обеих сторон интерфейсов MU;
  • один программируемый аппаратный сброс (бит MUR) в регистре ACR (со стороны процессора А), таблица 11.
Таблица 11. Программируемый сброс MU

Тип сброса

Описание

Сброс MU
процессором А
(А MU reset)

  • Процессор А устанавливает* бит «сброс» (Reset bit, MUR) регистра ACR модуля MU.
  • Сброс MUR влияет на подсистемы обмена сообщениями со стороны обоих процессоров А и Б.
    Сброс MUR вызывает возврат всех регистров управления (control register) и состояния (status register) к их значениям по умолчанию, а также очистку всех внутренних состояний.
  • Программное обеспечение процессора А запрашивает, будет использоваться сброс MUR или нет.
  • Инструкция, следующая непосредственно за установкой бита MUR, не должна производить запись в регистры MU. Такая запись может быть перезаписана последовательностью сброса, и регистр останется со значением после сброса.
    Следует пропустить хотя бы одну инструкцию (после установки бита MUR) перед попыткой записи в регистры MU.

Примечание.

*Установка бита MUR является деликатной операцией, поскольку она воздействует на регистры с противоположной стороны асинхронно. Установка бита MUR может вызвать непредсказуемое поведение, если, например, процессор Б одновременно проверяет биты регистра MU (бит TE регистра SR процессора Б). Перед установкой бита MUR необходимо убедиться, что процессор Б в настоящее время не занимается обменом сигналами через MU.

После события сброса бита MUR программист процессора А может проконтролировать, что последовательность сброса на стороне процессора Б завершена, проверив значение бита RS регистра ASR.

 

Ограничения на программное обеспечение

Далее описаны некоторые ограничения для программного обеспечения, осуществляющее доступ к MU.

Общие ограничения

В этом разделе описаны ограничения, применимые к обеим сторонам (процессор А и процессор Б) модуля MU.

Запись-после-записи (Write-After-Write) в регистр передачи

Запись в регистр передачи (transmit register) сигнализирует приемной стороне, что данные готовы для извлечения.

  • Повторная запись в регистр передачи (transmit register) без проверки того, что данные были получены, запрещена, поскольку передающая сторона (transmitter side) не имеет способа точно определить момент, когда приемная сторона будет пытаться получить данные.
  • Перед попыткой повторной записи в регистр передачи (transmit register) передающая сторона (transmitter side) должна дождаться прерывания «передатчик пуст» (Transmitter empty) или опрашивать бит «передатчик пуст» (Transmitter empty) регистра состояния (Status Register).
  • Несоблюдение этих ограничений может привести к чтению неверных данных на приемной стороне (receiver side) модуля MU.

Чтение-после-чтения (Read-After-Read) из регистра чтения

Чтение регистра чтения (receive register) сигнализирует передающей стороне (transmitter side), что данные можно записывать в регистр передачи. Аналогично процессор с принимающей стороны не должен читать регистр приема (receive register) перед получением прерывания «приемник полон» (Receiver Full) или опрашивать бит «приемник полон» (Receiver Full) регистра состояния (Status Register).

  • Повторное чтение регистра приема (receive register) без проверки, что данные были записаны, запрещено, поскольку приемная сторона (receiver side) не имеет способа определить момент времени, в который передатчик будет пытаться записать данные.
  • Перед попыткой повторного чтения регистра приема (receive register) приемная сторона (receiver side) должна дождаться прерывания «приемник полон» (Receiver Full) или опрашивать бит «приемник полон» (Receiver Full) регистра состояния (Status Register).
  • Несоблюдение этих ограничений может привести к записи неверных данных на передающей стороне (transmitter side) модуля MU.

Ограничения на процессор Processor

Рассмотрим список ограничений, относящихся к каждой из сторон процессора Processor в модуле MU.

Перед переходом в режим пониженного энергопотребления

Перед переходом в режим пониженного энергопотребления (Low Power mode, LPM) процессор Processor должен проверить, что бит ожидания событий Processor Event Pending (EP) регистра состояния Status Register очищен.

Если бит Event Pending (EP) все еще установлен в «1», то процессор Processor перед выполнением инструкции LPM должен перейти в режим ожидания и опрашивать бит EP до тех пор, пока он не будет очищен.

Следует отметить, что если другой процессор Processor находится в режиме пониженного энергопотребления Low Power mode (запрограммированный в модуле управления тактированием, CCM), то бит EP может залипнуть в состоянии с высоким уровнем. В таком случае необходимо включить тактирование другого процессора Processor, чтобы бит EP очистился, перед тем как процессор Processor сможет перейти в режим пониженного энергопотребления (Low Power mode).

Чтобы определить, в каком режиме энергопотребления находится другой процессор Processor, активный процессор Processor может проверить биты PM его регистра xSR.

Перед установкой бита запроса на прерывание общего вида GIR0–3

Перед установкой бита запроса на прерывание общего вида (General Interrupt Request bit) GIR0–3 необходимо проверить, что бит GIRn очищен. Это означает, что нет ожидающих обработки прерываний общего вида (general interrupt). В общем случае попытка повторной установки бита GIRn, пока он установлен в «1», будет игнорироваться, но в некоторых случаях такая попытка может привести к генерации вторичного прерывания. Это ограничение необходимо для предотвращения такого рода недетерминированного поведения.

Ограничения на бит сброса

На бит сброса (MUR, HR) накладываются следующие ограничения:

  • перед установкой бита MUR регистра ACR необходимо убедиться, что со стороны процессора Б не выполняется никаких операций с модулем MU;
  • нельзя производить запись в регистры MU немедленно после установки бита MUR регистра ACR, поскольку записываемые данные могут быть переписаны значениями после сброса.

 

Заключение

В статье были рассмотрены основные особенности аппаратной реализации системы межпроцессорного взаимодействия (IPC) между ядрами ARM Cortex-M4 и ARM Cortex-A9/A7 в СнК i.MX6 и i.MX7 и подробно описан модуль обмена сообщениями (Messaging Unit, MU). Модуль обеспечивает передачу коротких (до 32 бит) сообщений или пакетов (дескрипторов) для обмена большими сообщениями, хранящимися в выделенных областях разделяемой памяти (shared memory). В следующей статье пойдет речь о механизме семафоров, обеспечивающем синхронизацию исключительного доступа процессоров к разделяемым ресурсам.

Литература
  1. i.MX 6SoloX Applications Processor Reference Manual. www.nxp.com/docs/en/reference-manual/IMX6SXRM.pdf
  2. i.MX 7Solo Applications Processor Reference Manual. www.nxp.com/docs/en/reference-manual/IMX7SRM.pdf
  3. i.MX 7Dual Applications Processor Reference Manual. www.nxp.com/docs/en/reference-manual/IMX7DRM.pdf

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *