Межпроцессорное взаимодействие (IPC) в многоядерных микроконтроллерах.
Часть 2. Модуль IPC микроконтроллеров TI Concerto

№ 4’2018
PDF версия
В предыдущей статье было рассказано о способах организации межпроцессорного взаимодействия в микроконтроллерах с ядрами Cortex-M4 и Cortex-M0/M0+. Предлагаемая публикация посвящена межпроцессорному взаимодействию в микроконтроллерах Concerto корпорации Texas Instruments (TI), состоящих из процессорного ядра Cortex-M3 и ядра цифровой обработки сигналов C28x. Автор уже обращался к описанию функциональных особенностей микроконтроллеров Concerto и рад возможности продолжить тему, начатую в [3, 4].

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

Микросхемы Concerto представляют собой двухъядерные микроконтроллеры, в состав которых входит стандартное для промышленных применений ядро Cortex-M3 и хорошо зарекомендовавшее себя при решении задач управления реального времени ядро C28x из семейства C2000. Кроме того, в составе микроконтроллера имеется аналоговая подсистема, доступная для обоих ядер, и модуль межпроцессорного взаимодействия. Структурная блок-схема микроконтроллеров Concerto показана на рис. 1.

Блок-схема микроконтроллеров F28M35xx Concerto

Рис. 1. Блок-схема микроконтроллеров F28M35xx Concerto

Модуль межпроцессорного взаимодействия (Inter Processor Communications, IPC) обеспечивает обмен данными между главной подсистемой (master subsystem) на базе микроконтроллера Cortex-M3 (далее — подсистема M3) и управляющей подсистемой (control subsystem) на базе цифрового сигнального процессора C28x из семейства C2000 (далее — подсистема C28x). Механизм IPC может использоваться подсистемами M3 и C28x для запроса/обмена информацией между ними, а также для пересылки уведомлений между двумя подсистемами о состоянии любых зависимых задач.

Модуль обладает шестью основными функциональными особенностями:

  • ОЗУ сообщений MSGRAM;
  • флаги и прерывания IPC Flags and Interrupts;
  • регистры сообщений IPC Message Registers;
  • семафор заполнения flash-памяти Flash Pump Semaphore;
  • семафор конфигурирования тактирования
    Clock Configuration Semaphore;
  • свободно работающий счетчик (Free running counter).

Наряду с перечисленными особенностями модуль IPC имеет некоторое количество загрузочных регистров (boot register), используемых кодом загрузчика (boot ROM code) для идентификации режимов загрузки и загрузочных состояний. Дополнительную информацию о загрузочных регистрах (boot register) модуля IPC можно найти в разделе M‑Boot ROM Description документа [2].

ОЗУ сообщений MSGRAM

В микроконтроллере есть специализированная область ОЗУ размером 2 кбайт для сообщений от подсистемы M3 к подсистеме C28x (MTOC-message RAM, MTOCMSGRAM), с которой подсистема M3 может производить операции чтения/записи, а подсистема C28x — только операции чтения. Кроме того, имеется и другая специализированная область ОЗУ размером 2 кбайт для сообщений от подсистемы C28x к подсистеме M3 (CTOM-message RAM, CTOMMSGRAM), с которой подсистема C28x проводит операции чтения/записи, а подсистема M3 выполняет операции чтения. Для MTOCMSGRAM, CPU и контроллер μDMA подсистемы M3 имеют доступ на чтение и запись, в то время как CPU и контроллер DMA подсистемы C28 имеют доступ только на чтение. Аналогично, для CTOMMSGRAM,
CPU и контроллер DMA подсистемы C28 будут иметь доступ на чтение и запись, в то время как CPU и контроллеру μDMA подсистемы M3 разрешено только чтение. Эти свойства сведены в таблицу 1.

Таблица 1. Доступ на чтение/запись к области MSGRAM модуля IPC

ОЗУ

C28x

M3

28x DMA

M3 μDMA

ОЗУ сообщений от C28x к M3 (2 кбайт)

R/W

R

R/W

R

ОЗУ сообщений от M3 к C28x (2 кбайт)

R

R/W

R

R/W

