]> git.sur5r.net Git - freertos/blob - Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/main.c
Continue to develop demo.
[freertos] / Demo / ColdFire_MCF52233_Eclipse / RTOSDemo / main.c
1 /*\r
2         FreeRTOS.org V5.1.0 - Copyright (C) 2003-2008 Richard Barry.\r
3 \r
4         This file is part of the FreeRTOS.org distribution.\r
5 \r
6         FreeRTOS.org is free software; you can redistribute it and/or modify\r
7         it under the terms of the GNU General Public License as published by\r
8         the Free Software Foundation; either version 2 of the License, or\r
9         (at your option) any later version.\r
10 \r
11         FreeRTOS.org is distributed in the hope that it will be useful,\r
12         but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14         GNU General Public License for more details.\r
15 \r
16         You should have received a copy of the GNU General Public License\r
17         along with FreeRTOS.org; if not, write to the Free Software\r
18         Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19 \r
20         A special exception to the GPL can be applied should you wish to distribute\r
21         a combined work that includes FreeRTOS.org, without being obliged to provide\r
22         the source code for any proprietary components.  See the licensing section\r
23         of http://www.FreeRTOS.org for full details of how and when the exception\r
24         can be applied.\r
25 \r
26     ***************************************************************************\r
27     ***************************************************************************\r
28     *                                                                         *\r
29     * SAVE TIME AND MONEY!  We can port FreeRTOS.org to your own hardware,    *\r
30     * and even write all or part of your application on your behalf.          *\r
31     * See http://www.OpenRTOS.com for details of the services we provide to   *\r
32     * expedite your project.                                                  *\r
33     *                                                                         *\r
34     ***************************************************************************\r
35     ***************************************************************************\r
36 \r
37         Please ensure to read the configuration and relevant port sections of the\r
38         online documentation.\r
39 \r
40         http://www.FreeRTOS.org - Documentation, latest information, license and\r
41         contact details.\r
42 \r
43         http://www.SafeRTOS.com - A version that is certified for use in safety\r
44         critical systems.\r
45 \r
46         http://www.OpenRTOS.com - Commercial support, development, porting,\r
47         licensing and training services.\r
48 */\r
49 \r
50 \r
51 /*\r
52  * Creates all the demo application tasks, then starts the scheduler.  The WEB\r
53  * documentation provides more details of the standard demo application tasks.\r
54  * In addition to the standard demo tasks, the following tasks and tests are\r
55  * defined and/or created within this file:\r
56  *\r
57  * "Check" task -  This only executes every five seconds but has a high priority\r
58  * to ensure it gets processor time.  Its main function is to check that all the\r
59  * standard demo tasks are still operational.  While no errors have been\r
60  * discovered the check task will toggle an LED every 5 seconds - the toggle\r
61  * rate increasing to 500ms being a visual indication that at least one task has\r
62  * reported unexpected behaviour.\r
63  *\r
64  * "Reg test" tasks - These fill the registers with known values, then check\r
65  * that each register still contains its expected value.  Each task uses\r
66  * different values.  The tasks run with very low priority so get preempted very\r
67  * frequently.  A register containing an unexpected value is indicative of an\r
68  * error in the context switching mechanism.\r
69  *\r
70  */\r
71 \r
72 /* Standard includes. */\r
73 #include <stdio.h>\r
74 \r
75 /* Scheduler includes. */\r
76 #include "FreeRTOS.h"\r
77 #include "task.h"\r
78 #include "queue.h"\r
79 #include "semphr.h"\r
80 \r
81 /* Demo app includes. */\r
82 #include "BlockQ.h"\r
83 #include "death.h"\r
84 #include "blocktim.h"\r
85 #include "flash.h"\r
86 #include "partest.h"\r
87 #include "semtest.h"\r
88 #include "PollQ.h"\r
89 #include "GenQTest.h"\r
90 #include "QPeek.h"\r
91 #include "recmutex.h"\r
92 #include "IntQueue.h"\r
93 #include "comtest2.h"\r
94 \r
95 /*-----------------------------------------------------------*/\r
96 \r
97 /* The time between cycles of the 'check' functionality - as described at the\r
98 top of this file. */\r
99 #define mainNO_ERROR_PERIOD                                     ( ( portTickType ) 5000 / portTICK_RATE_MS )\r
100 \r
101 /* The rate at which the LED controlled by the 'check' task will flash should an\r
102 error have been detected. */\r
103 #define mainERROR_PERIOD                                        ( ( portTickType ) 500 / portTICK_RATE_MS )\r
104 \r
105 /* The LED controlled by the 'check' task. */\r
106 #define mainCHECK_LED                                           ( 3 )\r
107 \r
108 /* ComTest constants - there is no free LED for the comtest tasks. */\r
109 #define mainCOM_TEST_BAUD_RATE                          ( ( unsigned portLONG ) 19200 )\r
110 #define mainCOM_TEST_LED                                        ( 5 )\r
111 \r
112 /* Task priorities. */\r
113 #define mainCOM_TEST_PRIORITY                           ( tskIDLE_PRIORITY + 2 )\r
114 #define mainQUEUE_POLL_PRIORITY                         ( tskIDLE_PRIORITY + 2 )\r
115 #define mainCHECK_TASK_PRIORITY                         ( tskIDLE_PRIORITY + 3 )\r
116 #define mainSEM_TEST_PRIORITY                           ( tskIDLE_PRIORITY + 1 )\r
117 #define mainBLOCK_Q_PRIORITY                            ( tskIDLE_PRIORITY + 2 )\r
118 #define mainGEN_QUEUE_TASK_PRIORITY                     ( tskIDLE_PRIORITY )\r
119 \r
120 /* The WEB server task uses more stack than most other tasks because of its\r
121 reliance on using sprintf(). */
122 #define mainBASIC_WEB_STACK_SIZE                        ( configMINIMAL_STACK_SIZE * 2 )\r
123 \r
124 static unsigned portLONG ulErrorCode = 0UL;\r
125 \r
126 /*\r
127  * Configure the hardware for the demo.\r
128  */\r
129 static void prvSetupHardware( void );\r
130 \r
131 /*\r
132  * Implements the 'check' task functionality as described at the top of this\r
133  * file.\r
134  */\r
135 static void prvCheckTask( void *pvParameters );\r
136 \r
137 /*\r
138  * The task that implements the WEB server.
139  */\r
140 extern void vuIP_Task( void *pvParameters );\r
141 \r
142 /*-----------------------------------------------------------*/\r
143 \r
144 int main( void )\r
145 {\r
146         /* Setup the hardware ready for this demo. */\r
147         prvSetupHardware();\r
148 \r
149         /* Create the WEB server task. */\r
150         xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL );\r
151 \r
152         /* Start the standard demo tasks. */\r
153         vStartLEDFlashTasks( tskIDLE_PRIORITY );\r
154         vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );\r
155     vCreateBlockTimeTasks();\r
156         vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );\r
157         vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );\r
158         vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );\r
159         vStartQueuePeekTasks();\r
160     vStartRecursiveMutexTasks();\r
161 \r
162         /* Create the check task. */\r
163         xTaskCreate( prvCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
164 \r
165         /* Start the scheduler. */\r
166         vTaskStartScheduler();\r
167 \r
168     /* Will only get here if there was insufficient memory to create the idle\r
169     task. */\r
170         for( ;; );\r
171 }\r
172 /*-----------------------------------------------------------*/\r
173 \r
174 static void prvCheckTask( void *pvParameters )\r
175 {\r
176 portTickType xLastExecutionTime;\r
177 \r
178         ( void ) pvParameters;\r
179 \r
180         /* Initialise the variable used to control our iteration rate prior to\r
181         its first use. */\r
182         xLastExecutionTime = xTaskGetTickCount();\r
183 \r
184         for( ;; )\r
185         {\r
186                 /* Wait until it is time to run the tests again. */\r
187                 vTaskDelayUntil( &xLastExecutionTime, mainNO_ERROR_PERIOD );\r
188 \r
189                 /* Has an error been found in any task? */\r
190                 if( xAreGenericQueueTasksStillRunning() != pdTRUE )\r
191                 {\r
192                         ulErrorCode |= 0x01UL;\r
193                 }\r
194 \r
195                 if( xAreQueuePeekTasksStillRunning() != pdTRUE )\r
196                 {\r
197                         ulErrorCode |= 0x02UL;\r
198                 }\r
199 \r
200                 if( xAreBlockingQueuesStillRunning() != pdTRUE )\r
201                 {\r
202                         ulErrorCode |= 0x04UL;\r
203                 }\r
204 \r
205                 if( xAreSemaphoreTasksStillRunning() != pdTRUE )\r
206             {\r
207                 ulErrorCode |= 0x20UL;\r
208             }\r
209 \r
210                 if( xArePollingQueuesStillRunning() != pdTRUE )\r
211             {\r
212                 ulErrorCode |= 0x40UL;\r
213             }\r
214 \r
215                 if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )\r
216                 {\r
217                         ulErrorCode |= 0x80UL;\r
218                 }\r
219 \r
220             if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )\r
221             {\r
222                 ulErrorCode |= 0x100UL;\r
223             }\r
224         }\r
225 }\r
226 /*-----------------------------------------------------------*/\r
227 \r
228 unsigned portLONG ulGetErrorCode( void )\r
229 {\r
230         return ulErrorCode;\r
231 }\r
232 /*-----------------------------------------------------------*/\r
233 \r
234 void prvSetupHardware( void )\r
235 {\r
236 __attribute__ ((section(".cfmconfig")))\r
237 static const unsigned long _cfm[6] = {\r
238         0, /* KEY_UPPER 0x00000400 */\r
239         0, /* KEY_LOWER 0x00000404 */\r
240         0, /* CFMPROT 0x00000408 */\r
241         0, /* CFMSACC 0x0000040C */\r
242         0, /* CFMDACC 0x00000410 */\r
243         0, /* CFMSEC 0x00000414 */\r
244 };\r
245 \r
246         /* Just to stop compiler warnings. */\r
247         ( void ) _cfm;\r
248 \r
249         /* Ensure the watchdog is disabled. */\r
250         MCF_SCM_CWCR = 0;\r
251 \r
252     /* Initialize IPSBAR (0x40000000). */\r
253         asm volatile(\r
254                 "move.l  #0x40000000,%d0        \n"\r
255                 "andi.l  #0xC0000000,%d0        \n"\r
256                 "add.l   #0x1,%d0                       \n"\r
257                 "move.l  %d0,0x40000000         "\r
258         );\r
259 \r
260     /* Initialize FLASHBAR (0x00) */\r
261         asm volatile(\r
262                 "move.l  #0x00,%d0                      \n"\r
263                 "andi.l  #0xFFF80000,%d0        \n"\r
264                 "add.l   #0x41,%d0                      \n"\r
265                 "movec   %d0,%FLASHBAR          "\r
266         );\r
267 \r
268         portDISABLE_INTERRUPTS();\r
269 \r
270         /* RAMBAR. */\r
271         MCF_SCM_RAMBAR = MCF_SCM_RAMBAR_BA( RAMBAR_ADDRESS ) | MCF_SCM_RAMBAR_BDE;\r
272 \r
273         /* Multiply 25MHz crystal by 12 to get 60MHz clock. */\r
274         MCF_CLOCK_SYNCR = MCF_CLOCK_SYNCR_MFD(4) | MCF_CLOCK_SYNCR_CLKSRC| MCF_CLOCK_SYNCR_PLLMODE | MCF_CLOCK_SYNCR_PLLEN ;\r
275         while (!(MCF_CLOCK_SYNSR & MCF_CLOCK_SYNSR_LOCK))\r
276         {\r
277         }\r
278 \r
279         /* Setup the port used to toggle LEDs. */\r
280         vParTestInitialise();\r
281 }\r
282 /*-----------------------------------------------------------*/\r
283 \r
284 void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName )\r
285 {\r
286         /* This will get called if a stack overflow is detected during the context\r
287         switch.  Set configCHECK_FOR_STACK_OVERFLOWS to 2 to also check for stack\r
288         problems within nested interrupts, but only do this for debug purposes as\r
289         it will increase the context switch time. */\r
290 \r
291         ( void ) pxTask;\r
292         ( void ) pcTaskName;\r
293 \r
294         for( ;; );\r
295 }\r
296 /*-----------------------------------------------------------*/\r
297 \r