Память процессора и адресное пространство

Процессор имеет единое адресное пространство для данных и программ. Внутренняя память процессора включает три вида памяти:

1)On-Chip Dual-access Random Access Memory (DARAM) энергозависимая.

2)On-Chip Single-access Random Access Memory (SARAM) энергозависимая.

3)On-Chip Read-only memory (ROM) энергонезависимая

Энергозависимость, означает потерю данных при выключении питания. Энергонезависимая память сохраняет данные.

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

Как правило, адресное пространство указывается в шестнадцатеричной системе.

Память DARAM занимает байтовое адресное пространство 00 00C0h - 00 FFFFh и включает 8-мь блоков (DARAM0-DARAM7) по 4К слов. Особенностью данной памяти является то, что за один цикл возможно два вида доступа: двойное чтение, двойная запись или одновременно чтение и запись, что значительно повышает быстродействие.

SARAM - память с одним типом доступа. Т.е. за один цикл возможно только одно чтение или одна запись. Адресное пространство занимает диапазон байтовых адресов 01 0000h–04 FFFFh и разделено на 32-а блока (SARAM0-SARAM31) по 4К слов в каждом.

SARAM и DARAM может быть сконфигурированы как память программ и как память данных. Эта же память используется для режима прямого доступа к памяти (ПДП).

Память ROM занимает адреса FE 0000h – FFF FFFh и разделена на 4-е блока по 16К слов. Всего 128К байт. Это адресное пространство может быть отведено под ROM или под внешнюю память. Если бит MPNMC в регистре ST3 очищен (по умолчанию), то процессор имеет доступ к ROM. В этой памяти хранится загрузочный код, который включается при сбросе процессора и различные программы и данные. В частности в этой области находится программа вычисления FFT. (Описание других программ и данных отсутствует.)

Внешняя память имеет адресное пространство 05 0000h – FFF FFFh. Обмен по EMIF может быть организован по 8-мь или 16-ть бит. Адресная шина при этом будет иметь 21бит и может использоваться до 5-ти сигналов выбора микросхемы памяти.

Процессор имеет дополнительное адресное пространство 64K байт (I/O space) для регистров управления, отделённое от адресного пространства программ и данных. Доступ к этим регистрам осуществляется с помощью отдельных инструкций. Не всё это адресное пространство занято, есть резервные ячейки. В таблице 2.1 приведены адреса и назначение управляющих регистров.

Таблица 2.1 адреса управляющих регистров

WORLD ADDRESS PERIPHERAL
0x0000 – 0x0004 Idle Control
0x0C00 – 0x0C7F DMA0
0x0D00 – 0x0D7F DMA1
0x0E00 – 0x0E7F DMA2
0x0F00 – 0x0F7F DMA3
0x1000 – 0x10DD EMIF
0x1800 – 0x181F Timer0
0x1840 – 0x185F Timer1
0x1880 – 0x189F Timer2
0x1900 – 0x197F Real Time Clock
0x1A00 – 0x1A6C I2C
0x1B00 – 0x1B1F UART
0x1C00 – 0x1CFF System Control
0x2800 – 0x2840 I2S0
0x2900 – 0x2940 I2S1
0x2A00 – 0x2A40 I2S2
0x2B00 – 0x2B40 I2S3
0x2E00 – 0x2E40 LCD
0x3000 – 0x300F SPI
0x3A00 – 0x3A7F MMC/SD0
0x3B00 – 0x3B7F MMC/SD1
0x7000 – 0x70FF SAR and Analog Control Registers
0x8000 – 0xFFFF USB

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

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

Директива MEMORY в этом файле идентифицирует диапазоны адресов памяти, которые присутствуют физически и могут быть использованы программой. Каждый такой диапазон памяти имеет имя, стартовый адрес и длину. По умолчанию линковщик может использовать единое адресное пространство с названием PAGE 0. В процессорах C55x могут быть использовано до 255 страниц в зависимости от необходимости. Когда заполняется директива MEMORY необходимо указать все диапазоны адресов памяти, доступные в задаче. В качестве примера можно предложить следующий вид директивы Рис.2.1:

MEMORY

