Автор работы: Пользователь скрыл имя, 20 Декабря 2011 в 02:32, курсовая работа
Цель работы: Синтезировать полученные знания и реализовать программный код фильтра с бесконечной импульсной характеристикой для цифрового сигнального процессора компании Texas Instrument (TI) семейства TMS320C6000.
Заголовочный файл «prjBIX.h» к проекту не подключается. В этом нет необходимости, так как в CCS подключение заголовочных файлов, которые в файлах проекта указаны директивой «#include», происходит автоматически. И последний файл, который подключается к проекту — это файл библиотеки «rts6400.lib». Этот файл необходим для того, что бы CCS смог корректно преобразовать С++ кода к бинарному виду для выбранного типа сигнального процессора. Подключение производиться так же как это было рассмотрено выше. Необходимый файл находиться в директории, где установлена отладочная среда CCS, в папке «Директория установки CCS\C6000\cgtools\lib\». Выберите папку размещения файла библиотеки в поле «Папка», Укажите в поле «Тип файла» — «Object and Library Files (*.o; *.l)», Щелкните по имени «rts6400» (после этого оно должно появиться в поле «Имя файла») и нажмите кнопку «Открыть». Окно «Add Files to Project» для случая подключения библиотеки «rts6400.lib». Вид программы CCS после всех операций по подключению файлов. Обратите внимание на закладку «File View» с правой стороны окна CCS, В ней представлена файловая структура проекта. Для просмотра дерева файлов необходимо нажать на значок «+» напротив выбранного пункта.
Последний этап создания проекта — это уточнение его настроек. Для выполнения этого необходимо в главном меню CCS выбрать пункт «Project->Build Options...».
В появившемся окне настроек проекта «Build Options for prjKIX_CCS.prj (Debug)» перейти на закладку «Compiler» и уточнить настройки пунктов «Basic» и Advanced» в разделе «Category».
В пункте «Basic» обратите внимание на выставление опции «Full Symbolic Debug (-g)» в окне «General Debug Info», а так же на соответствие типа процессора заданному при начальной настройки отладочной среды в окне «Target Version».
В пункте «Advanced» необходимо в окне «Endianness» установить опцию «Little Endian», а в «Memory Models» — значение «Far Aggregate». Настройки категории «Basic». Настройки категории «Advanced» на закладке «Compiler». на закладке «Compiler». Затем перейти на закладку «Linker».
Главное, в разделе «Category» для пункте «Basic» необходимо выставить значение «0х1000» в окнах «Heap Size (-heap)» и «Stack Size (-stack)».
Рис.20. Настройки категории «Basic» на закладке «Linker». Дальнейшее уточнение настроек проекта связано с настройками памяти процессора. Для этого необходимо в главном меню CCS выбрать пункт «Option->Memory Map» и появившемся окне «Memory Map» привести настройки. Обратить внимание на наличие записи «0х00000000 - 0хFFFFFFFF : RAM» в области поля «Memory Map List». Если запись не содержит слова «RAM» необходимо попробовать выставить или снять галочку «Enable Memory Mapping». И в завершении этапа уточнения настроек проекта вызываем окно дополнительных настроек «Customize». В появившемся окне «Customize» необходимо установить галочку в пункте «Load Program After Build» на закладке «Load Program» на закладке «Program/Project/CIO.
Процесс настройки
проекта завершен. Можно приступать
к компиляции проекта.
Вначале необходимо создать файл с именем «cnvBIX_asm.asm» и подключить его к проекту. Процедура аналогична той, что была проведена при создании и подключении файла «standard.cmd» (см. в разделе 2). Окна сохранения и подключения файла «cnvBIX_asm.asm» показаны, соответственно.
Следующий шаг — скопировать содержимое файла «cnvBIX.cpp» в открывшееся окно редактирования файла «cnvBIX_ asm.asm» и закомментировать каждую строчку знаком «;»: Сохраните изменения в файле «cnvBIX_ asm.asm», нажав кнопку. Вид CCS после создания, подключения, модификации и сохранения файла «cnvBIX_ asm.asm».Так как окно настроек свойств точек тестирования пока не нужно, можно его закрыть. Для этого нужно щелкнуть правой кнопкой мыши в области этого окна и в появившемся контекстном меню выбрать пункт «Hide». После этого окно CCS примет вид, показанный. Для написания ассемблерного кода функции «cnvBIX()» необходимо знать ее ассемблерное имя. Подсмотреть это имя можно в промежуточном ассемблерном файле, который создает сама отладочная среда CCS. Однако, этот файл уничтожается после завершения процесса компиляции. Что бы этого не происходило, необходимо щелкнуть правой кнопкой мыши на имени файла «cnvBIX.cpp» в закладке «File View» и появившемся контекстном меню вызываем окно настройки параметров компиляции щелкнув по пункту «File Specific Options». Появиться окно настройки параметров компиляции файла.В этом окне переходим на закладку «Compiler», выбираем категорию «Assembly», ставим галочку «Keep Generated .asm Files (-k)» и подтверждаем изменение параметров компиляции выбранного файла, нажав кнопку «OK». После этого компилируем выбранный файл независимо от всего проекта нажав кнопку.В папке проекта появиться еще один файл с именем «cnvBIX.asm». Открываем его в любом текстовом редакторе. Находим строчки вида:
.sect ".text"
.global _cnvBIX__FPsT1si
_cnvBIX__FPsT1si:
Первая строчка определяет секцию, где будет располагаться код функции cnvBIX(). Вторая — ассемблерное имя функции, а последняя — точку входа в функцию. Копируем эти строчки и вставляем в файл «cnvBIX_ asm.asm». Кроме этого, необходимо назначить имена регистрам общего назначения в соответствии с параметрами функции и локальными переменными. Это можно сделать при помощи директивы «.asg».
При выходе из функции необходимо записать результат вычислений в регистр A4 (согласно регистровым соглашениям) и перейти по адресу возврата, хранящемуся в регистре B3 (так же в соответствии с регистровыми соглашениями).
Прежде чем
приступить к написанию ассемблерного
кода непосредственно
Теперь можно приступить к написанию ассемблерного кода тела функции. В силу того, что С-код был написан с учетом его преобразования к ассемблерному виду, каждому С-оператору легко можно поставить в соответствие его ассемблерный аналог.
Функция cnvBIX_CCS.asm
;#include "prjBIX.h"
;word16 cnvBIX(word16* pCoeff,word16*
pShift,word16 namberCoeff, word32 constA)
.asg A3, coeff_A
.asg A4, pCoeff_A
.asg A5, coeffB_A
.asg A6, namberCoeff_A
.asg A7, rezult_A
.asg B0, count_B
.asg B3, adrReturn_B
.asg B4, pShift_B
.asg B5, coeffX_B
.asg B6, constA_B
.asg B7, CSROLD_B
.asg B15, SP
.sect ".text"
.global _cnvBIX__FPsT1si
_cnvBIX__FPsT1si
MVC .S2 CSR, CSROLD_B
AND .S2 CSROLD_B, -2, B1
MVC .S2
B1, CSR
SUB .L1 namberCoeff_A, 1, namberCoeff_A
ADD .S2X pShift_B, namberCoeff_A, pShift_B
ADD .S2X pShift_B, namberCoeff_A, pShift_B
ADD .S1 pCoeff_A, namberCoeff_A, pCoeff_A
ADD .S1 pCoeff_A, namberCoeff_A, pCoeff_A
LDH .D2T2 *pShift_B--, coeffX_B
LDH .D1T1 *pCoeff_A--, coeffB_A
NOP 4
MPY .M1X coeffX_B, coeffB_A, rezult_A
NOP
SUB .L2X
namberCoeff_A, 1, count_B
loop01:
LDH .D2T2 *pShift_B--, coeffX_B
NOP 4
STH .D2T2 coeffX_B, *pShift_B[2]
LDH .D1T1 *pCoeff_A--, coeffB_A
NOP 4
MPY .M1X coeffX_B, coeffB_A, coeff_A
NOP
ADD .S1 rezult_A, coeff_A, rezult_A
[count_B] BDEC .S2 loop01, count_B
NOP 5
MV .S1X
constA_B,A2
CMPGT .L1 rezult_A,0,A1
[A1] SHR
.S1 rezult_A,A2,A4
[!A1] SUB .L1 0,rezult_A, rezult_A
[!A1] SHR .S1 rezult_A,A2,A4
[!A1] SUB .L1 0,A4, A4
MVC .S2 CSROLD_B, CSR
B .S2 adrReturn_B
NOP 5
Так как к настоящему моменту в проект включены две функции cnvBIX() — одна написанная на С, а вторая — на ассемблере, необходимо исключить из процесса компиляции файл с С- кодом функции. Для этого необходимо щелкнуть правой кнопкой мыши на имени файла «cnvBIX.cpp» в закладке «File View» и через появившееся контекстное меню вызывать окно настройки параметров компиляции щелкнув по пункту «File Specific Options. В появившемся окне перейти на закладку «General» и поставить галочку в пункте «Exclude file from build» . Заметим на будущее, что повторив описанную процедуру, но сняв галочку в пункте «Exclude file from build», можно подключить файл к проекту, то есть снова включить его в процесс компиляции. Исключения файла из процесса компиляции проекта. Закладка «File View» после отключения файла «cnvBIX.cpp».
Обратите внимание, что в окне «File View» изменилось отображение файла «cnvBIX.cpp». Файл может быть вызван в окно редактирования, его можно изменять, сохранять и т.д., но в процессе компиляции он не участвует.
Откомпилировать проект заново, нажав кнопку полной компиляции проекта , и
запустить проект на выполнение, нажав кнопку анимированного запуска. Если все набрано верно, то компиляция должна пройти без ошибок, а после исполнения кода полученный выходной файл будет идентичен файлу полученному в случае подключения к проекту С-кода функции cnvBIX().
Основные правила и последовательность действий по оптимизации ассемблерного кода в CCS.
Заменяем операторы NOPn на n последовательных операций NOP. Пытаемся выполнить как можно больше операций параллельно. В нашем случае параллельно можно выполнить только две операции считывания данных. Затем — переносим операцию условного перехода на 5 тактов вверх. Так как в моём варианте задания каждое звено из 3-х элементов задержки для рекурсивной и нерекурсивной части, то число прохождений цикла будет тоже 3, учитывая это обстоятельство, цикл организовывать не нужно, а нужно вынести три такта цикла и оптимизировать их, путём склеивания. При этом следует учитывать конфликт одинаковых модулей.
Обратим внимание на следующие моменты:
оператор «[count_B]
BDEC .S2 loop01, count_B», в оптимизированном коде
не нужен, так как цикл повторяться больше
3-х раз не будет
Функция оптимизированная: cnvBIX_CCSopt.asm
;#include "prjBIX.h"
;word16 cnvBIX(word16* pCoeff,word16* pShift,word16 namberCoeff, word32 constA)
; //объявление локальных переменных
.asg A3, coeff_A ; word32 coeff;
.asg A4, pCoeff_A ; 1-й прм функции word16* pCoeff
.asg A5, coeffB_A ; word16 coeffB;
.asg A6, namberCoeff_A ; 3-й прм фнк word16 namberCoeff
.asg A7, rezult_A ; word32 reяult;
.asg A9,
halfConstA_A ; для хранения constA разделенного
на 2
.asg B0, count_B ; word32 count;
.asg B3, adrReturn_B ; адрес возврата
.asg B4, pShift_B ; 2-й прм фнк word16* pShift
.asg B5, coeffX_B ; word16 coeffX;
Информация о работе Синтез и программная реализация БИХ-фильтра