]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/MB96340_Softune/FreeRTOS_96348hs_SK16FX100PMC/Src/utility/taskutility.c
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / MB96340_Softune / FreeRTOS_96348hs_SK16FX100PMC / Src / utility / taskutility.c
1 /* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */\r
2 \r
3 /* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */\r
4 \r
5 /* ELIGIBILITY FOR ANY PURPOSES.                                             */\r
6 \r
7 /*                 (C) Fujitsu Microelectronics Europe GmbH                  */\r
8 \r
9 /*------------------------------------------------------------------------\r
10   taskutility.C\r
11   - \r
12 -------------------------------------------------------------------------*/\r
13 \r
14 /*************************@INCLUDE_START************************/\r
15 #include "mb96348hs.h"\r
16 #include "FreeRTOS.h"\r
17 #include "task.h"\r
18 #include "queue.h"\r
19 \r
20 static void vUART0Task( void *pvParameters );\r
21 \r
22 /**************************@INCLUDE_END*************************/\r
23 \r
24 /*********************@GLOBAL_VARIABLES_START*******************/\r
25 const char      ASCII[] = "0123456789ABCDEF";\r
26 \r
27 xTaskHandle UART_TaskHandle;\r
28 \r
29 static xQueueHandle xQueue;\r
30 void InitUart0( void )\r
31 {\r
32         /* Initialize UART asynchronous mode */\r
33         BGR0 = configCLKP1_CLOCK_HZ / 9600; /* 9600 Baud @ CLKP1 - 56 MHz */\r
34 \r
35         SCR0 = 0x17;                                            /* 8N1 */\r
36         SMR0 = 0x0d;                                            /* enable SOT3, Reset, normal mode */\r
37         SSR0 = 0x02;                                            /* LSB first, enable receive interrupts */\r
38 \r
39         PIER08_IE2 = 1; /* enable input */\r
40         DDR08_D2 = 0;   /* switch P08_2 to input */\r
41         DDR08_D3 = 1;   /* switch P08_3 to output */\r
42 }\r
43 \r
44 void Putch0( char ch )  /* sends a char */\r
45 {\r
46         while( SSR0_TDRE == 0 );\r
47 \r
48         /* wait for transmit buffer empty       */\r
49         TDR0 = ch;      /* put ch into buffer                   */\r
50 }\r
51 \r
52 char Getch0( void ) /* waits for and returns incomming char     */\r
53 {\r
54         volatile unsigned       ch;\r
55 \r
56         while( SSR0_RDRF == 0 );\r
57 \r
58         /* wait for data received       */\r
59         if( SSR0_ORE )          /* overrun error                */\r
60         {\r
61                 ch = RDR0;              /* reset error flags            */\r
62                 return ( char ) ( -1 );\r
63         }\r
64         else\r
65         {\r
66                 return( RDR0 ); /* return char                  */\r
67         }\r
68 }\r
69 \r
70 void Puts0( const char *Name1 ) /* Puts a String to UART */\r
71 {\r
72         volatile portSHORT      i, len;\r
73         len = strlen( Name1 );\r
74 \r
75         for( i = 0; i < len; i++ )      /* go through string */\r
76         {\r
77                 if( Name1[i] == 10 )\r
78                 {\r
79                         Putch0( 13 );\r
80                 }\r
81 \r
82                 Putch0( Name1[i] );                                     /* send it out                           */\r
83         }\r
84 }\r
85 \r
86 void Puthex0( unsigned long n, unsigned char digits )\r
87 {\r
88         unsigned portCHAR       digit = 0, div = 0, i;\r
89 \r
90         div = ( 4 * (digits - 1) );                             /* init shift divisor */\r
91         for( i = 0; i < digits; i++ )\r
92         {\r
93                 digit = ( (n >> div) & 0xF );           /* get hex-digit value */\r
94                 Putch0( digit + ((digit < 0xA) ? '0' : 'A' - 0xA) );\r
95                 div -= 4;               /* next digit shift */\r
96         }\r
97 }\r
98 \r
99 void Putdec0( unsigned long x, int digits )\r
100 {\r
101         portSHORT       i;\r
102         portCHAR        buf[10], sign = 1;\r
103 \r
104         if( digits < 0 )\r
105         {                                       /* should be print of zero? */\r
106                 digits *= ( -1 );\r
107                 sign = 1;\r
108         }\r
109 \r
110         buf[digits] = '\0'; /* end sign of string */\r
111 \r
112         for( i = digits; i > 0; i-- )\r
113         {\r
114                 buf[i - 1] = ASCII[x % 10];\r
115                 x = x / 10;\r
116         }\r
117 \r
118         if( sign )\r
119         {\r
120                 for( i = 0; buf[i] == '0'; i++ )\r
121                 {                               /* no print of zero */\r
122                         if( i < digits - 1 )\r
123                         {\r
124                                 buf[i] = ' ';\r
125                         }\r
126                 }\r
127         }\r
128 \r
129         Puts0( buf );           /* send string */\r
130 }\r
131 \r
132 void vUtilityStartTraceTask( unsigned portBASE_TYPE uxPriority )\r
133 {\r
134         xQueue = xQueueCreate( 5, sizeof( char ) );\r
135 \r
136         if( xQueue != NULL )\r
137         {\r
138                 portENTER_CRITICAL();\r
139                 InitUart0();\r
140                 portENTER_CRITICAL();\r
141                 xTaskCreate( vUART0Task, (signed portCHAR *) "UART1", configMINIMAL_STACK_SIZE * 3, ( void * ) NULL, uxPriority, &UART_TaskHandle );\r
142         }\r
143 }\r
144 \r
145 static void vUART0Task( void *pvParameters )\r
146 {\r
147         static portCHAR buff[ 800 ] = { 0 };\r
148         unsigned portLONG       trace_len;\r
149         signed portLONG         i, j, l = 0;\r
150 \r
151         unsigned portCHAR       ch;\r
152         ( void ) pvParameters;\r
153 \r
154         SSR0_RIE = 1;\r
155 \r
156         Puts0( "\n -------------MB96348 FreeRTOS DEMO Task List and Trace Utility----------- \n" );\r
157 \r
158         for( ;; )\r
159         {\r
160                 Puts0( "\n\rPress any of the following keys for the corresponding functionality: " );\r
161 \r
162                 Puts0( "\n\r1: To call vTaskList() and display current task status " );\r
163 \r
164                 Puts0( "\n\r2: To call vTaskStartTrace() and to display trace results once the trace ends" );\r
165 \r
166                 /* Block on the semaphore.  The UART interrupt will use the semaphore to\r
167                 wake this task when required. */\r
168                 xQueueReceive( xQueue, &ch, portMAX_DELAY );\r
169 \r
170                 switch( ch )\r
171                 {\r
172                         case '1':\r
173                                 vTaskList( (signed char *) buff );\r
174                                 Puts0( "\n\rThe current task list is as follows...." );\r
175                                 Puts0( "\n\r----------------------------------------------" );\r
176                                 Puts0( "\n\rName          State  Priority  Stack   Number" );\r
177                                 Puts0( "\n\r----------------------------------------------" );\r
178                                 Puts0( buff );\r
179                                 Puts0( "\r----------------------------------------------" );\r
180                                 break;\r
181 \r
182                         case '2':\r
183                                 vTaskStartTrace( (signed char *) buff, sizeof( buff ) );\r
184                                 Puts0( "\n\rThe trace started!!" );\r
185                                 vTaskDelay( (portTickType) 500 );\r
186                                 trace_len = ulTaskEndTrace();\r
187                                 Puts0( "\n\rThe trace ended!!" );\r
188                                 Puts0( "\n\rThe trace is as follows...." );\r
189                                 Puts0( "\n\r--------------------------------------------------------" );\r
190                                 Puts0( "\n\r  Tick     | Task Number  |     Tick     | Task Number  |" );\r
191                                 Puts0( "\n\r--------------------------------------------------------\n\r" );\r
192 \r
193                                 for( i = 0; i < trace_len; i += 4 )\r
194                                 {\r
195                                         for( j = i + 3; j >= i; j-- )\r
196                                         {\r
197                                                 Puthex0( buff[j], 2 );\r
198                                         }\r
199 \r
200                                         Puts0( "   |   " );\r
201                                         l++;\r
202                                         if( l == 4 )\r
203                                         {\r
204                                                 Puts0( "\n" );\r
205                                                 l = 0;\r
206                                         }\r
207                                 }\r
208 \r
209                                 Puts0( "\r--------------------------------------------------------" );\r
210                                 break;\r
211 \r
212                         default:\r
213                                 break;\r
214                 }\r
215 \r
216                 Puts0( "\n" );\r
217         }\r
218 }\r
219 \r
220 __interrupt void UART0_TraceRxISR( void )\r
221 {\r
222 unsigned portCHAR ch;\r
223 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
224 \r
225         ch = RDR0;\r
226         xQueueSendFromISR( xQueue, &ch, &xHigherPriorityTaskWoken );\r
227 }\r