{

PAGE 0: /* ---- Unified Program/Data Address Space ---- */

MMR (RWIX): origin = 0x000000, length = 0x0000c0 /* MMRs */

DARAM0 (RWIX): origin = 0x0000c0, length = 0x00ff40 /* 64KB - MMRs */

SARAM0 (RWIX): origin = 0x010000, length = 0x010000 /* 64KB */

SARAM1 (RWIX): origin = 0x020000, length = 0x020000 /* 128KB */

SARAM2 (RWIX): origin = 0x040000, length = 0x00FE00 /* 64KB */

VECS (RWIX): origin = 0x04FE00, length = 0x000200 /* 512B */

PDROM (RIX): origin = 0xff8000, length = 0x008000 /* 32KB */

PAGE 2: /* -------- 64K-word I/O Address Space -------- */

IOPORT (RWI) : origin = 0x000000, length = 0x020000

}

Рис.2.1 Пример директивы MEMORY

Индексы RWIX означают следующее:

R-означает, что эта память может читаться.

W-означает, что в эту память можно писать.

I-означает, что эта память может содержать исполняемый код.

X-означает, что эта память может быть инициализирована.

После директивы MEMORY можно использовать директиву SECTIONS для более детального распределения памяти.

Тактовый генератор

Для процессора и всех периферийных узлов необходимо тактировать их работу. С этой целью во всех процессорах имеется устройство, называемое тактовым генератором. Как правило, на вход тактового генератора подключается кварцевый генератор, который обеспечивает необходимую стабильность частоты. В данном процессоре входная частота выбирается равной, 32,768кГц (выбор частоты обосновывается в разделе 2.13.) и определяется кварцевым резонатором, подключённым к генератору блока Real Time Clock. В тактовом генераторе имеются специальные один умножитель и два делителя частоты, которые позволяют из входной частоты на выходе получить частоту до 120мГц с высокой точностью. Конструкция тактового генератора допускает тактирование от внешнего сигнала, что бывает необходимо для синхронной работы нескольких устройств.

Отдельный тактовый генератор предназначен для блока USB.

Выбор тактовой частоты очень важный момент. С одной стороны высокая частота обеспечивает быстродействие, но при этом резко возрастает энергопотребление, что очень важно для мобильных устройств. Тактовая частота также определяет частотные настройки последовательных портов ввода/вывода, таймеров и т.д. Для снижения потребления предусматривается отключение тактовых импульсов от блоков процессора, когда они не используются. Это осуществляется установкой логической единицы в соответствующий бит регистров Peripheral Clock Gating Configuration Register (PCGCR1 и PCGCR2).

2.4. Прерывания и таблица векторов прерывания

Во всех процессорах, для реакции на какие-то события в реальном масштабе времени применяется механизм прерываний. В данном процессоре реализовано 32-а события источников прерывания. Эти прерывания собраны в таблице векторов прерывания (spruh87c.pdf стр.86). Каждому прерыванию в таблице выделен соответствующий номер прерывания, адрес в памяти (вектор), по которому находится программа обработки (interrupt service routine - ISR) этого прерывания и уровень приоритета.

Управление прерываниями производится через регистр флагов прерываний (interrupt flag register IFR0,1) и регистр разрешения прерываний (interrupt enable register IER0,1). Установка флага прерывания происходит автоматически при появлении прерывания и является инициатором перехода к обработчику прерывания.

В качестве примера того, что может служить источником прерываний, можно привести переполнение таймера, окончание передачи данных по последовательным портам, заполнение данными выделенной памяти при DMA и т.д.

Внешние прерывания INT0 и INT1 вызываются переходом сигнала с высокого уровня в низкий, на соответствующих ножках процессора.

Для трёх таймеров процессора выделено одно прерывание. При входе в обработчик прерывания, флаг автоматически сбрасывается. Какой из таймеров вызвал прерывание можно определить во вторичном регистре TIAFR. Каждый флаг в регистре TIAFR должен быть сброшен в ISR путём записи 1-цы.

Тридцать два цифровых входа/выхода процессора (GPIO) могут быть сконфигурированы, как источники прерывания. Они все сконцентрированы в одном векторе и могут быть разрешены одним битом (bit5) регистра IER1. Разрешение каждого в отдельности прерывания, устанавливается во вторичных регистрах IOINTEN1 и IOINTEN2 (GPIO Interrupt Enable Registers). В обработчике прерывания необходимо организовать проверку вторичных регистров IOINTFLG1 и IOINTFLG2 для выявление того номера GPIO, который стал причиной прерывания. Бит в IFR1 сбрасывается автоматически, а в IOINTFLG1,2 должен быть сброшен программой в ISR.

