Библиотеки макроопределений для работы с портами и DMA-контроллером

В комплект поставки VisualDSP++ и компилятора cc21k входят файлы библиотеки макроопределений для упрощения работы с регистрами IOP-процессора, в частности для настройки DMA-пересылок через внешний порт и управления последовательными портами (подключаются заголовочными файлами, соответственно, dma.h и sport.h). Они позволяют существенно упростить разработку кода и повысить его наглядность для программиста, предпочитающего язык высокого уровня "неэлегантным" ассемблерным вставкам.

Реализация на С (запись в битовые поля) "Расшифровка" компилятора с оптимизацией по быстродействию
SPORT0_Receive.rdiv.rckdiv = 0x10; SPORT0_Receive.rxc.slen = 31; SPORT0_Receive.rxc.iclk = 1; // Записать все регистры sport_setup(0, SPORT0_Receive); // Отдельно затем – включить порт sport_enable_receive(0); r2=dm(_SPORT0_Receive+6); r12=0xffff0000; r8=0x10; r2=r2 and r12; r2=r2 or r8; dm(_SPORT0_Receive+6)=r2; r4=dm(_SPORT0_Receive+1); r1=496; r4=r4 or r1; r12=0x400; r12=r4 or r12; dm(_SPORT0_Receive+1)=r12; i4=_SPORT0_Receive; // источник r2=11; // сколько регистров SPORT0 i12=0xE0; // =0xE0 - регистры SPORT0 R0=R0-R0, PM(i12,M14)=M5; R0=DM(i4,M6), PM(i12,M15)=R0; LCNTR=r2, DO (PC, 1) UNTIL LCE; R0=DM(i4,M6), PM(i12,M14)=R0; PM(i12,M14)=R0; i0=0xE1; // SRCTL0 r2=1; r12=dm(m5,i0); r2=r12 or r2; dm(m5,i0)=r2;
Реализация в виде ассемблерной вставки Размещение основных регистров управления SPORT0 в памяти
  asm("r0 = 0x10;" "dm(0xe6) = r0;" "r0 = 0x5F1;" "dm(0xe1) = r0;" : : : "r0"); #define STCTL0 0xe0 /* Transmit Control Register */ #define SRCTL0 0xe1 /* Receive Control Register */ #define TX0 0xe2 /* Transmit Data Buffer */ #define RX0 0xe3 /* Receive Data Buffer */ #define TDIV0 0xe4 /* Transmit Divisor */ #define TCNT0 0xe5 /* Transmit Count Reg */ #define RDIV0 0xe6 /* Receive Divisor */ #define RCNT0 0xe7 /* Receive Count Reg */ #define MTCS0 0xe8 /* Multichannel Transmit Sel. */ #define MRCS0 0xe9 /* Multichannel Receive Sel. */

При использовании данной библиотеки следует обратить внимание на отдельное включение последовательного порта функцией sport_enable_receive(). Это вызвано тем, что все параметры последовательного порта должны быть установлены обязательно до его включения. При записи же регистров IOP-процессора от младших адресов к старшим с использованием цикла (как это реализовано в h-файле) сначала записывается SRCTL0, а затем регистр делителя RDIV0. Поэтому получается, что значение RDIV0 фактически игнорируется аппаратурой порта.

Более того, чтение значение из элемента структуры, например, из регистра RX0 не приводит к физическому чтению данных из порта процессора.

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


[1] Согласно рекомендациям ITU-R 601 телевизионный сигнал яркости оцифровывается с частотой дискретизации 13,5 МГц (и позволяет передавать в своем спектре частоты до 5,75 МГц), а оба сигнала цветности – с частотами 6,75 МГц каждый (с частотами в спектре примерно до 2,75 МГц), т.е. реализуется схема оцифровки 4:2:2. Таким образом, общая частота формируемого цифрового сигнала – 2х13,5 = 27 МГц. Учитывая, то на каждый отсчет согласно тем же рекомендациям отводится 10 бит, получаем требуемую пропускную способность канала связи 27х10=270 Мбит/с. Поскольку одно электромагнитное колебание может передать информацию максимум о 1,5 битах, получаем требуемую полосу частот канала передачи, равную почти 140 МГц (вместо исходных 5,75+2,75х2=11,25).

