]> git.sur5r.net Git - freertos/blob - Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/main.c
Continue work on MCF52233 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 "flash.h"\r
85 #include "partest.h"\r
86 #include "semtest.h"\r
87 #include "PollQ.h"\r
88 #include "GenQTest.h"\r
89 #include "QPeek.h"\r
90 #include "IntQueue.h"\r
91 #include "comtest2.h"\r
92 \r
93 /*-----------------------------------------------------------*/\r
94 \r
95 /* The time between cycles of the 'check' functionality - as described at the\r
96 top of this file. */\r
97 #define mainNO_ERROR_PERIOD                                     ( ( portTickType ) 5000 / portTICK_RATE_MS )\r
98 \r
99 /* The rate at which the LED controlled by the 'check' task will flash should an\r
100 error have been detected. */\r
101 #define mainERROR_PERIOD                                        ( ( portTickType ) 500 / portTICK_RATE_MS )\r
102 \r
103 /* The LED controlled by the 'check' task. */\r
104 #define mainCHECK_LED                                           ( 3 )\r
105 \r
106 /* ComTest constants - there is no free LED for the comtest tasks. */\r
107 #define mainCOM_TEST_BAUD_RATE                          ( ( unsigned portLONG ) 19200 )\r
108 #define mainCOM_TEST_LED                                        ( 5 )\r
109 \r
110 /* Task priorities. */\r
111 #define mainCOM_TEST_PRIORITY                           ( tskIDLE_PRIORITY + 2 )\r
112 #define mainQUEUE_POLL_PRIORITY                         ( tskIDLE_PRIORITY + 2 )\r
113 #define mainCHECK_TASK_PRIORITY                         ( tskIDLE_PRIORITY + 3 )\r
114 #define mainSEM_TEST_PRIORITY                           ( tskIDLE_PRIORITY + 1 )\r
115 #define mainBLOCK_Q_PRIORITY                            ( tskIDLE_PRIORITY + 2 )\r
116 #define mainCREATOR_TASK_PRIORITY           ( tskIDLE_PRIORITY + 2 )\r
117 #define mainGEN_QUEUE_TASK_PRIORITY                     ( tskIDLE_PRIORITY )\r
118 \r
119 /* The WEB server task uses more stack than most other tasks because of its\r
120 reliance on using sprintf(). */
121 #define mainBASIC_WEB_STACK_SIZE                        ( configMINIMAL_STACK_SIZE * 2 )\r
122 \r
123 static unsigned portLONG ulErrorCode = 0UL;\r
124 \r
125 /*\r
126  * Configure the hardware for the demo.\r
127  */\r
128 static void prvSetupHardware( void );\r
129 \r
130 /*\r
131  * Implements the 'check' task functionality as described at the top of this\r
132  * file.\r
133  */\r
134 static void prvCheckTask( void *pvParameters );\r
135 \r
136 /*\r
137  * The task that implements the WEB server.
138  */\r
139 extern void vuIP_Task( void *pvParameters );\r
140 \r
141 /*-----------------------------------------------------------*/\r
142 \r
143 int main( void )\r
144 {\r
145         /* Setup the hardware ready for this demo. */\r
146         prvSetupHardware();\r
147 \r
148         /* Create the WEB server task. */\r
149         xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL );\r
150 \r
151         /* Start the standard demo tasks. */\r
152         vStartLEDFlashTasks( tskIDLE_PRIORITY );\r
153         vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );\r
154         vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );\r
155         vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );\r
156         vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );\r
157         vStartQueuePeekTasks();\r
158 \r
159         /* Create the check task. */\r
160         xTaskCreate( prvCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
161 \r
162         /* Start the scheduler. */\r
163         vTaskStartScheduler();\r
164 \r
165     /* Will only get here if there was insufficient memory to create the idle\r
166     task. */\r
167         for( ;; );\r
168 }\r
169 /*-----------------------------------------------------------*/\r
170 \r
171 static void prvCheckTask( void *pvParameters )\r
172 {\r
173 portTickType xLastExecutionTime;\r
174 \r
175         ( void ) pvParameters;\r
176 \r
177         /* Initialise the variable used to control our iteration rate prior to\r
178         its first use. */\r
179         xLastExecutionTime = xTaskGetTickCount();\r
180 \r
181         for( ;; )\r
182         {\r
183                 /* Wait until it is time to run the tests again. */\r
184                 vTaskDelayUntil( &xLastExecutionTime, mainNO_ERROR_PERIOD );\r
185 \r
186                 /* Has an error been found in any task? */\r
187                 if( xAreGenericQueueTasksStillRunning() != pdTRUE )\r
188                 {\r
189                         ulErrorCode |= 0x01UL;\r
190                 }\r
191 \r
192                 if( xAreQueuePeekTasksStillRunning() != pdTRUE )\r
193                 {\r
194                         ulErrorCode |= 0x02UL;\r
195                 }\r
196 \r
197                 if( xAreBlockingQueuesStillRunning() != pdTRUE )\r
198                 {\r
199                         ulErrorCode |= 0x04UL;\r
200                 }\r
201 \r
202                 if( xAreSemaphoreTasksStillRunning() != pdTRUE )\r
203             {\r
204                 ulErrorCode |= 0x20UL;\r
205             }\r
206 \r
207                 if( xArePollingQueuesStillRunning() != pdTRUE )\r
208             {\r
209                 ulErrorCode |= 0x40UL;\r
210             }\r
211         }\r
212 }\r
213 /*-----------------------------------------------------------*/\r
214 \r
215 unsigned portLONG ulGetErrorCode( void )\r
216 {\r
217         return ulErrorCode;\r
218 }\r
219 /*-----------------------------------------------------------*/\r
220 \r
221 void prvSetupHardware( void )\r
222 {\r
223 __attribute__ ((section(".cfmconfig")))\r
224 static const unsigned long _cfm[6] = {\r
225         0, /* KEY_UPPER 0x00000400 */\r
226         0, /* KEY_LOWER 0x00000404 */\r
227         0, /* CFMPROT 0x00000408 */\r
228         0, /* CFMSACC 0x0000040C */\r
229         0, /* CFMDACC 0x00000410 */\r
230         0, /* CFMSEC 0x00000414 */\r
231 };\r
232 \r
233         /* Just to stop compiler warnings. */\r
234         ( void ) _cfm;\r
235 \r
236         /* Ensure the watchdog is disabled. */\r
237         MCF_SCM_CWCR = 0;\r
238 \r
239     /* Initialize IPSBAR (0x40000000). */\r
240         asm volatile(\r
241                 "move.l  #0x40000000,%d0        \n"\r
242                 "andi.l  #0xC0000000,%d0        \n"\r
243                 "add.l   #0x1,%d0                       \n"\r
244                 "move.l  %d0,0x40000000         "\r
245         );\r
246 \r
247     /* Initialize FLASHBAR (0x00) */\r
248         asm volatile(\r
249                 "move.l  #0x00,%d0                      \n"\r
250                 "andi.l  #0xFFF80000,%d0        \n"\r
251                 "add.l   #0x41,%d0                      \n"\r
252                 "movec   %d0,%FLASHBAR          "\r
253         );\r
254 \r
255         portDISABLE_INTERRUPTS();\r
256 \r
257         /* RAMBAR. */\r
258         MCF_SCM_RAMBAR = MCF_SCM_RAMBAR_BA( RAMBAR_ADDRESS ) | MCF_SCM_RAMBAR_BDE;\r
259 \r
260         /* Multiply 25MHz crystal by 12 to get 60MHz clock. */\r
261         MCF_CLOCK_SYNCR = MCF_CLOCK_SYNCR_MFD(4) | MCF_CLOCK_SYNCR_CLKSRC| MCF_CLOCK_SYNCR_PLLMODE | MCF_CLOCK_SYNCR_PLLEN ;\r
262         while (!(MCF_CLOCK_SYNSR & MCF_CLOCK_SYNSR_LOCK))\r
263         {\r
264         }\r
265 \r
266         /* Setup the port used to toggle LEDs. */\r
267         vParTestInitialise();\r
268 }\r
269 /*-----------------------------------------------------------*/\r
270 \r
271 void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName )\r
272 {\r
273         /* This will get called if a stack overflow is detected during the context\r
274         switch.  Set configCHECK_FOR_STACK_OVERFLOWS to 2 to also check for stack\r
275         problems within nested interrupts, but only do this for debug purposes as\r
276         it will increase the context switch time. */\r
277 \r
278         ( void ) pxTask;\r
279         ( void ) pcTaskName;\r
280 \r
281         for( ;; );\r
282 }\r
283 /*-----------------------------------------------------------*/\r
284 \r