RP2040 - разбираем даташиты. Часть 2.1.2: Доступ к атомарному регистру

Содержание:

Часть 1: Введение

Часть 1.3: Чип

Часть 1.4: Распиновка

Часть 2: Описание системы

Часть 2.1.1: Матрица AHB-Lite


Каждому блоку периферийных регистров выделяется 4 КБ адресного пространства, доступ к регистрам осуществляется одним из 4 методов, выбранных посредством декодирования адреса.


Addr + 0x0000: нормальный доступ для чтения и записи

Addr + 0x1000: атомарное исключающее "или" при записи

Addr + 0x2000: установка атомарной битовой маски при записи

Addr + 0x3000: очистка атомарной битовой маски при записи


Это позволяет изменять отдельные поля регистра управления без выполнения последовательности чтения-изменения-записи в программном обеспечении: вместо этого изменения отправляются на периферийное устройство и выполняются на месте. Без этой возможности трудно безопасно получить доступ к регистрам ввода-вывода, когда подпрограмма обслуживания прерывания выполняется одновременно с кодом, выполняемым на переднем плане, или когда два процессора выполняют код параллельно.


Четыре псевдонима атомарного доступа занимают в общей сложности 16 КБ. Большинство периферийных устройств на RP2040 обеспечивают эту функциональность изначально, а атомарная запись имеет те же временные характеристики, что и обычный доступ для чтения/записи. Некоторые периферийные устройства (I2C, UART, SPI и SSI) вместо этого имеют эту функциональность, добавленную с помощью промежуточного устройства шины, которое переводит восходящие атомарные записи в нисходящие последовательности чтения-изменения-записи на уровне периферийного устройства. Это увеличивает время доступа на два системных тактовых цикла.


SIO (Часть 2.3.1), одноцикловый блок ввода-вывода, подключенный непосредственно к портам ввода/вывода ядер, не поддерживает атомарный доступ на уровне шины, хотя некоторые отдельные регистры (например, интерфейс ввода/вывода общего назначения) имеют псевдонимы set / clear / xor.


2.1.3. Мост APB


Мост APB связывает высокоскоростное основное соединение AHB-Lite с периферийными устройствами с более низкой пропускной способностью. В то время как матрица AHB-Lite предлагает доступ с нулевым временем ожидания повсюду, доступ к APB имеет штраф за цикл:

- Доступ к шине APB занимает минимум два цикла (фаза настройки и фаза доступа)

- Мост добавляет дополнительный цикл для доступа на чтение, так как запрос и ответ шины регистрируются.

- Мост добавляет два дополнительных цикла для доступа к записи, так как этап настройки APB не может начаться, пока данные записи AHB-Lite не станут действительными.


В результате пропускная способность части APB структуры шины несколько ниже, чем у части AHB-Lite. Однако пропускной способности более чем достаточно для насыщения последовательной периферии APB.


2.1.4. "Узкая" запись в регистр ввода/вывода


Отображенные в память регистры ввода/вывода на RP2040 игнорируют ширину доступа для чтения/записи по шине. Они обрабатывают все записи, как если бы они были размером 32 бита. Это означает, что программное обеспечение не может использовать запись байтов или полуслов для изменения части регистра ввода-вывода: любая запись по адресу, где 30 старших битов адресов совпадают с адресом регистра, повлияет на содержимое всего регистра.


Для обновления части регистра ввода-вывода без последовательности чтения-изменения-записи лучшим решением на RP2040 является атомарные set/clear/XOR (см. Раздел 2.1.2). Обратите внимание, что это более гибко, чем запись байтов или полуслов, так как любая комбинация полей может быть обновлена за одну операцию.


После 8-битной или 16-битной записи (такой как инструкция strb на Cortex-M0+) регистр ввода-вывода будет производить выборку всей 32-битной шины данных записи. Cortex-M0+ и контроллер прямого доступа к памяти на RP2040 всегда будут реплицировать "узкие" данные по шине:


https://ideone.com/Qk6Vxz (код с комментариями и выводом на русском)


https://github.com/raspberrypi/pico-examples/blob/2fb08a028f... (оригинальный код)

Arduino & Pi

1.4K постов20.6K подписчика

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу