\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}

