Мысловский Э.В. Цифровые сигнальные процесссоры (2003), страница 8
Описание файла
PDF-файл из архива "Мысловский Э.В. Цифровые сигнальные процесссоры (2003)", который расположен в категории "". Всё это находится в предмете "компьютерные методы и технологии автоматизации и управления" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 8 страницы из PDF
Незагружаемая память определена как начальная структурапамяти программ и памяти данных перед загрузкой какой-либо страницы или исполнениякода. Девять частей структуры содержатся независимо одна от другой, если в объявлениипрограммного модуля (или буфера данных) не используется параметр STATIC.
При48отсутствии параметра STATIC редактор связей принимает, что каждая из девяти частейстартует с чистого состояния памяти программ и памяти данных, и что каждаязагружаемая страница имеет доступ ко всему пространству памяти.Следуйте следующему правилу: если у вас есть программный модуль или буферданных, который не должен быть перезаписан при загрузке новой страницы, вы должныиспользовать при его объявлении параметр STATIC. В противном случае, редактор связейпринимает, что для загрузки новой страницы доступна вся память, и допустимопереписывать любые существующие программы/данные.Пример: Декларация модулей routinel и bootfilter.MODULE/SEG=ext_pm/RAM routinel;.MODULE/RAWBOOT=0 bootfilter;.VAR/SEG=ext_pm/PM/RAM coeffs[16];Пока подпрограмма routinel не объявлена как STATIC, редактор связейигнорирует ее расположение в памяти при определении места для буфера coeffs в памятипрограмм.
Поэтому редактор связей может зарезервировать место для coeffs в областипамяти, которая частично перекрывает routinel. При загрузке страницы 0,буфер coeffsзагружают во внутреннюю память программ ADSP-218x,откуда она копируется вовнешнюю память программ РМ. Тем не менее, если при объявлении routinel указатьпараметр STATIC редактор связей зарезервирует ее адреса в пространстве памятипрограмм и расположит coeffs где-нибудь в другом месте внешней памяти программ.Пример:Декларациястатическогомодуляroutinel.MODULE/SEG=ext_pm/RAM/STATIC routinel;3.6.2 Переменные данные и буфера (.VAR)Директива .VAR объявляет буферы данных.
Буфер данных - это множествоадресов расположения данных. Переменная объявляется как буфер с единственнымадресом. Вы должны объявить все переменные и буфера до использования их впрограмме. Если буфер инициализирован директивой .INIT объявление и инициализациядолжны выполняться в одном и том же модуле. Директива .VAR имеет форму:.VAR /параметр/параметр ...имя буфера [длина],... ;49Объявлениепоумолчаниюподразумеваетоднословнуюпеременную,перемещаемую в памяти RAM. Одна директива .VAR может объявить несколько буферов,разделенных запятыми на одной строке (до 200 символов).При многочисленном объявлении переменных и буферов в одной строке,редактор связей размещает их в смежных областях памяти.
Если при таком объявлениииспользуется параметр CIRC, то создается единственный кольцевой буфер, а отдельныебуфера будут линейными. С директивой могут использоваться следующие параметры: РМили DM, размеры в программной памяти или данных RAM или ROM, тип памятиABS=aдpec абсолютный адрес (не использовать со STATIC), SEG-сегмент размещениебуфера в сегменте, объявленным системным конфигуратором, CIRC кольцевой буфер,STATIC предотвращает перезапись буфера во время загрузки. Параметр STATICиспользуют только для систем с памятью начальной загрузки, т.е.
для всего семействапроцессоров, за исключением ADSP-2100.Буфера могут быть размещены как в памяти программ, РМ, так и в памятиданных, DM по умолчанию. Тип памяти по умолчанию устанавливается в RAM дляпамяти DM и РМ. Параметр ABS размещает буфер с указанного стартового адреса, делаяего неперемещаемым. Параметр SEG размещает буфер в указанном сегменте памяти,который был объявлен в файле системного конфигуратора.Параметр CIRC определяет кольцевой буфер.
Буфер будет адресоваться влинейном виде, если не применен атрибут CIRC. Параметр STATIC предотвращаетперезапись буфера, когда загружается страница начальной загрузки. Если вы хотитеиспользовать буфер в программах с нескольких загрузочных страниц, он долженоставаться неизменным во время загрузки. Это выполняется приданием буферу атрибутаSTATIC. Статические буфера управляются редактором связей точно так же, какстатические модули - смотрите раздел «Статические модули» для уточнения деталей.Для объявления переменной применяется директива .VAR без указания длиныбуфера:Пример:ОбъявлениепеременнойseedсадресомОхОООА..VAR/DM/RAM/ABS=0х000A seed;Этот оператор объявляет однословную переменную с именем seed в памятиданных RAM по адресу 10 (десятичный). Следующий пример показывает объявлениебуфера:50Пример: Объявление линейного буфера coefficients в сегменте pmdata памятипрограммы.VAR/PM/RAM/SEG=pmdata coefficients[10];Здесь линейный буфер объявлен в памяти программ RAM, который перемещаем впределах сегмента с именем pmdata.
Название буфера coefficients и он состоит из 10записей в памяти программ. Длина буфера должна быть помещена внутри скобок. Нижеприведен пример объявления перемещаемого кольцевого буфера, длина которогоопределяется величиной константы lapsПример: Объявление кольцевого буфера data_buffer в памяти данных .CONSTtaps = 15;.VAR/DM/CIRC data_buffer[taps];Кольцевой буфер может быть размещен в памяти с некоторыми ограничениями,связанными с характеристиками процессоров ADSP-21xx по аппаратной реализацииадресации кольцевого буфера. Вообще, кольцевой буфер должен стартовать с базовогоадреса, который кратен 2n, где n - количество бит, требуемых для представления длиныбуфера в двоичном виде. Редактор связей будет придерживаться этих требований дляразмещения кольцевых буферов.
Вы должны иметь это в виду, если явно выбрали базовыйадрес буфера параметром ABS. Приведенные ниже примеры помогут понять, где можноразмещать циклические буферы в памяти. Следующий оператор объявляет кольцевойбуфер из пяти позиций:Пример: Объявление кольцевого буфера аа.VAR/CJRC аа[5];Так как для представления длины аа необходимо три разряда, редактор связейприсвоит буферу базовый адрес кратный 8.Три младших значимых разряда (МЗР) этогоадреса нули. Если на одной строке объявлены несколько буферов и используется параметрCIRC, создается один кольцевой буфер, а отдельные буфера будут только простымилинейными буферами. Например, следующее объявление создает один 15-словныйкольцевой буфер.51Пример: Объявление одного кольцевого буфера.VAR/CIRC аа[5], bb[5], cc[5];Базовый адрес кольцевого буфера равен адресу аа; этот символ будетиспользоваться для доступа к буферу в программе.
Адрес bb это аа +5, а адрес сс этоаа+10. Три пятисловных буфера могут быть индивидуально доступны как линейные. Таккак величина 15 требует четырех разрядов для двоичного представления, кольцевой буфераа будет размещен по адресу, который кратен 16 (четыре младших значащих разрядаравны нулю).Следующий пример показывает использование трех директив для объявлениятрех различных циклических буферов:Пример: Объявление трех кольцевых буферов.VAR/CIRC аа[5];.VAR/CIRC bb [5];.VAR/CIRC сс[5]:Поскольку они объявлены отдельно, буфера не будут объединены.
В следующемпримере создаются структуры для поисковых таблиц синуса/косинуса:Пример: Объявление одного кольцевого буфера для поисковых таблиц синуса икосинуса.VAR/CIRC sin[256], cos[768],Здесь определен один кольцевой буфер, который имеет длину 1024.Чтобыполучить доступ к буферу из программы, вы должны инициализировать индексныерегистры DAG и регистры длины буфера следующими инструкциями:Пример: Загрузка указателей на поисковые таблицы в регистрыI0 = ^cos; {^ это оператор получения адреса}L0=1024;I1= ^sin;L1=1024;52Эти инструкции загружают регистры I0 и I1 базовыми адресами cos и sin.Соответствующие регистры L загружаются значением длины кольцевого буфера дляразрешения кольцевой адресации.
Кольцевой буфер реализуется только при ненулевомзначении регистра L.3.6.3 Инициализация переменных и буферов (.INIT)Директива .INIT используется для инициализации переменных и буферов в ПЗУ.Редактор связей помещает данные инициализации в файл образа памяти, которыйзагружается разделителем программ для записи в ППЗУ. Разделитель переводит ПЗУчасти этого файла в формат, совместимый с промышленным стандартом программатораППЗУ.
Инициализирующие значения могут быть перечислены в директиве или указаны вовнешнем файле; директива .INIT принимает одну из следующих форм:.INIT имя_буфера: константа, константа,...;..INIT имя_буфера: ^…..буфер или %другой_буфер, ...;.INIT имя_буфера: <файла >;Операторы ^ и % использоваться для инициализации буфера или переменнойбазовым адресом или длиной, или даже другими буферами.
Любые комбинации констант,указателей адресов буфера и величин длины буфера могут быть заданы через запятую.Примеры:Пример: Примеры инициализаций/* Этот оператор инициализирует переменную seed шестнадцатеричнойконстантой*/.INITseed: 0х3FFF;/* Этот оператор инициализирует буфер seed_values списком констант */.INIT seed_values: 1,2,3,5,7;/* Здесь переменная buffer_ptr инициализируется указателем стартового адресабуфера input_buf Вы можете инициализировать только часть данных буфера, задаваясмещение */INIT buffer_ptr: ^input_buf,53/* Теперь инициализирующие величины будут размещены, начиная с адреса;buffer_пате + offset */.INIT buffer_name[offset] ;/* Следующий оператор, например, инициализирует восьмой, девятый идесятый элементы буфера coeffs величинами 2,3 и 4 */.INIT coeffs[7] : 2,3,4;Третья форма директивы .INIT указывает имя файла, который содержитинициализирующие величины.
Ассемблер устанавливает указатель на этот файл, и данныеприсоединяются при запуске редактора связей. Следующий пример заставляет редакторсвязей инициализировать буфер cos содержимым файла cosines.dat:Пример: Инициализация буфера cos.INIT cos: <cosines.dat>;Если файл с данными находится в текущей директории операционной системы,только необходимо указать в скобках только имя файла.
Если файл находится в другомкаталоге, вы должны указать путь к этому каталогу и имя файла. Например, если файлinits.dat для буфера с именем samples размещен в директории DOS C:\2101\filter3\,тогдадиректива .INIT должна быть применена следующим образом:Пример: Инициализация буфера samples.INIT samples : < c:\2101\filter3\inits.dat>;Это позволит редактору связей найти файл. Данный способ широко используетсядля загрузки буферов данными, выработанными другими программами, такими какнахождение коэффициентов фильтра. После того, как редактор связей считает иприсоединит содержимое файла, изменение данных потребует лишь выполнитьповторную компоновку программы. Переменные данных и буферов могут еще бытьинициализированы с помощью семиразрядного ASCII кода.
Следующий примеринициализирует один четырехпозиционный буфер данных inputs ASCII кодами А,В,С,D.ASCII коды размещаются в семи МЗР памяти данных (16 разрядов) или памяти программ(8,16 или 24 разрядов).54Пример: Инициализация буфера inputs.INIT inputs : _ABCD_;Специальный синтаксис директивы .INIT .INIT24 позволяет сохранять 24разрядные данные в памяти программ. Это позволяет получить доступ к младшим 8разрядам каждого 24- разрядного слова памяти программ при инициализации буферовданных или переменных в исходной программе.Пример: Примеры адресной арифметики при инициализации/* Эта запись вычисляет 16-разрядный адрес */.INIT var: ^label + 10/* То следующая запись вычисляет 24-разрядный адрес */.INIT24 var: ^label + 10Созданный редактором связей .EXE образ памяти содержит программные коды иинициализирующие данные.