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

249 lines
10 KiB
TeX
Raw Normal View History

2023-01-27 22:32:16 +03:00
\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}