% 
% Microprocessors and peripherals 2nd assignement.
%
% author:
%   Χρήστος Χουτουρίδης ΑΕΜ 8997
%   cchoutou@ece.auth.gr


% Document configuration
\newcommand{\ClassName}{Μικροεπεξεργαστές και Περιφερειακά}
\newcommand{\DocTitle}{2η Εργασία}
\newcommand{\InstructorName}{Παπαευσταθίου Ιωάννης}
\newcommand{\InstructorMail}{ygp@ece.auth.gr}
\newcommand{\CurrentDate}{\today}

\input{config/AuthReportConfig.tex}

%\renewcommand{\AuthorName}{Χρήστος Χουτουρίδης}
%\renewcommand{\AuthorMail}{cchoutou@ece.auth.gr}
%\renewcommand{\AuthorAEM}{8997}

\setFancyHeadLR{\ClassName}{\DocTitle}
%\setFancyHeadLERO{\ClassName}{\DocTitle}

% Document
% =================
\begin{document}

%\FirstPage
\TitleHeader

%\tableofcontents
%\listoffigures
%\listoftables

\section{Εισαγωγή} 
Στην παρούσα εργασία το ζητούμενο ήταν η υλοποίηση μιας εφαρμογής για το αναπτυξιακό \eng{Nucleo-F401RE} της εταιρίας \eng{ST Microelectronics,} η οποία θα μετρά το χρόνο απόκρισης ενός ατόμου σε κάποιο οπτικό ερέθισμα.
Η ανάπτυξη έγινε σε γλώσσα \eng{C} και χρησιμοποιήθηκε το εργαλείο \eng{Keil uVision.}
Ομοίως και σε αυτή την εργασία, κατά την ανάπτυξη δεν προκύψαν ιδιαίτερα προβλήματα, επομένως η αναφορά θα αφιερωθεί κυρίως στην υλοποίηση και τον έλεγχο του προγράμματος.
Ο κώδικας της εργασίας αλλά και της παρούσας αναφοράς υπάρχει και στο \href{https://git.hoo2.net/hoo2/Micro2020/src/branch/master/assignment_2}{προσωπικό αποθετήριο} για την εργασίας, του συντάκτη.

\section{Παραδοτέα}
Στο παραδοτέο \eng{.zip} αρχείο μπορείτε να βρείτε:
\begin{itemize}
    \item Τον κατάλογο \textbf{\eng{/src}} που περιέχει τον κώδικα της εφαρμογής.
    \item Τον κατάλογο \textbf{\eng{/Libraries}} που περιέχει τον κώδικα των βιβλιοθηκών που χρησιμοποιήσαμε, όπως το \eng{CMSIS} και το \eng{ST HAL.}
    \item Το αρχείο \textbf{\eng{report.pdf}} που είναι η παρούσα αναφορά.
    \item Τον κατάλογο \textbf{\eng{/Keil}} που περιέχει το \eng{project} που χρησιμοποιήθηκε στο \eng{Keil.}\\
    Στο \eng{project} αυτό περιέχονται επιπλέων οι ρυθμίσεις καθώς και τα αρχεία από τις βιβλιοθήκες που χρησιμοποιήθηκαν.
\end{itemize}
Για την παρούσα εργασία χρησιμοποιήσαμε το \eng{CMSIS} και το \eng{STM32F4xx\_HAL} που παρέχει η εταιρία \eng{ST} στο επίσημο αποθετήριό της.
Η επιλογή αυτού έναντι των αρχείων από το \eng{STM32F4xx Std\_Peripheral} που περιεχόταν στο \eng{e-learning} του μαθήματος έγινε για να συμβαδίσουμε με τις βιβλιοθήκες που προτείνει ή κατασκευάστρια εταιρία.
Επίσης η χρήση τους έγινε στο ίδιο χαμηλό επίπεδο της \eng{STM32F4xx\_Std\_Peripheral} κάτι το οποίο προτείνεται και από τον διδάσκοντα.
\emph{\textbf{Εξάλλου μια υψηλότερου επιπέδου χρίση δεν θα είχε νόημα καθώς θα ξέφευγε από τον μαθησιακό χαρακτήρα της εργασίας}}.

\section{Υλοποίηση}
Η υλοποίηση της εφαρμογής έγινε σε δύο μέρη.
Στο πρώτο υλοποιήσαμε ένα \eng{driver interface wrapper} πάνω από το \eng{Nucleo board.}
Σε αυτό υπάρχουν βασικές συναρτήσεις για την αρχικοποίηση και λειτουργία του \eng{board} που αφορούν όμως μόνο τις λειτουργίες που χρειαζόμαστε για την εφαρμογή.
Στο δεύτερο υλοποιήσαμε την “λογική” της εφαρμογής η οποία είναι ανεξάρτητη από το υλικό στο οποίο τρέχει.
Με τον τρόπο αυτό μπορούμε να μεταφέρουμε την εφαρμογή σε διαφορετικό \eng{hardware} υλοποιώντας μόνο τον \eng{driver} και φροντίζοντας αυτός να παρέχει το ίδιο \eng{API.}

\subsection{Οδηγός του \eng{Nucleo}}
Ο επεξεργαστής που φέρει το εν λόγο αναπτυξιακό είναι πολύ μεγαλύτερος από τις ανάγκες της παρούσας εργασίας.
Έτσι τα υποσυστήματα που χρησιμοποιήσαμε ήταν ελάχιστα.
Για την ακρίβεια έγινε χρήση:
\begin{itemize}
    \item Του \eng{\textbf{SysTick timer}} ώς βάση μέτρησης χρόνου.\\
    Η συχνότητα που επιλέξαμε είναι το \eng{1Khz,} με αποτέλεσμα η ακρίβειά μας να περιορίζεται στο \eng{1msec}.
    Αυτό βέβαια δεν αποτελεί πρόβλημα καθώς ο μέσος χρόνος απόκρισης ενός ανθρώπου σε κάποιο οπτικό ερέθισμα είναι περίπου \eng{200 msec,} κάτι που θέτει το σφάλμα μας γύρω στο 0.5\%.
    \item Του \eng{\textbf{GPIO}} για την ανάγνωση του κουμπιού και την οδήγηση του \eng{LED} της πλακέτας.
    \item Του \eng{\textbf{RCC}} για τον έλεγχο και των σημάτων ρολογιού εσωτερικά του επεξεργαστή στα διάφορα υποσυστήματα.
    \item Του \eng{\textbf{Cycle count}} μηχανισμού στον \eng{debugger.}\\
    Ο εν λόγο μηχανισμός υλοποιήθηκε στο αρχείο του οδηγού αλλά \textbf{δεν χρησιμοποιήθηκε} στην εφαρμογή καθώς η ακρίβειά του είναι πολλές τάξεις μεγαλύτερη από την απαιτούμενη. 
\end{itemize}

\par
Αξίζει ίσως σε αυτό το σημείο να αναφέρουμε πως για την μέτρηση χρόνου χρησιμοποιήσαμε μεταβλητές για απαρίθμηση των διακοπών του \eng{SysTick.}
Η εφαρμογή έτσι μπορούσε βλέποντας την τιμή τους να έχει εικόνα του χρόνου που έχει περάσει από το \eng{power up.}

\subsection{Εφαρμογή}
\WrapFigure{0.45}{r}{fig:leading}{leading.png}{
    Διάγραμμα ροής του πρώτου \eng{mode} λειτουργίας.
}
Η εφαρμογή που αναλαμβάνει τη λογική του πειράματος αποτελείται από δύο τμήματα.
Το τμήμα που αναλαμβάνει να πραγματοποιήσει τις μετρήσεις και το τμήμα που υπολογίζει τα στατιστικά.
Στην εν λόγο εργασία μας ζητήθηκε η εμφάνιση των αποτελεσμάτων μέσω του \eng{debugger,} έτσι δεν υπάρχει κάποιο τμήμα που να εμφανίζει δεδομένα στο χρήση.

\par
Ποιο συγκεκριμένα για τις μετρήσεις έχουμε υλοποιήσει δύο συναρτήσεις.
\begin{itemize}
    \item Την \eng{\textbf{\textit{leading()}}} η οποία εκτελεί το πείραμα του πρώτου τύπου.
    \item Την \eng{\textbf{\textit{trailing()}}} η οποία εκτελεί το πείραμα του δεύτερου τύπου.
\end{itemize}

Στο σχήμα \ref{fig:leading} φαίνεται το διάγραμμα ροής της \eng{\textit{leading()}}.
Πρόκειται για μια απλή \eng{blocking mode} συνάρτηση η οποία σε βρόχο περιμένει ένα τυχαίο χρονικό διάστημα, έπειτα ανάβει το \eng{LED} και ξανα-περιμένει μέχρι ο χρήστης να πατήσει το πλήκτρο.
Στο βρόχο μετά το άναμμα του \eng{LED} και μετά το πάτημα του πλήκτρου γίνεται ανάγνωση της \eng{CPU time} (που αντιστοιχεί σε \eng{msec.})
Έτσι ο συνολικός χρόνος απόκρισης του χρήστη είναι η διαφορά τους.
Την διαφορά τους την αποθηκεύουμε σε ένα πίνακα στη μνήμη (όρισμα \eng{out}) ώστε μετέπειτα να επεξεργαστούμε και να υπολογίσουμε τα στατιστικά.

\par
Η συνάρτηση \eng{\textit{trailing()}} είναι όμοια με μόνη διαφορά τη συμπεριφορά του \eng{LED.}
Στην περίπτωση της \eng{\textit{leading()}} το ανάβουμε και μετράμε, ενώ στην περίπτωση της \eng{\textit{trailing()}} το σβήνουμε.

\par
\InsertFigure{0.5}{fig:experiment}{experiment.png}{
    Στιγμιότυπο αποτελεσμάτων των συναρτήσεων για τα στατιστικά μέσω του \eng{debugger.}\\
    Στη δομή \eng{stat} κρατάμε τα στατιστικά στοιχεία και στον πίνακα \eng{times} τις μετρήσεις από την τρέχουσα συνεδρία.
}
Για στατιστική ανάλυση των μετρήσεων υλοποιήσαμε 3 συναρτήσεις.
\begin{itemize}
    \item Την \eng{\textbf{\textit{average()}}} η οποία υπολογίζει το μέσο όρο των μετρήσεων και επιστρέφει το αποτέλεσμα σε έναν αριθμό κινητής υποδιαστολής.
    \item Την \eng{\textbf{\textit{median()}}} η οποία υπολογίζει τον διάμεσο των μετρήσεων και επιστρέφει το αποτέλεσμα σε έναν αριθμό κινητής υποδιαστολής.  
    \item Την \eng{\textbf{\textit{std\_deviation()}}} η οποία υπολογίζει την απόκλιση των μετρήσεων και επιστρέφει το αποτέλεσμα σε έναν αριθμό κινητής υποδιαστολής.
\end{itemize}
Ένα παράδειγμα αποτελεσμάτων από δεδομένα που τροφοδοτούνται σε αυτές τις συναρτήσεις φαίνεται και στο σχήμα \ref{fig:experiment}.

\section{Μετρήσεις}
Παρακάτω παραθέτουμε ένα πίνακα με μετρήσεις που κάναμε με το \eng{Nucleo.}
Εκτελέσαμε 5 μετρήσεις με το πρώτο \eng{mode} λειτουργίας και με 5 με το δεύτερο.\\
Οι μετρήσεις από το πρώτο είναι:\\
\[
    \begin{array}{rccc}
        Α/Α & \eng{Average [msec]} & \eng{Median [msec]} & \eng{std. Deviation [msec]}\\
        1 & 191.8 & 205 & 22.2566833 \\ 
        2 & 235.4 & 215 & 38.2130852 \\ 
        3 & 200.4 & 201 & 14.122323  \\ 
        4 & 201.4 & 183 & 23.3974361 \\ 
        5 & 207.0 & 185 & 36.4197769
    \end{array}
\]
Οι μετρήσεις από το δεύτερο είναι:\\
\[
    \begin{array}{rccc}
        Α/Α & \eng{Average [msec]} & \eng{Median [msec]} & \eng{std. Deviation [msec]}\\
        1 & 226.2 & 208 & 34.1256523 \\
        2 & 224.8 & 230 & 18.0930939 \\ 
        3 & 208.8 & 197 & 34.3359871 \\ 
        4 & 217.0 & 215 & 22.7068272 \\ 
        5 & 227.4 & 215 & 29.8167744
    \end{array}
\]

\section{Συμπεράσματα - Παρατηρήσεις}
Συνοψίζοντας την εμπειρία μας με την παρούσα εργασία δεν έχουμε να αναφέρουμε κάποιο ιδιαίτερο πρόβλημα ή δυσκολία.
Το μόνο μεμπτό σημείο, με το οποίο βέβαια δεν καθυστερήσαμε ιδιαίτερα ήταν η φτωχή υποστήριξη του \eng{Keil} για την \eng{qsort.}
Από την εμπειρία μας με τον \eng{compiler gcc,} ποτέ δεν είχαμε αντιμετωπίσει παρόμοια προβλήματα και η άρνηση του \eng{Keil} ήταν κάτι που μας άφησε αρνητικές εντυπώσεις.
Παρόλα αυτά δεν αναλωθήκαμε να ιχνηλατήσουμε το πρόβλημα, αλλά παρουσιάσαμε μια ταπεινή υλοποίηση της \eng{bobble sort,} που για το μέγεθος των μετρήσεών μας είναι ιδανική.

% References
% ============================
%\begin{thebibliography}{100}
%\bibitem{item}item...
%\end{thebibliography}

\end{document}