]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/MB96350_Softune_Dice_Kit/main.c
Update version numbers in preparation for V8.2.0 release candidate 1.
[freertos] / FreeRTOS / Demo / MB96350_Softune_Dice_Kit / main.c
1 /*\r
2     FreeRTOS V8.2.0rc1 - Copyright (C) 2014 Real Time Engineers Ltd.\r
3     All rights reserved\r
4 \r
5     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
6 \r
7     This file is part of the FreeRTOS distribution.\r
8 \r
9     FreeRTOS is free software; you can redistribute it and/or modify it under\r
10     the terms of the GNU General Public License (version 2) as published by the\r
11     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
12 \r
13     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
14     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
15     >>!   obliged to provide the source code for proprietary components     !<<\r
16     >>!   outside of the FreeRTOS kernel.                                   !<<\r
17 \r
18     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
19     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
20     FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
21     link: http://www.freertos.org/a00114.html\r
22 \r
23     1 tab == 4 spaces!\r
24 \r
25     ***************************************************************************\r
26      *                                                                       *\r
27      *    Having a problem?  Start by reading the FAQ "My application does   *\r
28      *    not run, what could be wrong?".  Have you defined configASSERT()?  *\r
29      *                                                                       *\r
30      *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
31      *                                                                       *\r
32     ***************************************************************************\r
33 \r
34     ***************************************************************************\r
35      *                                                                       *\r
36      *    FreeRTOS provides completely free yet professionally developed,    *\r
37      *    robust, strictly quality controlled, supported, and cross          *\r
38      *    platform software that is more than just the market leader, it     *\r
39      *    is the industry's de facto standard.                               *\r
40      *                                                                       *\r
41      *    Help yourself get started quickly while simultaneously helping     *\r
42      *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
43      *    tutorial book, reference manual, or both:                          *\r
44      *    http://www.FreeRTOS.org/Documentation                              *\r
45      *                                                                       *\r
46     ***************************************************************************\r
47 \r
48     ***************************************************************************\r
49      *                                                                       *\r
50      *   Investing in training allows your team to be as productive as       *\r
51      *   possible as early as possible, lowering your overall development    *\r
52      *   cost, and enabling you to bring a more robust product to market     *\r
53      *   earlier than would otherwise be possible.  Richard Barry is both    *\r
54      *   the architect and key author of FreeRTOS, and so also the world's   *\r
55      *   leading authority on what is the world's most popular real time     *\r
56      *   kernel for deeply embedded MCU designs.  Obtaining your training    *\r
57      *   from Richard ensures your team will gain directly from his in-depth *\r
58      *   product knowledge and years of usage experience.  Contact Real Time *\r
59      *   Engineers Ltd to enquire about the FreeRTOS Masterclass, presented  *\r
60      *   by Richard Barry:  http://www.FreeRTOS.org/contact\r
61      *                                                                       *\r
62     ***************************************************************************\r
63 \r
64     ***************************************************************************\r
65      *                                                                       *\r
66      *    You are receiving this top quality software for free.  Please play *\r
67      *    fair and reciprocate by reporting any suspected issues and         *\r
68      *    participating in the community forum:                              *\r
69      *    http://www.FreeRTOS.org/support                                    *\r
70      *                                                                       *\r
71      *    Thank you!                                                         *\r
72      *                                                                       *\r
73     ***************************************************************************\r
74 \r
75     http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
76     license and Real Time Engineers Ltd. contact details.\r
77 \r
78     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
79     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
80     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
81 \r
82     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
83     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
84 \r
85     http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
86     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
87     licenses offer ticketed support, indemnification and commercial middleware.\r
88 \r
89     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
90     engineered and independently SIL3 certified version for use in safety and\r
91     mission critical applications that require provable dependability.\r
92 \r
93     1 tab == 4 spaces!\r
94 */\r
95 \r
96 \r
97 /*****\r
98  *\r
99  * See http://www.freertos.org/Documentation/FreeRTOS-documentation-and-book.html\r
100  * for an introductory guide to using real time kernels, and FreeRTOS in\r
101  * particular.\r
102  *\r
103  *****\r
104  *\r
105  * The DICE-KIT-16FX has two 7 segment displays and two buttons that can\r
106  * generate interrupts.  This example uses this IO as follows:\r
107  *\r
108  *\r
109  * - Left 7 segment display -\r
110  *\r
111  * 7 'flash' tasks are created, each of which toggles a single segment of the\r
112  * left display.  Each task executes at a fixed frequency, with a different\r
113  * frequency being used by each task.\r
114  *\r
115  * When button SW2 is pressed an interrupt is generated that wakes up a 'dice'\r
116  * task.  The dice task suspends the 7 tasks that are accessing the left display\r
117  * before simulating a dice being thrown by generating a random number between\r
118  * 1 and 6.  After the number has been generated the task sleeps for 5 seconds,\r
119  * if SW2 is pressed again within the 5 seconds another random number is\r
120  * generated, if SW2 is not pressed within the 5 seconds then the 7 tasks are\r
121  * un-suspended and will once again toggle the segments of the left hand display.\r
122  *\r
123  *\r
124  * - Right 7 segment display -\r
125  *\r
126  * Control of the right side 7 segment display is very similar to that of the\r
127  * left, except co-routines are used to toggle the segments instead of tasks,\r
128  * and button SW3 is used instead of SW2.\r
129  *\r
130  *\r
131  * - Notes -\r
132  *\r
133  * Only one dice task is actually defined.  Two instances of this single\r
134  * definition are created, the first to simulate a dice being thrown on the left\r
135  * display, and the other to simulate a dice being thrown on the right display.\r
136  * The task parameter is used to let the dice tasks know which display to\r
137  * control.\r
138  *\r
139  * Both dice tasks and the flash tasks operate completely independently under\r
140  * the control of FreeRTOS.  11 tasks and 7 co-routines are created in total,\r
141  * including the idle task.\r
142  *\r
143  * The co-routines all execute within a single low priority task.\r
144  *\r
145  *\r
146  *\r
147  * When this demo is executing as expected:\r
148  *\r
149  * + Every segment of both displays will toggle at a fixed frequency - with each\r
150  *   segment using a different frequency.\r
151  * + When a button is pushed the segment toggling will temporarily stop and the\r
152  *   dice 'throw' will start whereby the display will show a fast changing random\r
153  *   number for a few seconds before the dice value is chosen and displayed.\r
154  * + If the button is not pushed again within five seconds of the dice value being\r
155  *   displayed the segment toggling will commence again.\r
156  *\r
157  *****/\r
158 \r
159 /* Kernel includes. */\r
160 #include "FreeRTOS.h"\r
161 #include "Task.h"\r
162 \r
163 /* Demo includes. */\r
164 #include "DiceTask.h"\r
165 #include "ParTest.h"\r
166 #include "Flash.h"\r
167 \r
168 /* The priority at which the dice task execute. */\r
169 #define mainDICE_PRIORITY                       ( tskIDLE_PRIORITY + 2 )\r
170 \r
171 /*\r
172  * Sets up the MCU IO for the 7 segment displays and the button inputs.\r
173  */\r
174 static void prvSetupHardware( void );\r
175 \r
176 /*\r
177  * The function that creates the flash tasks and co-routines (the tasks and\r
178  * co-routines that toggle the 7 segment display segments.\r
179  */\r
180 extern vCreateFlashTasksAndCoRoutines( void );\r
181 \r
182 /*-----------------------------------------------------------*/\r
183 \r
184 void main( void )\r
185 {\r
186         /* Setup the MCU IO. */\r
187         prvSetupHardware();\r
188 \r
189         /* Create the tasks and co-routines that toggle the display segments. */\r
190         vCreateFlashTasksAndCoRoutines();\r
191 \r
192         /* Create a 'dice' task to control the left hand display. */\r
193         xTaskCreate( vDiceTask, "Dice1", configMINIMAL_STACK_SIZE, ( void * ) configLEFT_DISPLAY, mainDICE_PRIORITY, NULL );\r
194 \r
195         /* Create a 'dice' task to control the right hand display. */\r
196         xTaskCreate( vDiceTask, "Dice2", configMINIMAL_STACK_SIZE, ( void * ) configRIGHT_DISPLAY, mainDICE_PRIORITY, NULL );\r
197 \r
198         /* Start the scheduler running. */\r
199         vTaskStartScheduler();\r
200 \r
201         /* If this loop is executed then there was insufficient heap memory for the\r
202         idle task to be created - causing vTaskStartScheduler() to return. */\r
203         while( 1 );\r
204 }\r
205 /*-----------------------------------------------------------*/\r
206 \r
207 static void prvSetupHardware( void )\r
208 {\r
209         /* Setup interrupt hardware - interrupts are kept disabled for now to\r
210         prevent any interrupts attempting to cause a context switch before the\r
211         scheduler has been started. */\r
212         InitIrqLevels();\r
213         portDISABLE_INTERRUPTS();\r
214         __set_il( 7 );\r
215 \r
216         /* Set Port3 as output (7Segment Display). */\r
217         DDR03  = 0xff;\r
218 \r
219         /* Use Port 5 as I/O-Port. */\r
220         ADER1  = 0;\r
221         PDR05  = 0x7f;\r
222 \r
223         /* Set Port5 as output (7Segment Display). */\r
224         DDR05  = 0xff;\r
225 \r
226         /* Disable inputs on the following ports. */\r
227         PIER02 = 0x00;\r
228         PDR02  = 0x00;\r
229         DDR02  = 0xff;\r
230         PIER03 = 0x00;\r
231         PDR03  = 0xff;\r
232         PIER05 = 0x00;\r
233         PDR05  = 0x00;\r
234         PIER06 = 0x00;\r
235         PDR06  = 0x00;\r
236         DDR06  = 0xff;\r
237 \r
238         /* Enable P00_0/INT8 and P00_1/INT9 as input. */\r
239         PIER00 = 0x03;\r
240 \r
241         /* Enable external interrupt 8. */\r
242         PIER00_IE0 = 1;\r
243 \r
244         /* LB0, LA0 = 11 -> falling edge. */\r
245         ELVRL1_LB8 = 1;\r
246         ELVRL1_LA8 = 1;\r
247 \r
248         /* Reset and enable the interrupt request. */\r
249         EIRR1_ER8 = 0;\r
250         ENIR1_EN8 = 1;\r
251 \r
252         /* Enable external interrupt 9. */\r
253         PIER00_IE1 = 1;\r
254 \r
255         /* LB1, LA1 = 11 -> falling edge. */\r
256         ELVRL1_LB9 = 1;\r
257         ELVRL1_LA9 = 1;\r
258 \r
259         /* Reset and enable the interrupt request. */\r
260         EIRR1_ER9 = 0;\r
261         ENIR1_EN9 = 1;\r
262 }\r
263 \r