Из соображений безопасности доступ на запись к MSGRAM для контроллеров DMA1 обеих подсистем можно сконфигурировать с помощью регистров MTOCMSGRCR и CTOMMSGRCR для ядер M3 и C28x соответственно. Дополнительную информацию об этих регистрах можно получить в главе Internal Memory документа [2].

Нет никакого аппаратного соответствия между флагами/прерываниями модуля IPC и ОЗУ сообщений. Возможно их совместное использование для реализации наилучшего способа обмена данными между ядрами/подсистемами. В программном обеспечении должен быть реализован протокол использования ОЗУ сообщений с флагами/прерываниями модуля IPC. Детально процесс инициализации и конфигурирования MSGRAM описан в главе Internal Memory документа [2].

ОЗУ сообщений можно применить для прохождения сообщений между двумя подсистемами. Когда подсистема M3 записывает сообщение в MTOCMSGRAM, она может использовать флаги MTOCIPC или прерывания, чтобы известить подсистему C28x о готовности сообщения для считывания и обработки. Аналогично, когда подсистема C28x записывает сообщение в CTOMMSGRAM, она может использовать флаги CTOMIPC или прерывания, чтобы проинформировать подсистему M3 о готовности сообщения для считывания и обработки.

Флаги и прерывания IPC

В IPC имеется 32 канала квитирования (handshake channel) от главной подсистемы (master system) к управляющей подсистеме (control system) и наоборот для обеспечения обмена данными между ядрами, основанного на программных флагах. Четыре из этих 32 каналов (1–4) можно применить для генерации IPC-прерываний от одного ядра к другому. Эти каналы квитирования (handshake channel) используются совместно с ОЗУ сообщений (Message RAM) для реализации механизма программного квитирования между двумя ядрами. На рис. 2 показан механизм обмена сообщениями с помощью флагов и прерываний модуля IPC.

Обмен сообщениями с помощью флагов и прерываний модуля IPC

Рис. 2. Обмен сообщениями с помощью флагов и прерываний модуля IPC

Обмен данными от подсистемы M3 к подсистеме C28

Когда сообщение готово для передачи от подсистемы M3 к подсистеме C28x, подсистема M3 может уведомить об этом подсистему C28x, используя флаги MTOCIPC или прерывания (флаги 1–4). Подсистема C28x, в результате опроса флагов MTOCIPC или в результате получения запроса на прерывание MTOCIPC, может ответить на сообщение, посланное подсистемой M3. В карте памяти подсистемы M3 имеется три 32‑битных регистра: MTOCIPCFLG, а еще два 32-битных регистра MTOCIPCSTS и MTOCIPCACK предназначены для реализации основанного на флагах обмена сообщениями от M3 к C28x. Регистр MTOCIPCSET содержит 32 бита, каждый из которых при установке может активировать соответствующий бит флага в регистре MTOCIPCFLG подсистемы M3 и бит состояния в регистре MTOCIPCSTS подсистемы C28x.

Приведем пример межпроцессорного взаимодействия MTOCIPC:

  1. Когда подсистема M3 хочет сообщить подсистеме C28x о готовности сообщения, подсистема M3 может установить бит 9 (IPC flag 10) в регистре MTOCIPCSET.
  2. Это действие подсистемы M3 наряду с установкой бита 9 регистра MTOCIPCFLG подсистемы M3 приведет к установке бита 9 регистра MTOCIPCSTS подсистемы C28x. Регистр MTOCIPCFLG подсистемы M3 и регистр MTOCIPCSTS подсистемы C28x физически являются одним и тем же регистром, но имеют разные имена в разных подсистемах: регистр FLG в подсистеме M3 и регистр STS в подсистеме C28x.
  3. При ожидании нового сообщения подсистема C28x может опрашивать бит 9 (IPC flag 10) регистра MTOCIPCSTS. После установки бита 9 регистра MTOCIPCSTS подсистема C28x либо прочитает сообщение, либо выполнит другое необходимое действие, в зависимости от архитектуры пользовательского приложения.
  4. Когда подсистема C28x должна ответить подсистеме M3 о приеме сообщения, формируется запрос MTOCIPC установкой бита 9 регистра MTOCIPCACK, что приводит к очистке бита 9 регистра MTOCIPCFLG и регистра MTOCIPCSTS. Следует отметить, что регистр MTOCIPCCLR подсистемы M3 и регистр MTOCIPCACK подсистемы C28x физически являются одним и тем же регистром, но имеют разные имена в разных подсистемах: регистр CLR в подсистеме M3 и регистр ACK в подсистеме C28x.

