\documentclass[a4paper,fontsize=14bp]{article} \input{../common-preamble} \input{../bmstu-preamble} \input{../fancy-listings-preamble} \setcounter{secnumdepth}{0} \numerationTop \begin{document} \thispagestyle{empty} \makeBMSTUHeader % ... работе, номер, тема, предмет, ?а, кто \makeReportTitle{лабораторной}{1}{Исследование команд обработки сигналов}{Микропроцессорные устройства обработки сигналов}{}{А.И. Германчук} \newpage \thispagestyle{empty} \tableofcontents \newpage \pagestyle{fancy} \section{Цель} Целью лабораторной работы является знакомство с интегрированной средой разработки программ Code Composer Studio (CCS) компании Texas Instruments. Лабораторная работа заключается в написании в соответствие с выданным индивидуальным заданием текстов несложных программ на языке C и ассемблера, создании нового проекта в CCS, компиляции и отладке разработанных программ с помощью симулятора микропроцессора TMS320C5515 или оценочной платы TMS320C5515 DSP Evaluation Module (TMDXEVM5515). \section{Выполнение} Индивидуальным заданием было написание функции умножения и сложения с насыщением и округлением: \code{long _smacr(long src1, int src2, int src3)}. В учебном пособии \cite[с. 6-68]{dsp:lectures} и технической документацией \cite{ti:dsp-mnemonics} описаны как процессы умножения со сложением, так и используемые тестовые данные для проверки работоспособности. Согласно документации \cite[с. 77 (3-33)]{ti:dsp-prog-guide} прототип низкоуровневой функции и описание аргументов функции на языке Си имеют вид, представленный в таблице \hrf{table:prototype}. Функция осуществляет умножение операторов \code{op1} и \code{op2}, сдвиг полученного результата влево на один разряд, складывает результат со значением параметра \code{src}, округляет результат, добавляя число 215 и обнуляет младшие 16 разрядов. \begin{table}[H] \captionsetup{labelsep=endash} \centering \caption{Прототип и описание действия функции} \label{table:prototype} \begin{tabular}{|p{55mm}|p{110mm}|} \hline Прототип функции & Верхнеуровневое описание \\ [3ex] \hline \multirow{2}{54mm}{\code{long _smacr(long src, int op1, int op2)}} & Multiplies \code{op1} and \code{op2}, shifts the result left by 1, adds the result to \code{src}, and then rounds the result by adding 215 and zeroing out the lower 16 bits. (SATD, SMUL, and FRCT bits set).\\ \cline{2-2} & Returns the saturated sum of src1 and the fractional-mode product of src2 and src3. The sum is rounded as if the intrinsic \code{_sround} were used. \\ [5ex] \hline \end{tabular} \end{table} В наборе команд микропроцессора TMS320C55x \cite{ti:dsp-mnemonics} имеется команда, позволяющая реализовать умножение с насыщением и округлением. \code{MAC} – данная инструкция выполняет умножение и суммирование. Команда MAC имеет следующий синтаксис \cite[с. 273]{ti:dsp-mnemonics}: \begin{center} \code{MAC[R] ACx, Tx, ACy[, ACy]},\end{center} где: \begin{itemize} \item [] MAC – мнемоника команды умножения со сложением; \item [] R – признак округления результата операции; \item [] Tx - 16-разрядные регистры T0, T1; \item [] ACx и ACy – регистр аккумулятор AC0-AC3. \end{itemize} Необязательный параметр (5) заключён в квадратные скобки. Эта инструкция выполняет умножение и сложение. Входящие операнды умножителя ACx(32−16) и значение Tx знаково расширяются до 17 битов по формуле (\hrf{eq:expanding}) \begin{equation} ACy = ACy + (ACx * Tx). \label{eq:expanding} \end{equation} Умножение с накоплением чисел разной разрядности происходит как показано на рис. \hrf{pic:mac}. Для повторения этого действия необходимо переместить параметр, переданный в регистре \code{T0} в регистр большей разрядности \code{AC1} (строка \hrf{line:moving-to-hi}). Полный листинг ассемблерной команды (\hrf{code:prog-asm}) представлен в приложении \hrf{appendix:fulls}. \begin{figure}[H] \centering \includegraphics[height=5cm]{01lab-rpt-mac.png} \caption{Умножение с накоплением} \label{pic:mac} \end{figure} \section{Результаты работы} После запуска проверочной программы (\hrf{code:prog-c}) представленной в приложении \hrf{appendix:fulls} было доказано совпадение результатов библиотечной функции и описанной в листинге \hrf{code:prog-asm}. Снимки экрана, демонстрирующие идентичность полученных результатов представлены на рис. \hrf{pic:result}. \begin{figure}[H] \centering \begin{subfigure}[b]{0.7\textwidth} \centering \includegraphics[width=\textwidth]{01lab-rpt-1.png} \end{subfigure} \begin{subfigure}[b]{0.7\textwidth} \centering \includegraphics[width=\textwidth]{01lab-rpt-2.png} \end{subfigure} \caption{Результаты вызова функций \code{_smacr} и \code{lab1}} \label{pic:result} \end{figure} \newpage \printbibliography[heading=bibintoc, title={Список литературы}, resetnumbers=1] \newpage \appendix \section*{Приложения} \addcontentsline{toc}{section}{Приложения} \renewcommand{\thesubsection}{\Alph{subsection}} \subsection{Полные листинги программ} \label{appendix:fulls} \begin{lstlisting}[language=C,style=CCodeStyle,caption={Программа на языке С}, label=code:prog-c] #include "stdio.h" #define SIZE 2 //long _smacr(long src1, int src2, int src3); extern long lab1(long, int, int); void main(void) { //Локальные переменные int i; int intValues[] = {0x00008001, 0xFFFE0001}; long longValues[] = {0x00008001, 0xFFFE0001}; long result_lib; long result_lab; for (i = 0; i < SIZE; ++i) { result_lib = 10; result_lab = 10; result_lib = _smacr(result_lib, longValues[i], intValues[i]); result_lab = lab1(result_lab, longValues[i], intValues[i]); int neq = result_lib - result_lab; } } \end{lstlisting} \begin{lstlisting}[style=ASMStyle,caption={Описание функции на языке ассемблера}, label=code:prog-asm] .def _lab1 .text _lab1: BSET FRCT BSET SATD MOV T1,HI(AC1) <@\label{line:moving-to-hi}@> MACR AC1, T0, AC0 RET \end{lstlisting} \end{document}