Аналогично для DMA выделен один вектор прерывания, которое разрешает одним битом (bit8) регистра IER0 шестнадцать источников прерываний всего блока DMA. Вторичный регистр флагов DMAIFR определяет эти источники.

Управление конфигурацией

В процессоре выделены специальные регистры, в которых задаётся конфигурация, набор и подключение периферийных блоков.

External Bus Selection Register (EBSR). Этот регистр определяет подключение последовательных портов (serial port 1,2) к интерфейсам I2S0,1; SD0,1 и мультиплексирование двадцати одного вывода процессора для I2S2,3; UART; SPI и GPIO. Изменение конфигурации возможно только в начале программы, после её загрузки в память, когда производится конфигурация процессора и не возможно при выполнении программы.

Три регистра PDINHIBR1,2,3 (Pull-Down Inhibit Register) позволяют управлять так называемым “подтягиванием” т.е. подключением вывода процессора через сопротивление к питанию (pull-up) или общему проводу (pull-down) внутри процессора. Эта функция позволяет повысить помехоустойчивость при чтении и записи цифровых данных.

В данном процессоре предусмотрена возможность программного сброса. В 16-ти битный регистр PSRCR (Peripheral Software Reset Counter Register) заносится количество тактов процессора, т.е. определяется время, через которое должен произойти сброс. Рекомендуемая величина, не меньше 08h. В регистре PRCR (Peripheral Reset Control Register) указываются те периферийные блоки, в которых должен произойти сброс. Периферийные блоки в последнем регистре объединены в группы. Могут сбрасываться следующие группы либо I2S2, I2S3, UART и SPI, либо MMC/SD0, MMC/SD1, I2S0 и I2S1, либо DMA 0-3 контроллеры, либо USB контроллер, либо все таймеры, либо I2C.

Контроллер DMA

Контроллер DAM или контроллер прямого доступа к памяти позволяет производить перемещение данных между внутренней, внешней памятью и периферийными устройствами контроллера без участия процессорного ядра. В этом случае пока происходит передача данных, процессор может быть занят другими задачами. Окончание процесса передачи данных фиксируется через прерывание. В данном процессоре есть четыре контроллера DMA 0-3 и каждый контроллер имеет своих четыре канала. Таким образом, всего 16-ть каналов. Каждый контроллер DMA может работать только с определённым набором периферийных устройств, расположенных на кристалле.

Пользователь может перевести любой контроллер DMA в режим пониженного энергопотребления путём выключения входного тактирующего сигнала в регистрах PCGCR1 и PCGCR2 (Peripheral Clock Gating Configuration Register).

Блок-диаграмма каждого DMA контроллера содержит:

-четыре канала.

-регистр интерфейсного порта. Через этот порт центральный процессор имеет доступ к DMA контролеру для управления.

-интерфейсный порт данных. Через этот порт DMA Контроллер имеет доступ к внутренней или внешней памяти и периферии.

-передаваемые данные направляются по четырём каналам.

-один FIFO 64-е байта. Данные, читаемые из источника, размещаются в этом FIFO. В каждый момент времени к FIFO имеет доступ только один из четырёх каналов DMA.

Перед началом программирования канала должен быть сброшен бит EN = 0 в регистре DMACHmTCR2. Программирование канала при EN=1 может привести к непредсказуемым последствиям.

Набор настроек-конфигураций канала, при которых происходит передача данных, называется контекстом (context). Каждый из четырёх каналов имеет структуру регистров для программирования контекста.

DMACHmSSAL регистр стартового адреса источника (младшая часть)

DMACHmSSAU регистр стартового адреса источника (старшая часть)

DMACHmDSAL регистр стартового адреса назначения (младшая часть)

DMACHmDSAU регистр стартового адреса назначения (старшая часть)

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

Первый адрес, с которого начинается чтение данных, называется адресом источника (source start address), первый адрес с которого начинается запись, называется адресом назначения (destination start address). Чтение данных производится из адреса источника первоначально в FIFO. А запись в адрес назначения проходит тоже через FIFO.