Для каждого бита регистра MTOCIPCSET, имеется бит в регистре MTOCIPCCLR. Подсистема M3 может установить бит регистра MTOCIPCCLR, чтобы очистить соответствующий флаг (бит флага, flag bit, в регистре MTOCIPCFLG и бит состояния, status bit, в регистре MTOCIPCSTS), который подсистема M3 перед этим установила, используя регистр MTOCIPCSET. В общем случае подсистема C28x должна ответить на запрос MTOCIPC, используя регистр MTOCIPCACK, который очистит бит MTOCIPCFLG и биты MTOCIPCSTS. Однако, если подсистема M3 не примет никакого ответа от подсистемы C28x о приеме сообщения в предполагаемом направлении, прикладное программное обеспечение подсистемы M3 должно ожидать очистки ранее установленного флага запроса MTOCIPC. В таком сценарии подсистема M3 может очистить флаги запросов, выставленные ранее установкой соответствующих битов регистра MTOCIPCCLR.

Из 32 флагов MTOCIPC — первые четыре (биты 0–3) могут генерировать соответствующие прерывания MTOCIPC (с MTOCIPCINT1 по MTOCIPCINT4) к подсистеме C28x, если активирован блок распространения периферийных прерываний (peripheral interrupt expansion, PIE). Оставшиеся 28 бит (биты 4–31) могут использоваться в основанном на программном обеспечении механизме квитирования (handshake mechanism flag/ack), как было описано выше.

Следует отметить, что регистры MTOCIPCSET имеют тип доступа «только на запись» (write-only, WO) со стороны подсистемы M3 и при попытке чтения всегда возвращают 0. Подсистема M3 должна прочитать значение регистра MTOCIPCFLG, чтобы увидеть отложенные запросы. Регистры MTOCIPCFLG и MTOCIPCSTS доступны только для чтения (read-only, RO) и всегда будут отражать текущее состояние соответствующего флага IPC, был ли он установлен или очищен. Биты MTOCIPCCLR и MTOCIPCACK доступны только на запись (write-only, WO), и при их чтении всегда будет возвращаться 0.

Обмен данными от подсистемы C28 к подсистеме M3

Когда сообщение готово для передачи из подсистемы C28x в подсистему M3, подсистема C28x может сообщить об этом подсистеме M3, используя флаги CTOMIPC или прерывания. Подсистема M3, опрашивая флаги CTOMIPC или принимая прерывание CTOMIPC, может ответить на сообщение, отправленное подсистемой C28x. Имеется три 32‑битных регистра: CTOMIPCSET, CTOMIPCCLR и CTOMIPCFLG — в карте памяти подсистемы C28x, и два 32‑битных регистра: CTOMIPCSTS и CTOMIPCACK — для реализации основанного на флагах (flag-based) обмена сообщениями от подсистемы C28x к подсистеме M3. Регистр CTOMIPCSET содержит 32 бит, каждый из которых при установке способен активировать соответствующий бит флага (flag bit) в регистре CTOMIPCFLG подсистемы C28x и бит состояния (status bit) в регистре CTOMIPCSTS подсистемы M3.

Приведем пример межпроцессорного взаимодействия CTOMIPC:

  1. Когда подсистема C28x хочет сообщить подсистеме M3 о готовности сообщения, подсистема C28x может установить бит 9 (IPC flag 10) в регистре CTOMIPCSET.
  2. Это действие подсистемы C28x наряду с установкой бита 9 регистра CTOMIPCSTS подсистемы M3 приведет к установке бита 9 регистра CTOMIPCFLG подсистемы C28x. Регистр CTOMIPCFLG подсистемы C28x и регистр CTOMIPCSTS подсистемы M3 физически являются одним и тем же регистром, но имеют разные имена в разных подсистемах: регистр FLG в подсистеме C28x и регистр STS в подсистеме M3.
  3. При ожидании нового сообщения подсистема M3 может опрашивать бит 9 (IPC flag 10) регистра CTOMIPCSTS.
  4. После установки бита 9 регистра CTOMIPCSTS подсистема M3 может прочитать сообщение или выполнить любые другие действия, в зависимости от архитектуры пользовательского приложения.
  5. Затем подсистема M3 должна ответить подсистеме C28x, что она приняла запрос CTOMIPC, установив бит 9 регистра CTOMIPCACK, что приведет к очистке бита 9 регистра CTOMIPCFLG и регистра CTOMIPCSTS.

