BMSTU/02-dspmd-02-lab-report.tex

249 lines
10 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\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{лабораторной}{2}{Исследование процессов обработки сигналов}{Микропроцессорные устройства обработки сигналов}{}{А.И. Германчук}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель}
Целью работы является изучение стандартных процедур обработки сигналов и данных, а также их реализация в интегрированной среде проектирования Code Composer Studio версии 5 и на микропроцессоре TMS320C5515 компании Texas Instruments Incorporated. При выполнении лабораторной работы используется симулятор микропроцессора TMS320C5515 или оценочноя плата TMS320C5515 DSP Evaluation Module (TMDXEVM5515).
\section{Выполнение}
Индивидуальным заданием было написание функции вычисления арктангенса числа: \code{ushort atan16(DATA *x, DATA *r, ushort nx)}.
\section{Результаты работы}
После запуска проверочной программы (\hrf{code:prog-c}) представленной в приложении \hrf{appendix:fulls} было доказано совпадение результатов библиотечной функции (листинг \hrf{code:std-asm}) и описанной в дизассемблированном листинге \hrf{code:asm}. Результаты работы профилировщика отражены в таблице \hrf{table:profiler}. Снимки экрана, демонстрирующие идентичность полученных результатов представлены на рис. \hrf{pic:result}.
\begin{table}[H]
\centering
\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|}
\hline
Name & Calls & EC Av & EC Ttl & IC Av & IC Ttl & File \\
\hline
atan(short *, short *, int) & 1 & 969.0 & 969.0 & 3384.0 & 3384.0 & main.c \\
\hline
null() & 1 & 49.0 & 49.0 & 49.0 & 49.0 & atan16.asm \\
\hline
\end{tabular}
\caption{Результат работы профилировщика}
\label{table:profiler}
\end{table}
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{02lab-rpt-1.png}
\caption{Результат вычислений}
\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}[style=ASMStyle,caption={Стандартный ассемблерный листинг}, label=code:std-asm]
_atan16:
;* AR0 assigned to _x
;* AR1 assigned to _r
;* T0 assigned to _nx
PSH T3
|| BSET FRCT ;fractional mode
SUB #1, T0 ;nx-1
MOV T0, BRC0 ;repeat nx times
MOV #2596 << #16, AC3 ; AC3.Hi = C5
MOV #-9464 << #16, AC1 ; AC1.Hi = C3
MOV #32617 << #16, AC2 ; AC2.Hi = C1
MPYMR T3=*AR0+, AC3, AC0 ; (Prime the Pump)
|| RPTBLOCAL loop1-1
MACR AC0, T3, AC1, AC0
MPYR T3, AC0
||MOV *AR0+, T1 ; (for next iteration)
MACR AC0, T3, AC2, AC0
MPYR T3, AC0
||MOV T1, T3
MOV HI(AC0), *AR1+ ;save result
||MPYR T1, AC3, AC0 ; (for next iteration)
loop1:
POP T3
|| BCLR FRCT ;return to standard C
MOV #0, T0 ;return OK value (no possible error)
|| RET
\end{lstlisting}
\newpage
\begin{lstlisting}[language=C,style=CCodeStyle,caption={Программа на языке С}, label=code:prog-c]
#include "TMS320.h"
#define NX 7
#define FNAME "t1"
#define MAXERROR 40
ushort atan16(DATA *x, DATA *r, ushort nx);
short atan(DATA *x, DATA *r, int nx) {
long long ac3 = ((long long) 2596) << 16; // AC3.Hi = C5 0.0396118164062500
long long ac1 = ((long long) -9464) << 16; // AC1.Hi = C3 -0.1444091796875000
long long ac2 = ((long long) 32617) << 16; // AC2.Hi = C1 0.4976959228515625
while (--nx >= 0) {
long long ac0;
DATA t3 = *(x + nx);
ac0 = (t3 * (ac3 >> 15)) << 1; // MPYMR T3=*AR0+, AC3, AC0
ac0 = ((ac0 >> 15) * t3) + ac1; // MACR AC0, T3, AC1, AC0
ac0 = ((ac0 >> 15) * t3); // MPYR T3, AC0
ac0 = ((ac0 >> 15) * t3) + ac2; // MACR AC0, T3, AC2, AC0
ac0 = ((ac0 >> 15) * t3); // MPYR T3, AC0
*(r + nx) = ac0 >> 16; // MOV HI(AC0), *AR1+
}
return 0;
}
int main(void) {
DATA x[NX] = {8192,16384,24576,32767,-8192,-16384,-24576};
DATA rtest[NX] ={8027,15192,21086,25735,-8028,-15193,-21087};
DATA r[NX];
DATA r0[NX];
(void)atan16(x, r0, NX);
atan(x, r, NX);
return 0;
}
\end{lstlisting}
\newpage
\begin{lstlisting}[style=ASMStyle,caption={Дизассемблированная программа}, label=code:asm]
atan:
4ee9 AADD #-23,SP
c408 MOV T0,*SP(#04h)
eb0495 MOV XAR1,dbl(*SP(#02h))
eb0085 MOV XAR0,dbl(*SP(#00h))
long long ac3 = ((long long) 2596) << 16;
7a0a240a MOV #2596 << #16,AC0
46a3_110700 BSET ST1_M40 || SFTL AC0,#0,AC0
104720 SFTL AC0,#-32,AC1
eb0c18 MOV AC1,dbl(*SP(#06h))
eb1008 MOV AC0,dbl(*SP(#08h))
long long ac1 = ((long long) -9464) << 16;
7adb080a MOV #-9464 << #16,AC0
104720 SFTL AC0,#-32,AC1
eb1418 MOV AC1,dbl(*SP(#0ah))
eb1808 MOV AC0,dbl(*SP(#0ch))
long long ac2 = ((long long) 32617) << 16;
7a7f690a_47a2 MOV #32617 << #16,AC0 || BCLR ST1_M40
46a3_110700 BSET ST1_M40 || SFTL AC0,#0,AC0
104720 SFTL AC0,#-32,AC1
eb1c18 MOV AC1,dbl(*SP(#0eh))
eb2008 MOV AC0,dbl(*SP(#10h))
while (--nx >= 0)
a908 MOV *SP(#04h),AR1
4219 SUB #1,AR1
c908 MOV AR1,*SP(#04h)
6d2900d6 BCC C$DW$L$_atan$2$E,AR1 < #0
DATA t3 = *(x + nx);
2294 MOV AR1,T0
ed00bf MOV dbl(*SP(#00h)),XAR3
a96b MOV *AR3(T0),AR1
c92c MOV AR1,*SP(#16h)
ac0 = (t3 * (ac3 >> 15)) << 1;
ed1018 MOV dbl(*SP(#08h)),AC1
ed0c28 MOV dbl(*SP(#06h)),AC2
c21a_98 MOV AC2,mmap(@AC1G)
a02c MOV *SP(#16h),AC0
46a2_115531 BCLR ST1_M40 || SFTS AC1,#-15,AC1
6c00207d CALL _mpylli
46a3 BSET ST1_M40
4450 SFTS AC0,#1
104720 SFTL AC0,#-32,AC1
eb2418 MOV AC1,dbl(*SP(#12h))
eb2808 MOV AC0,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3) + ac1;
ed2808 MOV dbl(*SP(#14h)),AC0
ed2418 MOV dbl(*SP(#12h)),AC1
c114_98 MOV AC1,mmap(@AC0G)
a12c MOV *SP(#16h),AC1
46a2_110531 BCLR ST1_M40 || SFTS AC0,#-15,AC0
6c00207d CALL _mpylli
ed1428 MOV dbl(*SP(#0ah)),AC2
ed1818 MOV dbl(*SP(#0ch)),AC1
c21a_98 MOV AC2,mmap(@AC1G)
46a3 BSET ST1_M40
2401 ADD AC0,AC1
101720 SFTL AC1,#-32,AC0
eb2408 MOV AC0,dbl(*SP(#12h))
eb2818 MOV AC1,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3);
ed2418 MOV dbl(*SP(#12h)),AC1
ed2808 MOV dbl(*SP(#14h)),AC0
c114_98 MOV AC1,mmap(@AC0G)
a12c MOV *SP(#16h),AC1
46a2_110531 BCLR ST1_M40 || SFTS AC0,#-15,AC0
6c00207d CALL _mpylli
46a3 BSET ST1_M40
104720 SFTL AC0,#-32,AC1
eb2418 MOV AC1,dbl(*SP(#12h))
eb2808 MOV AC0,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3) + ac2;
ed2808 MOV dbl(*SP(#14h)),AC0
ed2418 MOV dbl(*SP(#12h)),AC1
c114_98 MOV AC1,mmap(@AC0G)
a12c MOV *SP(#16h),AC1
46a2_110531 BCLR ST1_M40 || SFTS AC0,#-15,AC0
6c00207d CALL _mpylli
ed1c28 MOV dbl(*SP(#0eh)),AC2
ed2018 MOV dbl(*SP(#10h)),AC1
c21a_98 MOV AC2,mmap(@AC1G)
46a3 BSET ST1_M40
2401 ADD AC0,AC1
101720 SFTL AC1,#-32,AC0
eb2408 MOV AC0,dbl(*SP(#12h))
eb2818 MOV AC1,dbl(*SP(#14h))
ac0 = ((ac0 >> 15) * t3);
ed2418 MOV dbl(*SP(#12h)),AC1
ed2808 MOV dbl(*SP(#14h)),AC0
c114_98 MOV AC1,mmap(@AC0G)
a12c MOV *SP(#16h),AC1
46a2_110531 BCLR ST1_M40 || SFTS AC0,#-15,AC0
6c00207d CALL _mpylli
46a3 BSET ST1_M40
104720 SFTL AC0,#-32,AC1
eb2418 MOV AC1,dbl(*SP(#12h))
eb2808 MOV AC0,dbl(*SP(#14h))
*(r + nx) = ac0 >> 16;
a408 MOV *SP(#04h),T0
ed04bf MOV dbl(*SP(#02h)),XAR3
ed2418 MOV dbl(*SP(#12h)),AC1
ed2808 MOV dbl(*SP(#14h)),AC0
c114_98 MOV AC1,mmap(@AC0G)
bc6b MOV HI(AC0),*AR3(T0)
a908 MOV *SP(#04h),AR1
4219 SUB #1,AR1
c908 MOV AR1,*SP(#04h)
6d59ff2a BCC C$L1,AR1 >= #0
return 0;
\end{lstlisting}
\end{document}