Преобразование адресов CPU в адреса DMA отображено в соответствующих таблицах описания процессора. Вкратце можно сказать, что для получения адреса в DARAM надо к адресу CPU прибавить величину 01 0000h, а для получения адреса в SARAM прибавить величину 0008 0000h. Распределение адресов описано в файле tms320v5535.pdf (page14-15). Когда в качестве источников или устройств назначения используются периферийные узлы, то регистры DMACHmSSA и DMACHmDSA записываются адреса регистров периферии. В зависимости от поля DST/SRCAMODE (DMACHmTCR2) адрес может инкрементироваться после каждой передачи, что необходимо для памяти, а может оставаться тем же, что необходимо для периферии.

При DMA возможна пакетная передача данных от 1-го до 16-ти двойных слов.

Передача данных по DMA может происходить синхронизовано с определёнными событиями. Для этого в каждом из 16-ти каналов может быть установлен бит 2 (SYNCMODE) в регистре DMACHmTCR2. Если синхронизация по событию разрешена, то канал будет ожидать этого события от периферии и только после этого начнётся чтение из адреса источника. Передача будет происходить до окончания передачи блока. Если во время передачи происходит ещё одно событие, то оно игнорируется, что может привести к потере данных.

Перечень событий определяется в 4-х битном поле регистров DMAnCESR1 и DMAnCESR2. Такими событиями могут быть передача или приём данных по последовательным портам, переполнение таймеров, окончание преобразования в АЦП.

Если не предусмотрена синхронизация, то передача данных начинается сразу после разрешения канала (бит EN = 1 в регистре DMACHmTCR2).

Если одновременно с передачей по DMA центральный процессор CPU тоже обращается к той же памяти, то процессор имеет приоритет и DMA передача возобновляется после окончания обращения CPU.

Длительность передачи по DMA определяется основной тактовой частотой, количеством одновременно работающих контроллеров и каналов DMA, временем появления синхронизирующих сигналов, количеством тактов при обращении к внешней памяти и т.д.

Вместе с общим сбросом процессора, может быть сброшен и отдельно контроллер DMA. Это выполняется через бит DMA_RST в регистре PRCR. Необходимо заметить, что входные в DMA контроллер тактовые импульсы должны быть разрешены перед сбросом. После сброса во всех регистрах DMA устанавливаются значения по умолчанию и контроллер не запущен.

Каждый из контроллеров DMA может быть введён в режим пониженного энергопотребления путём отключения тактовых импульсов в регистре PCGCR.

Последовательность инициализации DMA передачи включает следующие пункты:

-вывод DMA контроллера из состояния RESET путём DMA_RST=0 в регистре PRCR.

-разрешение тактовых импульсов для каждого контроллера DAM установкой бита DMAnCG=0 в регистрах PCGCR1 и PCGCR2.

-очистка общего флага прерывания в регистре IFR0 путём записи 1 в 8-й бит. Очистка флагов прерывания для всех 16-ти каналов путём записи 1 в биты регистра DMAIFR (поле DMAnCHmIF, где n-номер контроллера DMA, m-номер канала).

-установка разрешения прерываний по 16-ти каналам DMA путём установки 1 в разряды DMAnCHmIE (n-номер контроллера, m-номер канала) 16-ти битного регистра DMAIER. Кроме этого должен быть выставлен бит разрешения прерывания INTEN в регистре DMACHmTCR2 для каждого канала.

-при использовании синхронизирующих событий выбирается тип этого события в поле CHmEVT регистров DMAnCESR1 и DMAnCESR2. Синхронизация разрешается установкой бита SYNCMODE в регистре DMACHmTCR2 для каждого канала.

-загрузка стартового адреса источника данных в регистры DMACHmSSAL и DMACHmSSAU (m-номер канала).

-загрузка стартового адреса назначения в регистры DMACHmDSAL и DMACHmDSAU.

-загрузка в регистр DMACHmTCR1 количества двойных слов. В поле LENGTH заносится величина в байтах. Т.е. если надо передать 256 двойных слов, то заносится величина 256*4=1024.