Для каждого бита регистра CTOMIPCSET имеется бит в регистре CTOMIPCCLR. Подсистема C28x может устанавливать биты регистра CTOMIPCCLR, чтобы очистить соответствующие флаги (flag bit в регистре CTOMIPCFLG и status bit в регистре CTOMIPCSTS), которые подсистема C28x установила ранее, используя регистр CTOMIPCSET. В общем случае подсистема M3 должна ответить на запрос CTOMIPC, используя регистр CTOMIPCACK, очистив биты CTOMIPCFLG и CTOMIPCSTS. Однако если подсистема C28x не принимает никакого ответа от подсистемы M3 о приеме сообщения в ожидаемом направлении, программное обеспечение подсистемы C28x должно ожидать очистки флага запроса CTOMIPC, который она установила ранее. В таком сценарии подсистема C28x может очищать флаги запросов, поднятые ранее установкой соответствующих битов в регистре CTOMIPCCLR.

Из 32 флагов CTOMIPC первые четыре бита (биты 0–3) могут генерировать соответствующие прерывания CTOMIPC (с CTOMIPCINT1 по CTOMIPCINT4) к контроллеру NVIC подсистемы M3, если они были разрешены. Оставшиеся 28 бит (биты 4–31) могут использоваться в основанном на программном обеспечении механизме квитирования (handshake mechanism flag/ack), как описано выше.

Следует отметить, что регистры CTOMIPCSET доступны только для записи (write-only) со стороны подсистемы C28x и при их чтении всегда будет возвращаться 0. Чтобы увидеть отложенные запросы, подсистема C28x должна прочитать регистр CTOMIPCFLG. Регистры CTOMIPCFLG и CTOMIPCSTS доступны только для чтения (read-only) и всегда будут отражать текущее состояние соответствующего флага IPC, был ли он запрошен или очищен. Биты CTOMIPCCLR и CTOMIPCACK доступны только для записи (write-only), и попытка прочитать их значение всегда вернет 0. При попытке одновременного доступа на запись к одним и тем же битам регистра CTOMIPCACK и CTOMIPCSET, когда CPU подсистемы M3 попытается очистить биты, а CPU подсистемы C28 попытается установить биты, приоритет получит CPU подсистемы C28.

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

Приведем примеры программной реализации межпроцессорного взаимодействия (IPC).

Межпроцессорное взаимодействие (IPC) с использованием прерываний

Рассмотрим вариант использования межпроцессорного взаимодействия (IPC) в ситуации, когда CPU подсистемы M3 хочет принять некоторую информацию из подсистемы C28x, используя MTOCIPCINT1:

Подсистема M3 записывает «1» в bit 0 регистра MTOCIPCSET, в результате генерируется прерывание MTOCIPCINT0 к подсистеме C28x посредством ее блока PIE.

Bit 0 в регистрах MTOCIPCFLG и MTOCIPCSTS установлен. Подсистема C28x обрабатывает прерывание, и в соответствующем обработчике прерываний (ISR) подсистема C28x загружает предопределенную информацию в разделяемое ОЗУ (shared RAM) или буферное ОЗУ сообщений CTOMmessage RAM (пользовательское приложение может определять функциональность ISR).

Подсистема C28x очищает запрос MTOCIPC, записывая «1» в bit 0 регистра MTOCIPCACK в конце обработчика прерываний (ISR).

Подсистема M3 опрашивает состояние bit 0 регистра MTOCIPCFLG до тех пор, пока состояние не станет «1». Это будет означать, что CPU подсистемы C28x не обработал прерывание. Когда состояние станет «0», это будет означать, что CPU подсистемы C28x обработал прерывание, прочитав содержимое предопределенной области ОЗУ (RAM), и получил необходимую информацию.

