Browse Source

Add new experiment, Init report

master
Apostolos Fanakis 6 years ago
parent
commit
fe08c85df0
  1. 2
      Makefile
  2. 2
      README.md
  3. 3
      report/1.introduction.tex
  4. 25
      report/2.code.tex
  5. 11
      report/3.experiments.tex
  6. 37
      report/4.results.tex
  7. 1
      report/TOC.tex
  8. 1
      report/front_page.tex
  9. BIN
      report/report.pdf
  10. 48
      report/report.tex
  11. 11448
      report/res/diagrams/graph_exp_12.eps
  12. 15587
      report/res/diagrams/graph_exp_34.eps
  13. 8
      test_sample.c
  14. 42
      test_sample_functions.c

2
Makefile

@ -5,7 +5,7 @@ SHELL := /bin/bash
CC = gcc -std=gnu99
RM = rm -f
CFLAGS_DEBUG=-O2 -ggdb3 -Wall -Werror -pedantic -D_FORTIFY_SOURCE=2 -fasynchronous-unwind-tables -grecord-gcc-switches -Werror=implicit-function-declaration -I.
CFLAGS_DEBUG=-O0 -ggdb3 -Wall -Werror -pedantic -D_FORTIFY_SOURCE=2 -fasynchronous-unwind-tables -grecord-gcc-switches -Werror=implicit-function-declaration -I.
CFLAGS=-O2 -Wall -Werror -pedantic -I.
OBJ=test_sample.o test_sample_functions.o

2
README.md

@ -23,6 +23,8 @@ where:
2. **delta** is the sampling period in seconds
3. **output** is the output filename and path
all parameters are optional and have default values.
---
## Status

3
report/1.introduction.tex

@ -0,0 +1,3 @@
\section{Εισαγωγή}
Η παρούσα εργασία εκπονήθηκε στα πλαίσια του μαθήματος ``Ενσωματωμένα Συστήματα Πραγματικού Χρόνου'' του ενάτου (8\textsuperscript{ου}) εξαμήνου του τμήματος Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών του Αριστοτέλειου Πανεπιστημίου Θεσσαλονίκης. Ζητούμενο του πρώτου παραδοτέου της εργασίας είναι η πειραματική υλοποίηση προγράμματος σε C με στόχο τη δειγματοληψία ανά τακτά χρονικά διαστήματα με την ελάχιστη δυνατή απόκλιση από τη πραγματική περίοδο δειγματοληψίας. Στην αναφορά αναλύονται τα πειράματα που υλοποιήθηκαν και τα αποτελέσματά τους.

25
report/2.code.tex