-установка дополнительных параметров передачи: автоматическая перезагрузка контрольных регистров адреса источника и адреса назначения после окончания передачи и автоматический запуск новой передачи данных (SYNCMODE=1), инкрементирование или нет адресов источника и назначения (DSTAMODE, SRAMODE), установка пакетной передачи BURSTMODE, включение режима PING-PONG.

-установить рабочие режимы периферии, когда DMA работает в периферийными блоками.

-разрешить DMA канал путём установки бита EN=1 и в случае синхронизации SYNCMODE = 1 в регистре DMACHmTCR2.

Таймеры

Таймеры являются неотъемлемой составной частью любого процессора. Основная задача этого периферийного узла в формирование временных задержек и инициализации процессов, которые должны происходить через фиксированные промежутки времени. Каждый из трёх 32-х битных таймеров (Timer0, Timer1, Timer2) может использоваться как таймеры общего назначения (GP general-purpose).

В каждом 32-ти битном таймере имеются два 16-ти битных регистра TIMCNT1 и TIMCNT2, в которых и происходит декрементация содержимого каждый такт таймера. Величина, с которой начинается счёт, записывается программой в регистры TIMPRD1 и TIMPRD2. В момент начала счёта, когда устанавливается, бит START в регистре TCR, содержимое TIMPRD1,2 переписывается в TIMCNT1,2 и начинается декремент каждый такт. Когда содержимое этих регистров достигает значения 0, таймер передаёт запрос на прерывание процессора.

Таймер может быть сконфигурирован в режим авто-перезагрузки (бит AUTORELOAD в регистре TCR), когда после окончания счёта регистры TIMCNT1,2 перезагружаются содержимым TIMPRD1,2.

Тактирование таймера осуществляется от системного тактового генератора, частота которого пропускается через 13-ти уровневый делитель. Коэффициент деления определяются полем PSCDIV (5-2 биты) в регистре TCR. При 0000b деление 2-а, при 1100b деление на 8192. Такая конфигурация позволяет очень точно и в большом диапазоне регулировать временные интервалы, получаемые от таймера. Расчёт заданного временного интервала начинается с вычисления периода следования тактовых импульсов: T=1/Fclock. Где Fclock частота тактирования процессора.

Тактовые импульсы подаются отдельно на каждый таймер, и определяется это битами в регистре PCGCR1.

Только Timer2 может быть использован как Watchdog таймер. Этот таймер позволяет преодолевать так называемые программные тупики (deadlock) или зацикливание программ (non-exiting code loop). Он так же эффективен при “зависании” процессора. Содержимое таймера декрементируется. Окончание счёта вызывает аппаратный сброс процессора. Для нормальной работы этот таймер должен периодически перезагружаться определённым значением, для предотвращения окончания счёта.

Watchdog таймер состоит из 16-ти битного счётчика и 16-ти битного делителя частоты тактирования. Для настройки этого таймера выделены специальные регистры:

WDKCKLK (1880h) предназначен для разблокирования записи в регистр счёта WDKICK. Это разблокирование производится путём последовательной записи ключей Key1=5555h и Key2=AAAAh. Если при чтении этого регистра в битах 1 и 0 читается 11b значит регистр разблокирован.

WDKICK (1882h) при разблокировании этого регистра в него записывается величина, хранящаяся в регистре WDSVR, и запускается процесс декрементации.

WDSVLR (1884h) предназначен для разблокировки записи в регистр WDSVR. При этом в него записываются последовательно два ключа Key1 = 6666h и Key2 = BBBBh. Если при чтении из этого регистра читается 11b, значит WDSVR разблокирован для записи.

WDENLOK (1888h) предназначен для разблокирования записи в регистр WDEN разрешения Watchdog таймера. Key1 = 7777h, Key2 = CCCCh, Key3 = DDDDh.

WDEN (188Ah) регистр содержит только один значащий 0-й бит. Если он установлен в 1, то Watchdog таймер разрешён.

WDPSLR (188Ch) для разблокировки записи в регистр WDPS. Key 1 = 5A5Ah, Key2 = A5A5h.

WDPS (188Eh) регистр делителя частоты декрементации. Каждый раз когда регистр WDPS достигает 0-го значения основной регистр счёта WDKICK декрементируется на один шаг.

Наши рекомендации