Межпроцессорное взаимодействие (IPC) с использованием флагов

Рассмотрим пример межпроцессорного взаимодействия (IPC), когда CPU подсистемы C28x хочет обменяться сообщением о разделяемых ресурсах с подсистемой M3, используя flag 5 регистра CTOMIPC:

Подсистема C28x записывает «1» в bit 5 регистра CTOMIPCSET, чтобы сообщить, что подсистема M3 может захватить и применить определенные ресурсы, поскольку подсистема C28x закончила их использование. (В пользовательском программном обеспечении flag 6 межпроцессорного взаимодействия (IPC) будет привязан к конкретному ресурсу и задаче.)

Когда подсистема M3 захочет использовать этот ресурс, она прочитает bit 5 регистра CTOMIPCSTS. Если подсистема M3 прочитает bit 5 регистра CTOMIPCSTS как «1», то она сможет использовать разделяемый ресурс, предопределенным образом привязанный к флагу flag 6 межпроцессорного взаимодействия (IPC).

После завершения задачи использования разделяемого ресурса, привязанного к IPC5, CPU подсистемы M3 очистит флаг, записав «1» в bit 5 регистра CTOMIPCACK.

Когда bit 5 регистра CTOMIPCFLG установлен в «1», а флаг все еще не очищен CPU подсистемы M3, то, если CPU подсистемы C28 попытается прочитать bit 5 регистра CTOMIPCFLG, он прочитает его как «1». Когда флаг очищен подсистемой M3, bit 5 регистра CTOMIPCFLG будет читаться как «0». На основании этого программное обеспечение подсистемы C28 начнет выполнять действия в соответствии со своими задачами.

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

Регистры сообщений для межпроцессорного обмена IPC Message Register обеспечивают простейший и гибкий путь обмена сообщениями между подсистемами M3 и C28x. В подсистемах предусмотрено по четыре специализированных регистра сообщений IPC Message Register. Не существует особых аппаратных требований по использованию этих регистров. Определяет их способ применения пользовательское прикладное програм-мное обеспечение. Регистры выполняют роль почтовых ящиков (mailboxes) для обмена сообщениями между двумя подсистемами в ситуациях, когда программное обеспечение не может использовать для межпроцессорного обмена данными оперативную память. Регистры IPC Message register каждой из подсистем доступны со стороны другой подсистемы.

Регистры IPC Message register, которые подсистема M3 задействует для обмена сообщениями с подсистемой C28x, описаны в таблице 2.

Таблица 2. Регистры сообщений Message Register направления MTOCIPC

Имя регистра

Описание

Права доступа для M3

Права доступа для C28x

MTOCIPCCOM

Регистр команды MTOC IPC

Read/Write

Read only

MTOCIPCADDR

Регистр адреса MTOC IPC

Read/Write

Read only

MTOCIPCDATAW

Регистр записи данных MTOC IPC

Read/Write

Read only

MTOCIPCDATAR

Регистр чтения данных MTOC IPC

Read only

Read/Write

Регистры IPC Message register, которые подсистема C28x может использовать для обмена сообщениями с подсистемой M3, описаны в таблице 3.

Таблица 3. Регистры сообщений Message Register направления CTOMIPC

Имя регистра

Описание

Права доступа для C28x

Права доступа для M3

CTOMIPCCOM

Регистр команды CTOM IPC

Read/Write

Read only

CTOMIPCADDR

Регистр адреса CTOM IPC

Read/Write

Read only

CTOMIPCDATAW

Регистр записи данных CTOM IPC

Read/Write

Read only

CTOMIPCDATAR

Регистр чтения данных CTOM IPC

Read only

Read/Write

