|
|
@@ -0,0 +1,157 @@ |
|
|
|
% |
|
|
|
% 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} |