1 #include <stdint.h>
2 #include <elapsed_time.h>
3
4 /*
5 ********************************************************************************
6 * CORTEX-M - DWT TIMER
7 ********************************************************************************
8 */
9
10 #define ARM_CM_DEMCR (*(uint32_t *)0xE000EDFC)
11 #define ARM_CM_DWT_CTRL (*(uint32_t *)0xE0001000)
12 #define ARM_CM_DWT_CYCCNT (*(uint32_t *)0xE0001004)
13
14 /*
15 ********************************************************************************
16 * Data Structure
17 ********************************************************************************
18 */
19
20 typedef struct elapsed_time {
21 uint32_t start;
22 uint32_t current;
23 uint32_t max;
24 uint32_t min;
25 } ELAPSED_TIME;
26
27 /*
28 ********************************************************************************
29 * STORAGE FOR ELAPSED TIME MEASUREMENTS
30 ********************************************************************************
31 */
32
33 static ELAPSED_TIME elapsed_time_tbl[ELAPSED_TIME_MAX_SECTIONS];
34
35 /*
36 ********************************************************************************
37 * MODULE INITIALIZATION
38 *
39 * Note(s): Must be called before any of the other functions in this module
40 ********************************************************************************
41 */
42
43 void elapsed_time_init (void)
44 {
45 uint32_t i;
46
47
48 if (ARM_CM_DWT_CTRL != 0) { // See if DWT is available
49 ARM_CM_DEMCR |= 1 << 24; // Set bit 24
50 ARM_CM_DWT_CYCCNT = 0;
51 ARM_CM_DWT_CTRL |= 1 << 0; // Set bit 0
52 }
53 for (i = 0; i < ELAPSED_TIME_MAX_SECTIONS; i++) {
54 elapsed_time_clr(i);
55 }
56 }
57
58 /*
59 ********************************************************************************
60 * START THE MEASUREMENT OF A CODE SECTION
61 ********************************************************************************
62 */
63
64 void elapsed_time_start (uint32_t i)
65 {
66 elapsed_time_tbl[i].start = ARM_CM_DWT_CYCCNT;
67 }
68
69 /*
70 ********************************************************************************
71 * STOP THE MEASUREMENT OF A CODE SECTION AND COMPUTE STATS
72 ********************************************************************************
73 */
74
75 void elapsed_time_stop (uint32_t i)
76 {
77 uint32_t stop;
78 ELAPSED_TIME *p_tbl;
79
80
81 stop = ARM_CM_DWT_CYCCNT;
82 p_tbl = &elapsed_time_tbl[i];
83 p_tbl->current = stop - p_tbl->start;
84 if (p_tbl->max < p_tbl->current) {
85 p_tbl->max = p_tbl->current;
86 }
87 if (p_tbl->min > p_tbl->current) {
88 p_tbl->min = p_tbl->current;
89 }
90 }
91
92 /*
93 ********************************************************************************
94 * CLEAR THE MEASUREMENTS STATS
95 ********************************************************************************
96 */
97
98 void elapsed_time_clr (uint32_t i)
99 {
100 ELAPSED_TIME *p_tbl;
101
102
103 p_tbl = &elapsed_time_tbl[i];
104 p_tbl->start = 0;
105 p_tbl->current = 0;
106 p_tbl->min = 0xFFFFFFFF;
107 p_tbl->max = 0;
108 }
elapsed_time.h
1 /*
2 ********************************************************************************
3 * MODULE TO MEASURE EXECUTION TIME
4 ********************************************************************************
5 */
6
7 /*
8 ********************************************************************************
9 * MAXIMUM NUMBER OF ELAPSED TIME MEASUREMENT SECTIONS
10 ********************************************************************************
11 */
12
13 #define ELAPSED_TIME_MAX_SECTIONS 10
14
15 /*
16 ********************************************************************************
17 * FUNCTION PROTOTYPES
18 ********************************************************************************
19 */
20
21 void elapsed_time_clr (uint32_t i); // Clear measured values
22 void elapsed_time_init (void); // Module initialization
23 void elapsed_time_start (uint32_t i); // Start measurement
24 void elapsed_time_stop (uint32_t i); // Stop measurement