diff --git a/assignment_2/measurments.txt b/assignment_2/measurments.txt new file mode 100755 index 0000000..8adfd15 --- /dev/null +++ b/assignment_2/measurments.txt @@ -0,0 +1,13 @@ +mode-leading +1) av: 191.8 median: 205 std-dev: 22.2566833 +2) av: 235.4 median: 215 std-dev: 38.2130852 +3) av: 200.4 median: 201 std-dev: 14.122323 +4) av: 201.4 median: 183 std-dev: 23.3974361 +5) av: 207.0 median: 185 std-dev: 36.4197769 + +mode-trailing +1) av: 226.2 median: 208 std-dev: 34.1256523 +2) av: 224.8 median: 230 std-dev: 18.0930939 +3) av: 208.8 median: 197 std-dev: 34.3359871 +4) av: 217.0 median: 215 std-dev: 22.7068272 +5) av: 227.4 median: 221 std-dev: 29.8167744 \ No newline at end of file diff --git a/assignment_2/report/config b/assignment_2/report/config index ddb6624..c27d16e 160000 --- a/assignment_2/report/config +++ b/assignment_2/report/config @@ -1 +1 @@ -Subproject commit ddb6624bbf227f98db5d25ae7b2a5698719fc17b +Subproject commit c27d16e915615bc56a7b09f56e882661ac69b860 diff --git a/assignment_2/report/images/experiment-1.png b/assignment_2/report/images/experiment-1.png deleted file mode 100755 index 7b393c7..0000000 Binary files a/assignment_2/report/images/experiment-1.png and /dev/null differ diff --git a/assignment_2/report/images/experiment-2.png b/assignment_2/report/images/experiment-2.png deleted file mode 100755 index 2a30d46..0000000 Binary files a/assignment_2/report/images/experiment-2.png and /dev/null differ diff --git a/assignment_2/report/images/experiment.png b/assignment_2/report/images/experiment.png new file mode 100755 index 0000000..39f437d Binary files /dev/null and b/assignment_2/report/images/experiment.png differ diff --git a/assignment_2/report/images/leading.drawio b/assignment_2/report/images/leading.drawio new file mode 100644 index 0000000..8216c82 --- /dev/null +++ b/assignment_2/report/images/leading.drawio @@ -0,0 +1 @@ +7Vtbd6M2EP41Pid5cA53w+M6sbNp02zbpM3mUTEK1gaQC/Jtf30lEOYiGeP4guP2xQcNkpBm5tN8M+COfh0sbiMwGf+GXeh3NMVddPSbjqaZhkF/mWCZCmzHSgVehNxUpOaCR/QTcqHCpVPkwrjUkWDsEzQpC0c4DOGIlGQgivC83O0N++WnToAHBcHjCPii9Bm5ZMx3ofVy+VeIvHH2ZNVy0jsByDrzncRj4OJ5QaQPOvp1hDFJr4LFNfSZ7jK9PN8tn/37d+v2lz/if8Bf/V+fHv7uppMNtxmy2kIEQ/Lhqecz+88fd+Pv7vPt1J5j14qVoMuNG5Nlpi/oUvXxJo7IGHs4BP4gl/YjPA1dyGZVaCvvc4/xhApVKvwBCVlyXwBTgqloTAKf34ULRL6z4Vcmb70U7tws+MxJY5k1QhItC4NY86V4Lx+WtLJx6f7YpirusEGXvF+Mp9EI1vTTuUuDyIOkRtHqymEo0CAOIF0kHRdBHxA0Ky8OcJf3Vv1ys9ILbtktHIgvcgb8KX/SXYgIezwIXcEDcvsyk8zHiMDHCUi0MKdHRNmWbzgk3NAq3WDf80Ecc93HJMLvK9Sx3isI5aZpaokZjAhcFPQkKjO7a3DA8hNLc3h7nuNfzUA9LmA/G7eL/uXGVwUlHxFmagFkOeQ2wawEshxzLcHMEmEm7dc7EszkZtYEnL3Q0Ccz/T14pWG2ZC7gIy+k1yOqMRhRAfN4RAPZF34jQK6begaM0U/wmszHlD/BKCTJZsx+x7xZmUOAzCrK8sF5bCsaqsaF12Kuq1xpvYwZNNY2n+53tv7SXLZaQnBXrSATv73F1A+qBlut6+M21OxWI+JHoKqePFTlmm4Vq5ojYPUBnwdUUxeug6rqaNpeoKpdKc4RkFrnZwUDog7TkQUCxlF8kihXeRD5zRgHr9N4M7cpsRVGdIYgQD7b6VfozyCzuIQBCc4hoUH0kSj0aMvKW0/JWUEZ+QGZkWWWrGVoIjPqSYiRdTBipLd62p5B/tFreNquOROOk3/0BKje0OcuL1j6gQO2fBTASxGonzwR0exyImLorSciZpt42yYROTRuVEVuuh0Dol7JPc2qKVOg8lG5Nb9EEVgWunGesPY5hlJ5jlMp/mzqbygVZ0pXsFcurYohmobnJDC7aEYvPXbJaJfFo/WwID8PMpYirjZvMo0yh1L3Qs26qlGeVb2yegfgZvJdt5tFnUFcz3j05sJiuyUPMY06n5LHxjxKt7OSz16h6xwAprVOVrBe/+nhQsLE/rMpk+aUUybTEjmcc8yUSTuhlEn50NGqtn20Zq8hNxWTrSOdrLWrLJEnqps+EtH5yfOkalliRZo3lCUOliZppwOxk2cvUgVKyMv6F5NtcRdJ8IMeCkXb+z6axHAztNZSkGZ6rcFH5YWmpGxnS/BhHgofrVYRtsHHof381CJJ3SILfn4/oL/Kxbfh8DLLvV+jLO9OquhMfe2GmQPAqFKb0c3Wy3H/f36zIwDthgDcudy3k51tCZUT6mAUlBffHi7lxTCipqhk+ayPR++yHO2Tw1Oolrf+2Y7Wbpzbolp+At8C1BSnmnwMYLQaIcUXVBKAEk3EoLxwLcd2IdpuqHSfG5QtSUJ3ZChbpxNpT75qUoPQJqH2WJ+61i6zAGU8JSvgJhjusgvxk8zPjjrVbIA65aioa3SuDtg3yM3eALadiVc0bGQMYf+JOG3m/yxI6/353zP0wb8= \ No newline at end of file diff --git a/assignment_2/report/images/leading.png b/assignment_2/report/images/leading.png new file mode 100644 index 0000000..88abe8d Binary files /dev/null and b/assignment_2/report/images/leading.png differ diff --git a/assignment_2/report/report.pdf b/assignment_2/report/report.pdf new file mode 100644 index 0000000..276b830 Binary files /dev/null and b/assignment_2/report/report.pdf differ diff --git a/assignment_2/report/report.tex b/assignment_2/report/report.tex new file mode 100644 index 0000000..dbf38c8 --- /dev/null +++ b/assignment_2/report/report.tex @@ -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} \ No newline at end of file diff --git a/assignment_2/src/assign2_impl.h b/assignment_2/src/assign2_impl.h index a56bd83..ccec67c 100644 --- a/assignment_2/src/assign2_impl.h +++ b/assignment_2/src/assign2_impl.h @@ -26,7 +26,7 @@ //! If there is no Pre-define MODE, select one here #ifndef MODE -#define MODE MODE_TRAILING_EDGE +#define MODE MODE_LEADING_EDGE #endif #define MEASUREMENTS (5) //!< The number of measurements for each experiment @@ -53,7 +53,7 @@ typedef struct { } stats_t; fp_data_t average (const clock_t *t, size_t n); -fp_data_t median (const clock_t *t, size_t n); +fp_data_t median (clock_t *t, size_t n); fp_data_t std_deviation (const clock_t* t, size_t n); void leading (clock_t *out, size_t n); diff --git a/assignment_2/src/main.c b/assignment_2/src/main.c index 09fd390..33ccf44 100644 --- a/assignment_2/src/main.c +++ b/assignment_2/src/main.c @@ -15,19 +15,19 @@ */ stats_t stats; -/*! - * Compare functionality for qsort - * \param a left hand site - * \param b right hand site - * \return stdlib requirements - * \arg -1 ab - */ -static int cmpfunc (const void * a, const void * b) { - fp_data_t v = *(fp_data_t*)a - *(fp_data_t*)b; - return (v < 0) ? -1 : (v > 0) ? 1 : 0; -} +// A function to implement bubble sort +void bubbleSort(clock_t arr[], size_t n) { + size_t i, j; + clock_t t; + for (i =0; i arr[j+1]) { + t = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = t; + } +} /*! * Calculates and return the average of an array of measurements @@ -48,8 +48,8 @@ fp_data_t average (const clock_t *t, size_t n) { * \param n Size of measurements array * \return The average */ -fp_data_t median (const clock_t *t, size_t n) { - qsort ((void*)t, n, sizeof(t[0]), cmpfunc); +fp_data_t median (clock_t *t, size_t n) { + bubbleSort (t, n); return (n % 2) ? t[n/2] : (t[n/2] + t[n/2 -1]) /2; } @@ -132,7 +132,7 @@ int main(void) { // Get statistical data stats.average = average ((const clock_t*)times, MEASUREMENTS); - stats.median = median ((const clock_t*)times, MEASUREMENTS); + stats.median = median (times, MEASUREMENTS); stats.std_dev = std_deviation((const clock_t*)times, MEASUREMENTS); // Flash 10Hz to indicate the end of experiment