Kaynağa Gözat

Assignment 2 added

tags/v2.0^0
ebeveyn
işleme
0fdf4330f7
11 değiştirilmiş dosya ile 190 ekleme ve 19 silme
  1. +13
    -0
      assignment_2/measurments.txt
  2. +1
    -1
      assignment_2/report/config
  3. BIN
      assignment_2/report/images/experiment-1.png
  4. BIN
      assignment_2/report/images/experiment-2.png
  5. BIN
      assignment_2/report/images/experiment.png
  6. +1
    -0
      assignment_2/report/images/leading.drawio
  7. BIN
      assignment_2/report/images/leading.png
  8. BIN
      assignment_2/report/report.pdf
  9. +157
    -0
      assignment_2/report/report.tex
  10. +2
    -2
      assignment_2/src/assign2_impl.h
  11. +16
    -16
      assignment_2/src/main.c

+ 13
- 0
assignment_2/measurments.txt Dosyayı Görüntüle

@@ -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

+ 1
- 1
assignment_2/report/config

@@ -1 +1 @@
Subproject commit ddb6624bbf227f98db5d25ae7b2a5698719fc17b
Subproject commit c27d16e915615bc56a7b09f56e882661ac69b860

BIN
assignment_2/report/images/experiment-1.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 473  |  Yükseklik: 280  |  Boyut: 9.8 KiB

BIN
assignment_2/report/images/experiment-2.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 473  |  Yükseklik: 272  |  Boyut: 9.7 KiB

BIN
assignment_2/report/images/experiment.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 470  |  Yükseklik: 270  |  Boyut: 9.7 KiB

+ 1
- 0
assignment_2/report/images/leading.drawio Dosyayı Görüntüle

@@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2020-05-24T15:44:18.679Z" agent="5.0 (X11)" etag="FnlVK5Au8EWsuw3rlLOd" version="13.0.6" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-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=</diagram></mxfile>

BIN
assignment_2/report/images/leading.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 359  |  Yükseklik: 461  |  Boyut: 23 KiB

BIN
assignment_2/report/report.pdf Dosyayı Görüntüle


+ 157
- 0
assignment_2/report/report.tex Dosyayı Görüntüle

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

+ 2
- 2
assignment_2/src/assign2_impl.h Dosyayı Görüntüle

@@ -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);


+ 16
- 16
assignment_2/src/main.c Dosyayı Görüntüle

@@ -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 a<b
* \arg 0 a==b
* \arg 1 a>b
*/
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 <n-1; ++i)
// Last i elements are already in place
for (j = 0; j<n-i-1; ++j)
if (arr[j] > 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


Yükleniyor…
İptal
Kaydet