Рассмотрим пример действия этих регистров. Предположим, что пользовательское приложение имеет сценарий, где подсистеме M3 необходим доступ к данным, расположенным в одной из областей памяти, отображенной на подсистему C28x, к которой подсистема M3 не имеет прямого доступа на чтение. Для реализации этого сценария программа должна разрабатываться таким образом, чтобы:

  1. Когда подсистеме M3 необходимо подучить данные из области памяти подсистемы C28x, подсистема M3 должна записать значение 0x0000007 (представляющее команду «чтение 16‑разрядных данных») в регистр MTOCIPCCOM и затем направить свое пожелание подсистеме C28x, чтобы прочитать данные в регистре MTOCIPCADDR.
  2. После записи сообщений в IPC Message registers подсистема M3 должна выставить запрос на межпроцессорный обмен (IPC), используя либо флаг MTOCIPC, либо прерывание.
  3. После получения подсистемой C28x запроса на межпроцессорный обмен (IPC request) от подсистемы M3 программное обеспечение C28x должно быть настроено на чтение регистра MTOCIPCCOM и иметь представление о том, что команда 0x00000007 означает чтение 16‑разрядных данных.
  4. После распознавания команды програм-мное обеспечение подсистемы C28x должно прочитать регистр MTOCIPCADDR, чтобы получить записанный подсистемой M3 адрес.
  5. Затем программное обеспечение подсистемы C28x должно прочитать данные по этому адресу и записать полученные в результате чтения заданной области памяти данные в регистр MTOCIPCDATAR для чтения их подсистемой M3.

Таким образом, пользовательское приложение может определить процедуру использования регистров межпроцессорного обмена IPC Message register для обмена данными между двумя подсистемами в режиме почтового ящика (mailbox).

Семафор Flash Pump Semaphore

В каждой микросхеме предусмотрено два банка flash-памяти. Один банк расположен в подсистеме M3, а другой — в подсистеме C28x. Ядро M3 может стирать, программировать и читать свой банк flash-памяти. Ядро подсистемы C28x также может стирать, программировать и читать свой банк flash-памяти. Но при выполнении операций стирания/программирования оба банка flash-памяти пользуются одним и тем же блоком flash pump. Следовательно, только одно ядро в каждый момент времени способно выполнять операции стирания/программирования над своим банком flash-памяти.

Когда ядро M3 выполняет операции стирания/программирования над банком flash-памяти подсистемы M3, ядро C28x не может стирать/программировать банк flash-памяти подсистемы C28x, но ядро C28x может выполнять код и/или считывать данные из банка flash-памяти подсистемы C28x. Аналогично, когда ядро C28x выполняет операции стирания/программирования над банком flash-памяти подсистемы C28x, ядро M3 не может стирать/программировать банк flash-памяти подсистемы M3, но ядро M3 способно выполнять код и/или считывать данные из банка flash-памяти подсистемы M3.

Поскольку оба банка управляются с помощью единственного блока flash pump, сигналы управления flash pump будут контролироваться либо контроллером C28x-Flash Module Controller, либо контроллером M3‑Flash Module Controller на основании состояния аппаратного семафора, называемого flash pump semaphore (PUMPREQUEST). Этот семафор доступен со стороны обоих ядер из их собственных карт распределения памяти в области регистров межпроцессорного взаимодействия (IPC register space). Семафор flash pump semaphore обозначается MPUMPREQUEST в карте распределения памяти подсистемы M3 и CPUMPREQUEST — в карте распределения памяти подсистемы C28x. На рис. 3 показано выделение flash pump для различных состояний семафора flash pump semaphore (2‑битовое поле SEM в регистрах PUMPREQUEST).

Выделение flash pump для различных состояний семафора

Рис. 3. Выделение flash pump для различных состояний семафора

По умолчанию после сброса flash pump отображается на карту памяти подсистемы M3 со значением семафора «00». Несмотря на то, что flash pump по умолчанию отображается на карту памяти подсистемы M3, при необходимости стирать/программировать банк flash-памяти подсистемы M3 ядро подсистемы M3 должно захватить управление flash pump путем записи значения «10» в регистр MPUMPREQUEST. Это не даст подсистеме C28x возможности захватить семафор flash pump semaphore, когда ядро подсистемы M3 выполняет операции стирания/программирования этого банка. После того как ядро подсистемы M3 завершит операции стирания/программирования своего банка, оно должно освободить управление flash pump записью значения «00» в семафор MPUMPREQUEST, затем подсистема C28x сможет при необходимости захватить управление flash pump.