[2] Циклическим кодом называется линейный код, который представляет собой конечное множество, замкнутое относительно операции циклического сдвига кодовых векторов, образующих его. Обычно используется для помехоустойчивого кодирования.

[3] Внутрикристальное устройства эмуляции (On Curcuit Emulation) обеспечивает простой и быстрый инструмент независимого доступа к внутренним регистрам процессора и периферии. OnCE сообщает программисту статус регистров, ячеек памяти, шин и нескольких инструкций, выполненных последними.

[4] Интерфейс IEEE 1149.1 Boundary Scan Architecture (он же JTAG) разработан для тестирования сложных логических схем в реальном времени и в реальных системах. Ячейки тестирования располагаются между реальными выводами устройства (ножками процессора) и собственно логическим устройством, т.е. располагаются на логической границе (boundary) устройства. Контроллер способен сканировать ячейки – управлять ими и получать информацию. Один и тот же контроллер может использоваться для тестирования нескольких устройств, подключенных последовательно.

[5] Смещенная экспонента получается в результате вычитания из двоичной экспоненты значения 127.

[6] Естественно, что все выше сказанное справедливо только в том случае, если система имеет дело с цифровыми сигналами, полученными из реальных аналоговых сигналов с использованием аналого-цифрового преобразования. Если же речь идет, например, об обмене промежуточными результатами вычислений, управляющей или служебной информацией между процессорами (т.е. приеме/передаче информации, для которой постоянство временного интервала между последовательными значениями не имеет значения), то тогда могут быть применимы способы обмена данными, используемые в традиционном программировании "не для систем реального времени".

[7] Если после завершения DMA-пересылки до сброса бита DEN в регистр Сx будет записано новое значение, то DMA-последовательность будет продолжена с новым значением счетчика.

[8] DMA-прерывания могут быть сгенерированы портами ввода/вывода в режиме, когда DMA-пересылки не разрешены (бит DEN=0).В этом случае прерывание, соответствующее DMA-каналу генерируется когда во входном буфере появляется принятое слово данных или в выходном буфере появляется место для записи очередного слова. Такая возможность используется при работе в режиме ввода/вывода под управлением ядра ADSP-21060. Для выполнения пословного ввода/вывода через внешний порт под управлением процессорного ядра без использования необходимо установить бит INTIO в соответствующем регистре управления DMACx.

[9] Если после завершения DMA-пересылки до сброса бита DEN в регистр Сx будет записано новое значение, то DMA-последовательность будет продолжена с новым значением счетчика.

[10] DMA-прерывания могут быть сгенерированы портами ввода/вывода в режиме, когда DMA-пересылки не разрешены (бит DEN=0).В этом случае прерывание, соответствующее DMA-каналу генерируется когда во входном буфере появляется принятое слово данных или в выходном буфере появляется место для записи очередного слова. Такая возможность используется при работе в режиме ввода/вывода под управлением ядра ADSP-21060. Для выполнения пословного ввода/вывода через внешний порт под управлением процессорного ядра без использования необходимо установить бит INTIO в соответствующем регистре управления DMACx.

[11] Компандирование – процесс представления данных через логарифмическую шкалу квантования для сокращения числа битов, необходимых для передачи. Последовательные порты ADSP-2106х поддерживают два стандартных алгоритма компандирования, используемых для представления речевых сигналов в телефонных сетях: по А- и m-законам.

[12] То есть, линк-буфер и линк-порт - это не одно и то же. Например, один и тот же линк-порт может быть назначен одновременно двум линк-буферам (такой режим называется "loopback" и используется при отладке программного кода).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: