-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontrollore.c
119 lines (84 loc) · 2.91 KB
/
controllore.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/time.h>
/* Inserite eventuali extern modules qui */
extern char * asm_main(char in[], char out[]);
/* ************************************* */
enum { MAXLINES = 400 };
enum { LIN_LEN = 15 };
enum { LOUT_LEN = 8 };
long long current_timestamp() {
struct timespec tp;
clock_gettime(CLOCK_REALTIME, &tp);
/* te.tv_nsec nanoseconds divide by 1000 to get microseconds*/
long long nanoseconds = tp.tv_sec*1000LL + tp.tv_nsec; // caculate nanoseconds
return nanoseconds;
}
int main(int argc, char *argv[]) {
int i = 0;
char bufferin[MAXLINES*LIN_LEN+1] ;
char line[1024];
long long tic_c, toc_c, tic_asm, toc_asm;
char bufferout_c[MAXLINES*LOUT_LEN+1] = "" ;
char bufferout_asm[MAXLINES*LOUT_LEN+1] = "" ;
FILE *inputFile = fopen(argv[1], "r");
if(argc != 3)
{
fprintf(stderr, "Syntax ./test <input_file> <output_file>\n");
exit(1);
}
if (inputFile == 0)
{
fprintf(stderr, "failed to open the input file. Syntax ./test <input_file> <output_file>\n");
exit(1);
}
while (i < MAXLINES && fgets(line, sizeof(line), inputFile))
{
i = i + 1;
strcat( bufferin, line) ;
}
bufferin[MAXLINES*LIN_LEN] = '\0' ;
fclose(inputFile);
/* ELABORAZIONE in C */
tic_c = current_timestamp();
/* è possibile inserire qui il codice per l'elaborazione in C (non richiesto per l'elaborato) */
/* questo pezzo di codice è solo una base di partenza per fare dei check sui dati */
/*
int c = 0;
char tmpout[LOUT_LEN];
strcpy( tmpout, "000-00\n");
while ( bufferin[c] != '\0') {
printf( "%d\n", bufferin[c]);
strcat( bufferout_asm, tmpout);
c = c + LIN_LEN ;
}
*/
toc_c = current_timestamp();
long long c_time_in_nanos = toc_c - tic_c;
/* FINE ELABORAZIONE C */
/* INIZIO ELABORAZIONE ASM */
tic_asm = current_timestamp();
/* Assembly inline:
Inserite qui il vostro blocco di codice assembly inline o richiamo a funzioni assembly.
Il blocco di codice prende come input 'bufferin' e deve restituire una variabile stringa 'bufferout_asm' che verrà poi salvata su file. */
////////////////////////////// INIZIO ESECUZIONE ASM
printf("\n\tINIZIO ASM\n");
asm_main(bufferin, bufferout_asm);
printf("\tFINE ASM\n");
/////////////////////////////// FINE ESEUZIONE ASM
toc_asm = current_timestamp();
long long asm_time_in_nanos = toc_asm - tic_asm;
/* FINE ELABORAZIONE ASM */
printf("C time elapsed: %lld ns\n", c_time_in_nanos);
printf("ASM time elapsed: %lld ns\n", asm_time_in_nanos);
/* Salvataggio dei risultati ASM */
FILE *outputFile;
outputFile = fopen (argv[2], "w");
fprintf (outputFile, "%s", bufferout_asm);
fclose (outputFile);
return 0;
}