]> git.sur5r.net Git - freertos/blob - Demo/MB91460_Softune/SRC/utility/taskutility.c
b23f633f270729dcc70e590b663e67cb678a7e66
[freertos] / Demo / MB91460_Softune / SRC / utility / taskutility.c
1 /* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */\r
2 /* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */\r
3 /* ELIGIBILITY FOR ANY PURPOSES.                                                                                         */\r
4 /*                               (C) Fujitsu Microelectronics Europe GmbH                                        */\r
5 /*------------------------------------------------------------------------\r
6   taskutility.C\r
7   - \r
8 -------------------------------------------------------------------------*/\r
9 #include "mb91467d.h"\r
10 #include "vectors.h"\r
11 #include "FreeRTOS.h"\r
12 #include "task.h"\r
13 #include "semphr.h"\r
14 \r
15 static void vUART5Task( void *pvParameters );\r
16 \r
17 const char                      ASCII[] = "0123456789ABCDEF";\r
18 \r
19 void                            vInitUart5( void );\r
20 \r
21 xSemaphoreHandle        xSemaphore;\r
22 \r
23 void vInitUart5( void )\r
24 {\r
25         //Initialize UART asynchronous mode\r
26         BGR05 = 1666;   //  9600 Baud @ 16MHz\r
27         SCR05 = 0x17;   // 7N2\r
28         SMR05 = 0x0d;   // enable SOT3, Reset, normal mode\r
29         SSR05 = 0x00;   // LSB first\r
30         PFR19_D4 = 1;   // enable UART\r
31         PFR19_D5 = 1;   // enable UART\r
32 \r
33         //EPFR19 = 0x00;   // enable UART\r
34         SSR05_RIE = 1;\r
35 }\r
36 \r
37 void Putch5( char ch )  /* sends a char */\r
38 {\r
39         while( SSR05_TDRE == 0 );\r
40 \r
41         /* wait for transmit buffer empty */\r
42         TDR05 = ch; /* put ch into buffer */\r
43 }\r
44 \r
45 char Getch5( void ) /* waits for and returns incomming char */\r
46 {\r
47         volatile unsigned       ch;\r
48 \r
49         while( SSR05_RDRF == 0 );\r
50 \r
51         /* wait for data received */\r
52         if( SSR05_ORE )                 /* overrun error */\r
53         {\r
54                 ch = RDR05;                     /* reset error flags */\r
55                 return ( char ) ( -1 );\r
56         }\r
57         else\r
58         {\r
59                 return( RDR05 );        /* return char */\r
60         }\r
61 }\r
62 \r
63 void Puts5( const char *Name5 ) /* Puts a String to UART */\r
64 {\r
65         volatile portSHORT      i, len;\r
66         len = strlen( Name5 );\r
67 \r
68         for( i = 0; i < strlen(Name5); i++ )    /* go through string */\r
69         {\r
70                 if( Name5[i] == 10 )\r
71                 {\r
72                         Putch5( 13 );\r
73                 }\r
74 \r
75                 Putch5( Name5[i] );                                     /* send it out */\r
76         }\r
77 }\r
78 \r
79 void Puthex5( unsigned long n, unsigned char digits )\r
80 {\r
81         unsigned portCHAR       digit = 0, div = 0, i;\r
82 \r
83         div = ( 4 * (digits - 1) );                             /* init shift divisor */\r
84         for( i = 0; i < digits; i++ )\r
85         {\r
86                 digit = ( (n >> div) & 0xF );           /* get hex-digit value */\r
87                 Putch5( digit + ((digit < 0xA) ? '0' : 'A' - 0xA) );\r
88                 div -= 4;               /* next digit shift */\r
89         }\r
90 }\r
91 \r
92 void Putdec5( unsigned long x, int digits )\r
93 {\r
94         portSHORT       i;\r
95         portCHAR        buf[10], sign = 1;\r
96 \r
97         if( digits < 0 )\r
98         {                                       /* should be print of zero? */\r
99                 digits *= ( -1 );\r
100                 sign = 1;\r
101         }\r
102 \r
103         buf[digits] = '\0'; /* end sign of string */\r
104 \r
105         for( i = digits; i > 0; i-- )\r
106         {\r
107                 buf[i - 1] = ASCII[x % 10];\r
108                 x = x / 10;\r
109         }\r
110 \r
111         if( sign )\r
112         {\r
113                 for( i = 0; buf[i] == '0'; i++ )\r
114                 {                               /* no print of zero */\r
115                         if( i < digits - 1 )\r
116                         {\r
117                                 buf[i] = ' ';\r
118                         }\r
119                 }\r
120         }\r
121 \r
122         Puts5( buf );           /* send string */\r
123 }\r
124 \r
125 void vUtilityStartTraceTask( unsigned portBASE_TYPE uxPriority )\r
126 {\r
127         portENTER_CRITICAL();\r
128         vInitUart5();\r
129         portENTER_CRITICAL();\r
130 \r
131         vSemaphoreCreateBinary( xSemaphore );\r
132 \r
133         if( xSemaphore != NULL )\r
134         {\r
135                 xTaskCreate( vUART5Task, (signed portCHAR *) "UART4", ( unsigned portSHORT ) 2048, ( void * ) NULL, uxPriority, NULL );\r
136         }\r
137 }\r
138 \r
139 static void vUART5Task( void *pvParameters )\r
140 {\r
141         portCHAR                        tasklist_buff[512], trace_buff[512];\r
142         unsigned portLONG       trace_len, j;\r
143 \r
144         unsigned portCHAR       ch;\r
145 \r
146         Puts5( "\n -------------MB91467D FreeRTOS DEMO Task List and Trace Utility----------- \n" );\r
147 \r
148         for( ;; )\r
149         {\r
150                 Puts5( "\n\rPress any of the following keys for the corresponding functionality: " );\r
151 \r
152                 Puts5( "\n\r1: To call vTaskList() and display current task status " );\r
153 \r
154                 Puts5( "\n\r2: To call vTaskStartTrace() and to display trace results once the trace ends" );\r
155 \r
156                 SSR05_RIE = 1;\r
157 \r
158                 /* Block on the semaphore.  The UART interrupt will use the semaphore to\r
159                 wake this task when required. */\r
160                 xSemaphoreTake( xSemaphore, portMAX_DELAY );\r
161 \r
162                 ch = Getch5();\r
163 \r
164                 switch( ch )\r
165                 {\r
166                         case '1':\r
167                                 vTaskList( (signed char *) tasklist_buff );\r
168                                 Puts5( "\n\rThe current task list is as follows...." );\r
169                                 Puts5( "\n\r----------------------------------------------" );\r
170                                 Puts5( "\n\rName                  State  Priority  Stack   Number" );\r
171                                 Puts5( "\n\r----------------------------------------------" );\r
172                                 Puts5( tasklist_buff );\r
173                                 Puts5( "\r----------------------------------------------" );\r
174                                 break;\r
175 \r
176                         case '2':\r
177                                 vTaskStartTrace( (signed char *) trace_buff, 512 );\r
178                                 Puts5( "\n\rThe trace started!!" );\r
179                                 vTaskDelay( (portTickType) 450 );\r
180                                 trace_len = ulTaskEndTrace();\r
181                                 Puts5( "\n\rThe trace ended!!" );\r
182                                 Puts5( "\n\rThe trace is as follows...." );\r
183                                 Puts5( "\n\r--------------------------------------------------------" );\r
184                                 Puts5( "\n\r  Tick       | Task Number  |        Tick    | Task Number  |" );\r
185                                 Puts5( "\n\r--------------------------------------------------------\n\r" );\r
186                                 for( j = 0; j < trace_len; j++ )\r
187                                 {\r
188                                         Puthex5( trace_buff[j], 2 );\r
189                                         if( j % 4 == 3 )\r
190                                         {\r
191                                                 Puts5( "   |   " );\r
192                                         }\r
193 \r
194                                         if( j % 16 == 15 )\r
195                                         {\r
196                                                 Puts5( "\n" );\r
197                                         }\r
198                                 }\r
199 \r
200                                 Puts5( "\r--------------------------------------------------------" );\r
201                                 break;\r
202 \r
203                         default:\r
204                                 break;\r
205                 }\r
206 \r
207                 Puts5( "\n" );\r
208         }\r
209 }\r
210 \r
211 __interrupt void UART5_RxISR( void )\r
212 {\r
213         SSR05_RIE = 0;\r
214         xSemaphoreGiveFromISR( xSemaphore, pdFALSE );\r
215 }\r