Контроллер памяти (Memory Controller, MC) в микроконтроллерах ARM7 обслуживает шину ASB (расшифровывается как ARM System Bus) и управляет запросами к памяти со стороны мастеров шины - обычно это ядро ARM7TDMI и контроллер DMA. В функции MC входит арбитр шины, декодер адреса, система обслуживания состояния abort, детектор ошибки выравнивания и контроллер встроенной памяти FLASH (Embedded Flash Controller, EFC. Подробнее см. [2]).
Рис. 18-1. Блок-схема внутреннего устройства MC.
MC обслуживает внутреннюю шину ASB, и выполняет арбитраж доступа до трех устройств мастера шины. MC построен из следующих блоков:
• Арбитр шины. • Декодер адреса. • Управление состоянием обрыва доступа (abort status). • Детектор ошибки выравнивания адреса при доступе к памяти (misalignment detector). • Контроллер встроенной памяти FLASH (Embedded Flash Controller, EFC).
Подразумевается, что все данные хранятся в памяти в формате little-endian. MC и все мастера шины работают только в формате данных little-endian [3].
Арбитр шины. В контроллер памяти MC встроен простой аппаратный (не настраиваемый) арбитр приоритетов доступа по шине, который дает доступ управления шиной одному из трех главных устройств (мастер). У контроллера сети EMAC самый высокий приоритет, контроллер DMA периферийных устройств имеет средний приоритет, и ядро процессора ARM (ARM7TDMI) имеет самый низкий приоритет.
Декодер адреса. В MC встроен декодер адреса, который в первую очередь декодирует 4 старших бита 32-битной шины адреса, и определяет 3 раздельные области памяти:
• Одно 256-мегабайтное адресное пространство для внутренней памяти. • Одно 256-мегабайтное адресное пространство для встроенных периферийных устройств. • Неопределенное адресное пространство размером 3584 мегабайт, состоящее их 14 областей памяти по 256 мегабайт. При доступе в неопределенное адресное пространство будет возвращен статус Abort (обрыв операции доступа).
Рис. 18-2. Области памяти микроконтроллера ARM7.
Распределение внутреннего адресного пространства. В пределах внутреннего адресного пространства декодер адреса контроллера MC декодирует еще 8 бит адреса, выделяя области размером 1 мегабайт во внутренних блоках памяти по 256 мегабайт.
Ко всем выделенным областям памяти осуществляется доступ в пределах 1-мегабайтного адресного пространства, повторяющегося n раз в этом адресном пространстве, n вычисляется как размер памяти, поделенный на 1 мегабайт.
Когда адрес доступа попадает в неопределенную область памяти, декодер адреса возвратит Abort мастеру.
Рис. 18-3. Распределение адресов внутренней памяти.
Внутренняя область памяти 0. Первые 32 байта этой области содержат адреса исключений процессора ARM (exception vectors). В честности, здесь находится вектор сброса на адрес 0x0 (Reset Vector).
Перед выполнением команды remap встроенная память FLASH отображается на внутреннюю область памяти 0, так что ядро ARM7TDMI выбирает инструкцию программы, содержащуюся в памяти FLASH. После выполнения команды remap внутренняя память SRAM, находящаяся по адресу 0x00200000, отображается на внутреннюю область памяти 0. Память, отображенная на внутреннюю область памяти 0, доступна как по своему оригинальному адресу размещения, так и по адресу 0x0.
После того, как выполнена команда Remap, к внутренней памяти SRAM осуществляется доступ через внутреннюю область памяти 0.
Так как векторы исключений ARM (Reset, Abort, Data Abort, Prefetch Abort, Undefined Instruction, Interrupt, и Fast Interrupt) привязываются от адреса 0x0 до адреса 0x20, команда Remap позволяет пользователю динамически переопределить эти векторы под управлением программного обеспечения.
Команда Remap доступна через интерфейс программирования пользователя для MC путем записи в лог. 1 поля RCB регистра MC_RCR (Remap Control Register).
Действие команды Remap можно отменить повторной записью в 1 поля RCB регистра MC_RCR (т. е. команда Remap работает по принципу триггера). Это позволяет проще отлаживать определяемую пользователем последовательность загрузки (boot sequence), так как предоставлен простой способ перевести чип в ту же самую конфигурацию, которая была сразу после сброса.
Статус Abort. Есть 2 причины, по которым может произойти обрыв операции доступа к памяти (abort):
• Попытка доступа по адресу, указывающему на неопределенную область памяти. • Попытка доступа по невыровненному адресу.
Примечание: невыровненный адрес это такой байтовый адрес памяти, который не соответствует типу доступа к памяти (т. е. не делится нацело на 2 или на 4). Подробнее см. ниже описание детектора ошибки выравнивания.
Когда происходит abort, всем мастерам шины обратно отправляется сигнал, независимо от того, какой из этих мастеров генерировал доступ. Однако только ядро ARM7TDMI может учесть сигнал abort, и только при условии, что оно генерировало доступ. Контроллер DMA периферийных устройств и контроллер EMAC не могут обработать входной сигнал abort. Обратите внимание, что соответствующие логические соединения отсутствуют на рис. 18-1.
Чтобы упростить отладку или анализ отказа операционной системы, в контроллер MC интегрирован регистр статуса Abort (MC_ASR) и регистр адреса Abort (MC_AASR).
Полный 32-разрядный адрес, который вызвал abort, сохраняется в регистре MC_AASR. Параметры доступа сохраняются в регистре MC_ASR, что включает:
• Размер запроса (поле ABTSZ). • Тип доступа - либо чтение данных, либо запись, либо выборка инструкции кода (поле ABTTYP). • Флажки, показывающие причину abort - либо из-за доступа к неопределенной области (бит UNDADD), либо из-за невыровненного доступа (бит MISADD). • Источник, который вызвал последний abort (биты MST_EMAC, MST_PDC и MST_ARM). • Произошел ли abort для каждого мастер, начиная с последнего чтения регистра (биты SVMST_EMAC, SVMST_PDC и SVMST_ARM), за исключением информации, загруженной в биты MST.
В случае, когда произошел Data Abort (обрыв доступа к данным) от процессора, будет сохранен адрес доступа. Это полезно, поскольку поиск инструкции, которая вызвала abort, потребует дизассемблирования инструкций и полного представления о контексте процессора.
В случае Prefetch Abort (обрыв выборки инструкции) адрес может измениться, поскольку адрес выборки обрабатывается конвейером процессора ARM. Процессор ARM учитывает prefetch abort только если выполнялась инструкция чтения, и возможно, что в это время произошло несколько обрывов доступа. Таким образом для такого случая предпочтительнее использовать содержимое регистра связи обрыва операции (Abort Link register) процессора ARM.
Контроллер EFC. Embedded Flash Controller (EFC) встроен в контроллер MC для обеспечения интерфейса к блокам памяти FLASH через внутреннюю 32-битную шину. Это позволяет повысить быстродействие при выборке кода в режиме Thumb с системой 32-битных буферов. EFC также предоставляет набор команд для программирования, стирания, блокировки на запись и разблокировки содержимого встроенной памяти FLASH.
Детектор ошибки выравнивания. В контроллере MC представлен детектор ошибки выравнивания адреса доступа, который проверяет целостность адреса доступа.
Для каждого доступа, независимо от того, какой из мастеров его произвел, проверяется размер доступа и биты адреса 0 и 1. Если был тип доступа к слову (32-битные данные) и биты 0 и 1 адреса не равны 0 (т. е. адрес не делится нацело на 4), то определяется ошибка выравнивания адреса. Подобным образом, если тип доступа был к половине слова (16-битные данные), и при этом бит 0 адреса не равен 0, то также детектируется невыровненный доступ к памяти. В обоих таких случаях мастеру будет возвращен статус abort, и доступ к памяти отменяется. Обратите внимание, что доступы процессора ARM, когда он производит выборку инструкций, не проверяются.
Ошибка выравнивания адреса обычно происходит из-за багов в программном обеспечении, когда неправильно обрабатываются указатели. Такие ошибки иногда сложно отловить при отладке.
Запрошенный адрес сохраняется в регистре статуса Abort Status Register, и адрес инструкции, которая вызвала ошибку выравнивания, сохраняется в регистре связи обрыва операции процессора (Abort Link Register), что упрощает поиск и исправление такого рода ошибок в программе.
[Интерфейс программирования MC]
В таблице показан общий список всех регистров, используемых для доступа к MC. Смещение адресов регистров отсчитывается относительно адреса 0xFFFFFF00.
Таблица 18-1. Регистры MC.
Смещение
Регистр
Имя
Доступ
Сброс
0x0000
MC Remap Control Register (регистр управления привязкой памяти)
MC_RCR
W
-
0x0004
MC Abort Status Register (регистр состояния обрыва операции)
MC_ASR
R
0x00000000
0x0008
MC Abort Address Status Register (регистр адреса состояния обрыва операции)
MC_AASR
R
0x00000000
0x0010..0x005C
Зарезервировано
0x0060
Регистры конфигурации EFC0
См. описание контроллера EFC [2].
0x0070
Регистры конфигурации EFC1*
Примечание *: EFC1 представлен только в процессоре AT91SAM7X512.
Регистр для выдачи команды Remap (MC Remap Control Register). Работает только на запись.
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
RCB
RCB: Remap Command Bit, бит команды Remap. 0: не оказывает никакого влияния. 1: запись единицы в этот командный бит работает как триггер, подключая привязку к адресу 0x0 внутренней оперативной памяти по адресу 0x00200000 и отменяя эту привязку.
Регистр состояния обрыва операции доступа (MC Abort Status Register). Работает только на чтение.
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
-
-
-
-
-
SVMST_ARM
SVMST_PDC
SVMST_EMAC
-
-
-
-
-
MST_ARM
MST_PDC
MST_EMAC
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
-
-
-
-
ABTTYP
ABTSZ
-
-
-
-
-
-
MISADD
UNDADD
UNDADD: Undefined Address Abort Status, состояние обрыва операции при доступе по неопределенному адресу. 0: последний обрыв операции (abort) не был из-за доступа к неопределенному адресу в адресном пространстве. 1: последний обрыв операции доступа произошел из-за попытки обращения по неопределенному адресу.
MISADD: Misaligned Address Abort Status, состояние обрыва операции из-за невыровненного доступа. 0: последний обрыв операции (abort) не был из-за попытки доступа по невыврованенному адресу. 1: последний обрыв операции доступа произошел был из-за попытки доступа по невыврованенному адресу.
ABTSZ: Abort Size Status, информация от размере операции, потерпевшей обрыв.
ABTSZ
Abort Size
0
0
Байт
0
1
Половина слова (2 байта)
1
0
Слово (4 байта)
1
1
Зарезервировано
ABTTYP: Abort Type Status, информация о типе операции, потерпевшей обрыв.
ABTTYP
Abort Type
0
0
Чтение данных
0
1
Запись данных
1
0
Слово (4 байта)
1
1
Зарезервировано
MST_EMAC: EMAC Abort Source, флаг источника операции обрыва EMAC. 0: причиной последнего обрыва операции не был контроллер EMAC. 1: последнюю операцию обрыва вызвал контроллер EMAC.
MST_PDC: PDC Abort Source, флаг источника обрыва операции контроллера DMA периферийных устройств. 0: последний оборванный доступ произошел не из-за контроллера DMA. 1: последний оборванный доступ произошел из-за контроллера DMA.
MST_ARM: ARM Abort Source, флаг источника обрыва операции ядра ARM. 0: последний оборванный доступ произошел не из-за ядра процессора. 1: последний оборванный доступ произошел из-за ядра процессора.
SVMST_EMAC: Saved EMAC Abort Source, сохраненный статус флага источника обрыва EMAC. 0: не было обрыва EMAC с момента последнего чтения MC_ASR, или это было оповещено битом MST_EMAC. 1: произошел как минимум один обрыв (abort) EMAC с момента последнего чтения MC_ASR.
SVMST_PDC: Saved PDC Abort Source, сохраненный статус флага источника обрыва контроллера DMA периферийных устройств. 0: не было обрыва контроллера DMA с момента последнего чтения MC_ASR, или это было оповещено битом MST_PDC. 1: произошел как минимум один обрыв (abort) DMA с момента последнего чтения MC_ASR.
SVMST_ARM: Saved ARM Abort Source, сохраненный статус флага источника обрыва ядра ARM. 0: не было обрыва доступа со стороны процессора с момента последнего чтения MC_ASR, или это было оповещено битом MST_ARM. 1: произошел как минимум один обрыв (abort) доступа со стороны ядра процессора ARM с момента последнего чтения MC_ASR.
Регистр адреса операции обрыва контроллера памяти (MC Abort Address Status Register). Работает только на чтение.
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
ABTADD
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
ABTADD
ABTADD: Abort Address, адрес обрыва операции. Здесь содержится адрес последнего оборванного доступа.
[Словарик]
APB Advanced Peripheral Bus, внутренняя шина для доступа к периферийным устройствам.
ASB расшифровывается как ARM System Bus.
DMA Direct Memory Access, прямой доступ к памяти.
EFC Embedded Flash Controller, контроллер встроенной памяти FLASH.
EMAC Ethernet Media Access Controller, контроллер сети Ethernet.
FLASH тип энергонезависимой памяти, которая программируется (записывается) блоками размером со страницу, и сохраняет свои данные после выключения питания.
RAM Random Access Memory, оперативная память, обеспечивающая произвольный доступ на чтение и запись.
ROM Read-Only Memory, постоянная, не изменяемая память, работающая только на чтение.
SRAM Static RAM, то же самое, что и RAM. Просто префикс Static подчеркивает, что память статическая, не динамическая, т. е. не требуются специальные операции для обновления содержимого памяти.