Аналогично, при необходимости стирать/программировать банк flash-памяти подсистемы C28x ядро подсистемы C28x должно захватить управление flash pump путем записи значения «01» в регистр CPUMPREQUEST. Это не даст подсистеме M3 возможности захватить семафор
flash pump semaphore, когда ядро подсистемы C28x выполняет операции стирания/программирования данного банка. После того как ядро подсистемы C28x завершит операции стирания/программирования своего банка, оно должно освободить управление flash pump записью значения «00» в семафор CPUMPREQUEST, затем подсистема M3 при необходимости сможет захватить управление flash pump.

В случае конфликта, когда оба ядра M3 и C28x одновременно пытаются получить управление flash pump, записывая соответствующие значения в рассмотренные выше регистры, управление flash pump получит ядро подсистемы M3.

Семафор конфигурации тактирования

По умолчанию после сброса системы регистрами конфигурирования тактирования микросхемы управляет ядро подсистемы M3. Однако чтобы позволить ядру подсистемы C28x стирать/программировать ее банк flash-памяти независимо от ядра подсистемы M3, предусмотрен семафор аппаратной конфигурации тактирования (CLKREQUEST) таким образом, что CPU подсистемы C28 может получить доступ на запись для конфигурирования регистров SYSPLLCTL, SYSPLLMULT, SYSPLLSTS и SYSDIVSEL для получения необходимой частоты тактирования. Семафор доступен со стороны обеих подсистем из их собственных карт распределения памяти в области регистров межпроцессорного взаимодействия (IPC register space).

Семафор конфигурирования тактирования называется MCLKREQUEST в карте памяти подсистемы M3 и CCLKREQUEST в карте памяти подсистемы C28x. На рис. 4 показано искусство программирования регистров конфигурирования тактирования для различных состояний семафора тактирования (2‑битное поле SEM в регистре CLKREQUEST).

Искусство программирования регистров Clock Configuration Registers для различных состояний семафора

Рис. 4. Искусство программирования регистров Clock Configuration Registers для различных состояний семафора

После сброса системы регистры конфигурирования тактирования по умолчанию отображаются на карту распределения памяти подсистемы M3 со значением семафора «00». Несмотря на это, при необходимости конфигурировать настройки тактирования и выполнять любые операции над частотой тактирования, ядро подсистемы M3 должно захватить управление записью значения «10» в регистр MCLKREQUEST. Это предотвратит возможность захвата управления регистрами конфигурирования тактирования со стороны подсистемы C28x, когда ядро подсистемы M3 конфигурирует настройки тактирования и функционирует на выбранной частоте.

После того как ядро подсистемы M3 завершит конфигурирование настроек тактирования и любые операции, которые оно хотело выполнить на сконфигурированной частоте, оно должно отдать управление регистрами конфигурирования тактирования, записав значение «00» в семафор MCLKREQUEST, чтобы ядро подсистемы C28x могло при необходимости захватить управление этими регистрами. Если пользовательское приложение спроектировано таким образом, что ядру подсистемы C28x не разрешено модифицировать настройки тактирования, только ядро подсистемы M3 конфигурирует также и настройки тактирования для подсистемы C28x (для операций стирания/программирования flash-памяти или даже для выполнения нормальных приложений). В таком случае ядро подсистемы M3 должно продолжать управление регистрами конфигурирования тактирования записью значения «10» в регистр MCLKREQUEST и не устанавливать его обратно «00».

Если пользовательское приложение спроектировано таким образом, что ядру подсистемы C28x разрешено конфигурировать настройки тактирования, то ядро подсистемы C28x при необходимости управлять настойками тактирования должно захватывать управление регистрами конфигурирования тактирования записью значения «01» в регистр CCLKREQUEST. Это не позволит ядру подсистемы M3 производить запись в регистры конфигурирования тактирования, когда оно конфигурируется ядром подсистемы C28x.

Когда ядро подсистемы C28x конфигурирует настройки тактирования (Clock settings), то перед изменением коэффициента умножения системы ФАПЧ (PLL multiplier), если она используется в приложении, напряжение питания с системы ФАПЧ снимается. Обратно напряжение питания на систему ФАПЧ (PLL) можно подавать после конфигурирования коэффициента умножения ФАПЧ. Для примера приведем необходимую последовательность конфигурирования системы ФАПЧ со стороны подсистемы C28x:

  1. Произведите захват регистров конфигурирования тактирования ядром подсистемы C28x, используя семафор конфигурирования тактирования.
  2. Настройте тактирование в обход системы ФАПЧ.
  3. Снимите напряжение питания с блока ФАПЧ (этого не требуется, если тактирование конфигурируется со стороны подсистемы M3).
  4. Установите для делителей частоты максимальные значения.
  5. Измените множитель системы ФАПЧ (PLL multiplier).
  6. Подайте напряжение питания на блок ФАПЧ.
  7. Дождитесь от блока ФАПЧ сигнала захвата частоты.
  8. Введите систему ФАПЧ обратно в тракт тактирования.
  9. Измените значения делителей частоты, как это необходимо для приложения.

