Мысловский Э.В. Цифровые сигнальные процесссоры (2003), страница 9
Описание файла
PDF-файл из архива "Мысловский Э.В. Цифровые сигнальные процесссоры (2003)", который расположен в категории "". Всё это находится в предмете "компьютерные методы и технологии автоматизации и управления" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 9 страницы из PDF
Генерация этого файла не гарантирует, тем не менее, чтопрограмма и данные будут загружены в память; файл только перечисляет, что должнобыть представлено в памяти, чтобы программа запустилась корректно. Вы должныпредоставить данные, которыми память будет по-настоящему загружена. После того какредактор связей создаст файл образа памяти для вашей программы, существует дваспособа завершить инициализацию: 1) запрограммировать микросхему ППЗУ длябуферов, расположенных в ПЗУ. 2) записать в вашу программу код, копирующийинициализирующиеданныевбуферы,расположенныевОЗУ.Выможетеинициализировать буферы, расположенные в ПЗУ используя разделитель программ длязаписи в ППЗУ одним из следующих способов: создание файлов для программированияприборов ППЗУ для внешней памяти программ или данных, или создание файлов дляпрограммирования приборов ППЗУ для памяти начальной загрузки; переменные ибуферы во внутренней памяти программ будут инициализированы во время загрузки (дляпроцессоров ADSP-21xx с внутренней и загрузочной памятью).
Переменные и буферы,расположенные в памяти программ или данных ОЗУ должны быть инициализированывашей программой. Исключением является внутренняя память программ ОЗУ ADSP2101.ADSP- 2105,ADSP-21msp50.3TO пространство ОЗУ может быть инициализированопри загрузке (как описано выше). Три типа памяти должны быть инициализированы висходном коде:55• внешняя память программ ОЗУ• внешняя память данных ОЗУ• внутренняя память данных ОЗУЧтобы инициализировать буферы в этих областях памяти вы должны иметьданные, сохраненные в ПЗУ, и включить в вашу программу код, копирующий данные всоответствующую область памяти. Пример такой подпрограммы показан ниже:Пример: Копирование буфера sin_input в буфер sin table.VAR/PM/ROM sin_init[64];.VAR/DM/RAM sin_table[64];.INIT sin_init: <sin.dat>;{копировать инициализированный буфер, sin_init,из PM ROM в DM RAM}M0=1;M4=1;IO=^sin_table;I4=^sin_init;CNTR=%sin_table;DO sin_copy UNTIL CE;AXO=PM(I4,M4);sin_copy: DM(IO,MO)=AXO;3.6.4 Определение макроса (.MACRO)Макрос создается с помощью ассемблерной директивы .MACRO Макросиспользуется для повторения часто используемых последовательностей инструкций ввашемисходномкоде.Передачейаргументовмакросуреализуетсяподобиеподпрограммы, которая может быть использована в различных программах.Макро вложения ограничены только размером свободной оперативной памяти.Вложенные макросы должны быть объявлены следующим образом: внутренний макрос56первый,..., внешний макрос последний.
Все константы, используемые в макросах, должныбыть объявлены перед объявлением макросов.Макрос определяется двумя директивами:.MACRO имя макроса (, аргумент,...);….ENDMACRO;Каждый оператор внутри макроса может быть инструкцией, директивой илимакро включением. Директива .ENDMACRO отмечает конец макроопределения. Макросвызывается по своему имени. Чтобы выполнить макрос с именем quickloop используйтеследующую команду в вашем исходном коде:quickloop; вызов макросаМакровызов не должно содержать дополнительных операторов (т.е.
инструкций,директив препроцессора или других макровключений) на той же строке исходного кода.Аргументы макроса принимают форму:%n n = О, 1, 2, .... 9Следующий пример определяет макрос с тремя аргументами:Пример: Пример определения макроса с тремя аргументами.MACRO memory_transf(%0, %1, %2);В коде макроса, аргументы маркируются служебными символами %1,%2,%3,ит.д. При вызове макроса служебные символы замещаются величинами аргументов,переданныхвмакрос.Должнобытьпереданоправильноечислоаргументов.Передаваемые аргументы могут быть одними из:АргументИсключенияконстанты или выраженияНетсимволывсе, кроме MACRO,ENDMACRO, CONST, INCLUDE^символ"^%n"не разрешено%буфер"%%n"не разрешено57Операторы ^ и % не могут быть использованы с аргументами, замещающимислужебные символы в макроопределении. Тем не менее, аргументы, переданные в макрос,могут использовать эти операторы.
Например:Пример: Вызов макросаreed_data (^input),Пример: Макрос копирующий содержимое одного буфера в другой{MACRO объявление}.MACRO memory_transf (%0, %1, %2, %3, %4) { допускает 5 аргументов }.LOCAL transf;14=%0; {устанавливает 14 как адрес источника}15=%1; {устанавливает 15 как адрес приемника}М4=1; {устанавливает указатель на инкремент 1}CNTR=%2; {устанавливает длину буфера}DO transf UNTIL СЕ; { перенос данных }SI=%3(I4, М4) {переносит из типа %3 памяти}transf:%4(I5, M4)=SI; {переносит в тип %4 памяти}.ENDMACRO{MACRO вызов}Memory_transf (^coeff_table, ^buffer, buff_length, PM,DM):3.6.5 Локальная метка в макросах (.LOCAL)Директивой .LOCAL задают программные метки, используемые в макросе.Директива .LOCAL указывает ассемблеру создавать уникальную версию метки прикаждом включении макроса.
Это предотвращает ошибку дублирования меток в случае,когда макрос вызывается несколько раз в одном программном модуле. Директива .LOCALимеет формат:58.LOCAL метка_макроса,…;Ассемблер создает уникальные версии метки макроса добавляя к ней номер; этоможет посмотреть в программе моделирования или в файле листинга .LST разрешенораскрытие макросов.3.6.6 Размещение программ и данных в сегментах памятиДля инициализации данных, сохраненных в загрузочной памяти, загрузчикдолжен выполнить операцию копирования из внутренней памяти программ, послеокончания загрузки.Директива .SECTION подобна параметру /SEG директив .MODULE и .VAR иимеет следующий формат:.SECTION/сегмент имя_сегмента_рmДиректива .SECTION/РМ имя_сегмента_рm указывает редактору связей нанеобходимость разместить все программы и данные модуля в сегменте имя_сегмента_рmпамяти программ.
Директива .SECTION/DATA имя_сегмента_dm указывает редакторусвязей на необходимость разместить все структуры данных модуля в сегментеимя_сегмента_dm, памяти данных. Сегменты имя_сегмента_pm и имя_сегмента_dmдолжны быть предварительно определены в файле описания архитектуры .LDFсистемного конфигуратора. Обычно, чтобы расположить все программы и данныеисходного модуля в определенном системным конфигуратором сегменте памяти, выдолжны повторить параметр /SEG в директиве .MODULE и всех директивах .VAR внутримодуля. Директива .SECTION используются для исключения многократного повторенияпараметров /SEG.Ниже приводится пример, в котором модуль располагают в памяти данных всегмент с именем Audio_SamplesПример: Пример описания секции с именем Audio_Samples.SECTION/DM Audio_Samples;.MODULE/RAM Sample_Input;.VAR/DM/RAM/CIRC sample_buffer[I5].VAR/DM/RAM other_buffer[5];59.VAR/DM/RAM another_buffer[5];.VAR/DM/RAM variablel;программа SAMPLE_INPUT....ENDMOD;Программа для подпрограммы SAMPLE_INPUT будет размещения в памятипрограмм.3.6.7 Глобальные структуры данныхДиректива .GLOBAL позволяет переменным, буферам и портам быть доступнымиизвне модуля, в котором они объявлены.
Для доступа к одной из этих структур из другихмодулей вы должны объявить ее с директивой .GLOBAL Директива .GLOBAL имеетформат:.GLOBAL внутренний символ,…;Пример: Объявление глобального буфера coeffs.VAR/PM/RAM coeffs[10];.GLOBAL coeffs; {делает буфер видимым снаружи модуля}С тех пор как символ сделан глобальным, другие модули могут обращаться кнему, идентифицируя символ как внешний.3.6.8 Глобальные программные меткиДиректива .ENTRY позволяет обращаться к программным меткам в другихмодулях.Этопозволяетиспользоватьметкудлявызовамежмодульных переходов.Директива .ENTRY имеет формат:.ENTRY программная_метка,...;Пример: Объявление глобальной программой метки.ENTRY fir_start; {делает метку видимой снаружи модуля}60подпрограммыилиС тех пор,как метка объявлена директивой .ENTRY другие модули могутобращаться к ней, идентифицируя метку как внешнюю.3.6.9 Внешние символыДиректива.EXTERNAL позволяет программному модулю обращаться кглобальным структурам данных (переменным, буферам и портам)и программным меткам,объявленным в других модулях.Символ должен быть определен до этого с помощью директив .GLOBAL или.ENTRY в тех модулях, где он впервые объявлен.
Другие модули должны использоватьдирективу .EXTERN'AL для открытия доступа к внешним символам. Директива имеетформат:.EXTERNAL внешний символ,...;Пример: Объявление внешнего символа.EXTERNAL flr_start; {метка в другом модуле}3.7 Редактор связейРедактор связей (компоновщик) ADSP-21xx генерирует исполняемую программупутем связывания отдельно ассемблированных модулей.
Основным выходом редакторасвязей является файл отображения памяти с расширением .DXE. Этот файл загружают впрограмму моделирования для отладки. После того, как программа полностью отлажена,применяют программу разбиения памяти для программатора ППЗУ. Как было описано впредыдущей главе, ассемблер обрабатывает каждого модуль исходного кода и создаетобъектный файл .OBJ ,файл кода .CDE и файл инициализации .INT .
Объектный файлсодержит информацию по размещению в памяти и символьную информацию, в то времякак файл кода содержит коды операций ADSP-21хх с помеченными неразрешеннымисимволами. Файл инициализации содержит информацию, относящуюся к переменнымданным и буферам. Инициализация данных должна обеспечиваться файлом данных,указанным с помощью директивы ассемблера .INIT. Редактор связей читает данные изэтого файла и объединяет их в файл .DXE. Изменения в инициализируемых данныхпотребует повторного вызова редактора связей.