@ -0,0 +1,25 @@
\section{Κώδικας}
Ο κώδικας είναι διαθέσιμος, μέσω ενός gitlab repository, στη παρακάτω διεύθυνση.
\url{https://gitlab.com/apostolof-ece-auth-gr/authRTESTask1}
Η δομή των αρχείων είναι ως εξής:
\begin{itemize}
\item Ο φάκελος report περιέχει τον κώδικα σε latex της παρούσας αναφοράς
\item Το αρχείο test\_sample.c περιέχει την συνάρτηση main
\item Το αρχείο test\_sample\_functions.h περιέχει τις δηλώσεις των συναρτήσεων, σταθερών, δομών (structs) και άλλες παραμέτρους του προγράμματος
\item Το αρχείο test\_sample\_functions.c περιέχει τις υλοποιήσεις των συναρτήσεων
\end{itemize}
Παρέχεται επίσης αρχείο Makefile για εύκολο compilation του προγράμματος χρησιμοποιώντας την εντολή \texttt{make}.
Το πρόγραμμα δέχεται τρεις προαιρετικές παραμέτρους και εκτελείται με την εντολή \texttt{./test\_sample [-t time] [-d delta] [-o output]}, όπου:
\begin{itemize}
\item \textbf{time} είναι ο χρόνος δειγματοληψίας σε δευτερόλεπτα για τον οποίο τρέχει κάθε πείραμα, προκαθορισμένη τιμή 7200 δευτερόλεπτα
\item \textbf{delta} είναι η περίοδος δειγματοληψίας σε δευτερόλεπτα, προκαθορισμένη τιμή 0,1 δευτερόλεπτα
\item \textbf{output} είναι το όνομα του αρχείου εξόδου, προκαθορισμένο όνομα αρχείου ``sample\_test\_output''
\end{itemize}
Οι βασικές συναρτήσεις που υλοποιούν τα πειράματα και ενδιαφέρουν τον αναγνώστη είναι η συνάρτηση \texttt{main} στο αρχείο \texttt{test\_sample.c} και η συνάρτηση \texttt{testSampling} στο αρχείο \texttt{test\_sample\_functions.c}. Περισσότερες πληροφορίες για την \texttt{testSampling} δίνονται στο επόμενο κεφάλαιο.

11
report/3.experiments.tex

@ -0,0 +1,11 @@
\section{Πειράματα}
Στο πρόγραμμα που παραδίδεται υλοποιούνται τέσσερα πειράματα. Όλα τα πειράματα υλοποιούνται διαδοχικά στο σώμα της συνάρτησης \texttt{testSampling}.
Στο πρώτο πείραμα (lines 29-38) γίνεται χρήση μόνο της συνάρτησης sleep με στόχο την αναστολή της εκτέλεσης του προγράμματος για χρόνο ίσο με τη περίοδο δειγματοληψίας. Έπειτα εξάγεται και αποθηκεύεται ένα timestamp. Η διαδικασία αυτή γίνεται επαναληπτικά έως ότου ξεπεραστεί ο επιθυμητός χρόνος δειγματοληψίας.
Στο δεύτερο πείραμα (lines 40-52) ακολουθείται η ίδια διαδικασία με το προηγούμενο πείραμα, αυτή τη φορά όμως διατηρείται ο μέσος όρος του σφάλματος μεταξύ της επιθυμητής και της πραγματικής περιόδου δειγματοληψίας. Ο μέσος όρος αυτός αφαιρείται από την περίοδο δειγματοληψίας κατά την κλήση της συνάρτησης sleep, με τον τρόπο αυτό επιδιώκεται η διόρθωση των αποκλίσεων της πραγματικής περιόδου δειγματοληψίας από την επιθυμητή. Μία μέθοδος που πιθανόν να επέφερε καλύτερα αποτελέσματα είναι η υλοποίηση ενός φίλτρου Wiener.
Στο τρίτο πείραμα (lines 54-82) γίνεται χρήση διακοπών για την επίτευξη του ίδιου σκοπού. Το πρόγραμμα θέτει μία επαναλαμβανόμενη διακοπή, η οποία έρχεται με τη μορφή σήματος (signal). Ορίζεται μία σημαία \texttt{sample\_flag} η οποία γίνεται αληθής (true) κατά τη λήψη σήματος από διακοπή. Η διεργασία (process) ελέγχει τη σημαία επαναληπτικά. Όταν η σημαία γίνει αληθής εξάγει και αποθηκεύει το timestamp και θέτει ξανά τη σημαία ψευδή (false).
Στο τέταρτο πείραμα (lines 85-105) γίνεται χρήση τόσο της συνάρτησης sleep όσο και διακοπών. Το πείραμα θέτει και πάλι μία επαναλαμβανόμενη διακοπή. Ωστόσο, κατά την αναμονή σήματος διακοπής η διεργασία αναστέλλεται με χρήση της συνάρτησης sleep. Το πείραμα βασίζεται στο γεγονός ότι τα εισερχόμενα σήματα, αυτό της διακοπής στη προκειμένη περίπτωση, επαναφέρουν τη διεργασία του προγράμματος στο προσκήνιο, πρακτικά ακυρώνοντας τη διαδικασία sleep. Με τη τροποποίηση αυτή είναι επιθυμητή η κατανάλωση λιγότερης ενέργειας.

37
report/4.results.tex

@ -0,0 +1,37 @@
\section{Αποτελέσματα}
Παρακάτω φαίνονται τα αποτελέσματα των πειραμάτων για εκτέλεση δειγματοληψίας διάρκειας δύο ωρών με περίοδο 0,1 δευτερόλεπτα.
\begin{table}[H]
\centering
\begin{tabular}{l r r r r} \toprule
\multirow{2}{*}{Στατιστική} & \multicolumn{4}{c}{Πείραμα \#} \\
\cmidrule{2-5}
& 1 & 2 & 3 & 4\\
Ελάχιστο & 0.100073 & 0.099967 & 0.091687 & 0.092948 \\
Μέγιστο & 0.132050 & 0.104576 & 0.108309 & 0.106863 \\
Μέσος όρος & 0.100207 & 0.100101 & 0.09999905 & 0.09999974 \\
Διάμεσος & 0.100203 & 0.100099 & 0.099998 & 0.099999 \\
Τυπική απόκλιση & 0.000146 & 0.00006 & 0.000154 & 0.099989 \\ \bottomrule
\end{tabular}
\caption{Στατιστικές αποτελεσμάτων πειραμάτων. Όλα τα αποτελέσματα του πίνακα έχουν μονάδα μέτρησης το δευτερόλεπτο.}
\label{results_table}
\end{table}
Όπως φαίνεται από τον πίνακα \ref{results_table} η μέθοδος της αντιστάθμισης της περιόδου δειγματοληψίας με βάση το μέσο όρο του σφάλματος στο δεύτερο πείραμα ήταν επιτυχής, καθώς το πείραμα απέδωσε καλύτερα αποτελέσματα από το πρώτο. Ακόμα, τα πειράματα που κάνουν χρήση διακοπών (τρίτο και τέταρτο πείραμα) απέδωσαν καλύτερα από αυτά με την απλή χρήση sleep (πρώτο και δεύτερο πείραμα).
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\includegraphics[scale=1]{res/diagrams/graph_exp_12.eps}
}
\caption{Απόκλιση χρόνων δειγματοληψείας για τα πειράματα ένα και δύο}
\end{figure}
\begin{figure}[H]
\centering
\resizebox{\textwidth}{!}{
\includegraphics[scale=1]{res/diagrams/graph_exp_34.eps}
}
\caption{Απόκλιση χρόνων δειγματοληψείας για τα πειράματα τρία και τέσσερα}
\end{figure}

1
report/TOC.tex

@ -0,0 +1 @@
\tableofcontents

1
report/front_page.tex

@ -0,0 +1 @@
\maketitle

BIN
report/report.pdf

Binary file not shown.

48
report/report.tex

@ -0,0 +1,48 @@
\documentclass[11pt]{article}
\usepackage{geometry}
\geometry{a4paper, top=2.5cm, bottom=2.5cm, left=2.2cm, right=2.2cm}
\usepackage{fontspec}
\usepackage[nonumeralsign]{xgreek}
\usepackage{fancyhdr}
\usepackage{hyperref}
\usepackage{enumitem}
\usepackage{cite}
\usepackage{authblk}
\usepackage{booktabs}
\usepackage{float}
\usepackage{multirow}
\usepackage[all]{hypcap}
\usepackage{graphicx}
\graphicspath{{res/diagrams/}}
\setmainfont{Lato}
\setlength{\parskip}{\baselineskip}
%\setlength{\parindent}{0pt}
\title{Ενσωματωμένα Συστήματα Πραγματικού Χρόνου \\
\Large Πρώτη εργασία}
\author[1]{Φανάκης Απόστολος, 8261 \\
apostolof@ece.auth.gr}
\date{\today}
\pagestyle{fancy}
\lhead{Real Time and Embedded Systems}
\rhead{}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
\setlength{\headheight}{14pt}
\hypersetup{colorlinks=true, linkcolor=black, urlcolor=blue, citecolor=blue}
\urlstyle{same}
\begin{document}
\input{front_page.tex}
\input{1.introduction.tex}
\input{2.code.tex}
\input{3.experiments.tex}
\input{4.results.tex}
\end{document}

11448
report/res/diagrams/graph_exp_12.eps

File diff suppressed because it is too large

15587
report/res/diagrams/graph_exp_34.eps

File diff suppressed because it is too large

8
test_sample.c

@ -9,7 +9,7 @@ int main(int argc, char **argv) {
// Initialize a matrix to store the sample values
double **samplesMatrix = (double **) malloc(parameters.numberOfSamples * sizeof(double *));
for (int i=0; i<parameters.numberOfSamples; ++i) {
samplesMatrix[i] = (double *) malloc(3 * sizeof(double));
samplesMatrix[i] = (double *) malloc(4 * sizeof(double));
}
// Saves information about the experiment to the output file
@ -30,14 +30,14 @@ int main(int argc, char **argv) {
fclose(outputFile);
}
printf(ANSI_COLOR_BLUE "\n----- STARTING EXPERIMENT -----\n" ANSI_COLOR_RESET);
printf(ANSI_COLOR_BLUE "----- STARTING EXPERIMENT\n" ANSI_COLOR_RESET);
testSampling(&samplesMatrix, parameters);
printf(ANSI_COLOR_YELLOW "\n----- WRITING RESULTS TO OUTPUT FILE -----\n" ANSI_COLOR_RESET);
printf(ANSI_COLOR_YELLOW "----- WRITING RESULTS TO OUTPUT FILE\n" ANSI_COLOR_RESET);
// Saves results to the output file
saveSamplesToFile(parameters.outputFilename, samplesMatrix, parameters.numberOfSamples);
printf(ANSI_COLOR_GREEN "\n----- DONE -----\n" ANSI_COLOR_RESET);
printf(ANSI_COLOR_GREEN "----- DONE\n" ANSI_COLOR_RESET);
}

42
test_sample_functions.c

@ -26,7 +26,7 @@ volatile sig_atomic_t sample_flag = false;
* corrected based on the previous error. On the third alarms are used.
*/
void testSampling(double ***samplesMatrix, Parameters parameters) {
printf(ANSI_COLOR_CYAN "\n----- RUNNING FIRST EXPERIMENT -----\n" ANSI_COLOR_RESET);
printf(ANSI_COLOR_CYAN "----- RUNNING FIRST EXPERIMENT\n" ANSI_COLOR_RESET);
for (int i = 0; i < parameters.numberOfSamples; ++i) {
gettimeofday (&startwtime, NULL);
@ -37,7 +37,7 @@ void testSampling(double ***samplesMatrix, Parameters parameters) {
endwtime.tv_sec - startwtime.tv_sec);
}
printf(ANSI_COLOR_CYAN "\n----- RUNNING SECOND EXPERIMENT -----\n" ANSI_COLOR_RESET);
printf(ANSI_COLOR_CYAN "----- RUNNING SECOND EXPERIMENT\n" ANSI_COLOR_RESET);
double totalError = 0;
for (int i = 0; i < parameters.numberOfSamples; ++i) {
gettimeofday (&startwtime, NULL);
@ -51,7 +51,7 @@ void testSampling(double ***samplesMatrix, Parameters parameters) {
totalError += (*samplesMatrix)[i][1] - parameters.delta;
}
printf(ANSI_COLOR_CYAN "\n----- RUNNING THIRD EXPERIMENT -----\n" ANSI_COLOR_RESET);
printf(ANSI_COLOR_CYAN "----- RUNNING THIRD EXPERIMENT\n" ANSI_COLOR_RESET);
signal(SIGALRM, handle_alarm);
struct itimerval new;
@ -80,7 +80,29 @@ void testSampling(double ***samplesMatrix, Parameters parameters) {
gettimeofday (&startwtime, NULL);
}
}
//alarm(0); Is this needed?
alarm(0);
printf(ANSI_COLOR_CYAN "----- RUNNING FOURTH EXPERIMENT\n" ANSI_COLOR_RESET);
if (setitimer (ITIMER_REAL, &new, NULL) == -1) {
perror("setitimer");
exit(EXIT_FAILURE);
}
for (i = 0; i < parameters.numberOfSamples; ++i){
gettimeofday (&startwtime, NULL);
// Sleeps until a signal wakes up the process.
sleep(parameters.time + 420);
while (!sample_flag) {
// Does nothing.
// Makes sure signal was indeed triggered.
}
sample_flag = false;
gettimeofday (&endwtime, NULL);
(*samplesMatrix)[i][3] = (double)((endwtime.tv_usec - startwtime.tv_usec)/1.0e6 +
endwtime.tv_sec - startwtime.tv_sec);
}
}
void handle_alarm(int sig) {
@ -145,13 +167,13 @@ void parseArguments(int argumentCount, char **argumentVector, Parameters *parame
* correct (valid) way to use the program.
*/
void validUsage(char *programName) {
printf("%s [-t time] [-d delta] [-o output]" \
printf("Usage:\t%s [-t time] [-d delta] [-o output]" \
"\n-t time" \
"\n\ttotal duration of the sampling in seconds" \
"\n\ttotal duration of the sampling in seconds, default value is 7200" \
"\n-d delta" \
"\n\tsampling period in seconds" \
"\n\tsampling period in seconds, default value is 0.1" \
"\n-o output" \
"\n\tfilename and path for the output" \
"\n\tfilename and path for the output, default filename is 'sample_test_output'" \
"\n", programName);
exit(EXIT_FAILURE);
}
@ -179,8 +201,8 @@ void saveSamplesToFile(char *filename, double **samplesMatrix, int matrixRows) {
// Saves the samples matrix
for (int i=0; i<matrixRows; ++i) {
fprintf(outputFile, "%.10g\t%.10g\t%.10g\n",
samplesMatrix[i][0], samplesMatrix[i][1], samplesMatrix[i][2]);
fprintf(outputFile, "%.10g\t%.10g\t%.10g\t%.10g\n",
samplesMatrix[i][0], samplesMatrix[i][1], samplesMatrix[i][2], samplesMatrix[i][3]);
}
fclose(outputFile);

Loading…
Cancel
Save