После того как ядро подсистемы C28x закончит конфигурирование настроек тактирования и выполнит любые другие операции по конфигурированию частоты тактирования, оно должно отдать управление регистрами конфигурирования тактирования записью значения «00» в семафор CCLKREQUEST, чтобы ядро подсистемы M3 могло при необходимости захватить управление. В случае конфликта, когда обе подсистемы M3 и C28x пытаются одновременно захватить управление регистрами конфигурирования тактирования записью соответствующих величин в указанные выше регистры семафоров, то управление будет захвачено подсистемой M3.

Счетчик свободного хода

В микросхеме имеется 64‑разрядный счетчик свободного хода (free running counter), который можно использовать для закрепления меток времени (timestamp) за событиями межпроцессорного обмена (IPC event). Эти 64 бит счетчика разделены на два регистра MIPCCOUNTERL (32бит)/MIPCCOUNTERH (32 бит), тактируются от системы тактирования разделяемых ресурсов и могут читаться и подсистемой M3, и подсистемой C28x из соответствующих карт памяти. После сброса системы эти регистры принимают нулевые значения.

Поскольку счетчик является 64‑разрядным, а подсистемы M3/C28x могут читать за один раз только 32‑битные значения, при раздельном чтении счетчиков могут возникнуть проблемы. Если прочитать младшие 32 разряда счетчика, перед тем как произойдет их переполнение, а затем прочитать старшие 32 разряда, то скомбинированное из прочитанных данных значение будет некорректным. Для решения этой проблемы при выполнении операции чтения регистра MIPCCOUNTERL берется моментальная копия (snapshot) старших 32 разрядов счетчика. Когда подсистема M3/C28x читает MIPCOUNTERH, вместо текущего значения регистра MIPCOUNTERH пользователю отдается снимок (snapshot), сделанный при чтении регистра MIPCCOUNTERL.  Поэтому пользовательское программное обеспечение всегда должно вначале читать регистр MIPCCOUNTERL, а затем — регистр MIPCCOUNTERH.

Регистры MIPCCOUNTERL/H действуют, только когда останавливаются CPU обеих подсистем, M3 и C28 (не в режиме пониженного энергопотребления halt-mode). Если хотя бы одно из ядер не остановлено, то работает и счетчик. Рекомендуется, чтобы пользовательское приложение перед чтением счетчика запрещало прерывания.

 

Заключение

В статье рассказано о модуле межпроцессорного взаимодействия (IPC) в многоядерном микроконтроллере, содержащем процессорное ядро Cortex-M3 и ядро цифровой обработки сигналов C28x. Модуль построен на базе ОЗУ сообщений MSGRAM. Обмен сообщениями происходит через регистры сообщений на основе флагов и прерываний. Кроме того, в процессе обмена участвуют семафор заполнения flash-памяти и семафор конфигурирования тактирования, а также свободно работающий счетчик.

Далее автор планирует рассмотреть межпроцессорное взаимодействие в многоядерных гетерогенных кристаллах, состоящих из одного или нескольких ядер Cortex-A и одного или нескольких ядер Cortex-M3/M4.

 

Литература
  1. SPRS742. F28M35x Concerto Microcontrollers Datasheet. 
  2. SPRUH22. Concerto F28M35x Technical Reference Manual. 
  3. Самоделов  А. Новые двухъядерные микроконтроллеры для систем управления F28M35x семейства Concerto корпорации Texas Instruments // Компоненты и технологии. 2011. № 10–12.
  4. Самоделов  А. Сам себе исполнитель и дирижер: двухъядерные микроконтроллеры семейства Concerto // Новости электроники. 2012. № 1.

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

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