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