]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/WIN32-MingW/Run-time-stats-utils.c
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Demo / WIN32-MingW / Run-time-stats-utils.c
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29 /*\r
30  * Utility functions required to gather run time statistics.  See:\r
31  * http://www.freertos.org/rtos-run-time-stats.html\r
32  *\r
33  * Note that this is a simulated port, where simulated time is a lot slower than\r
34  * real time, therefore the run time counter values have no real meaningful\r
35  * units.\r
36  *\r
37  * Also note that it is assumed this demo is going to be used for short periods\r
38  * of time only, and therefore timer overflows are not handled.\r
39 */\r
40 \r
41 /* FreeRTOS includes. */\r
42 #include <FreeRTOS.h>\r
43 \r
44 /* Variables used in the creation of the run time stats time base.  Run time\r
45 stats record how much time each task spends in the Running state. */\r
46 static long long llInitialRunTimeCounterValue = 0LL, llTicksPerHundedthMillisecond = 0LL;\r
47 \r
48 /*-----------------------------------------------------------*/\r
49 \r
50 void vConfigureTimerForRunTimeStats( void )\r
51 {\r
52 LARGE_INTEGER liPerformanceCounterFrequency, liInitialRunTimeValue;\r
53 \r
54         /* Initialise the variables used to create the run time stats time base.\r
55         Run time stats record how much time each task spends in the Running \r
56         state. */\r
57 \r
58         if( QueryPerformanceFrequency( &liPerformanceCounterFrequency ) == 0 )\r
59         {\r
60                 llTicksPerHundedthMillisecond = 1;\r
61         }\r
62         else\r
63         {\r
64                 /* How many times does the performance counter increment in 1/100th\r
65                 millisecond. */\r
66                 llTicksPerHundedthMillisecond = liPerformanceCounterFrequency.QuadPart / 100000LL;\r
67 \r
68                 /* What is the performance counter value now, this will be subtracted\r
69                 from readings taken at run time. */\r
70                 QueryPerformanceCounter( &liInitialRunTimeValue );\r
71                 llInitialRunTimeCounterValue = liInitialRunTimeValue.QuadPart;\r
72         }\r
73 }\r
74 /*-----------------------------------------------------------*/\r
75 \r
76 unsigned long ulGetRunTimeCounterValue( void )\r
77 {\r
78 LARGE_INTEGER liCurrentCount;\r
79 unsigned long ulReturn;\r
80 \r
81         /* What is the performance counter value now? */\r
82         QueryPerformanceCounter( &liCurrentCount );\r
83 \r
84         /* Subtract the performance counter value reading taken when the \r
85         application started to get a count from that reference point, then\r
86         scale to (simulated) 1/100ths of a millisecond. */\r
87         if( llTicksPerHundedthMillisecond == 0 )\r
88         {\r
89                 /* The trace macros are probably calling this function before the\r
90                 scheduler has been started. */\r
91                 ulReturn = 0;\r
92         }\r
93         else\r
94         {\r
95                 ulReturn = ( unsigned long ) ( ( liCurrentCount.QuadPart - llInitialRunTimeCounterValue ) / llTicksPerHundedthMillisecond );\r
96         }\r
97 \r
98         return ulReturn;\r
99 }\r
100 /*-----------------------------------------------------------*/\r