OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [CORTEX_LM3Sxxxx_IAR_Keil/] [main.c] - Blame information for rev 593

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 581 jeremybenn
/*
2
    FreeRTOS V6.1.1 - Copyright (C) 2011 Real Time Engineers Ltd.
3
 
4
    ***************************************************************************
5
    *                                                                         *
6
    * If you are:                                                             *
7
    *                                                                         *
8
    *    + New to FreeRTOS,                                                   *
9
    *    + Wanting to learn FreeRTOS or multitasking in general quickly       *
10
    *    + Looking for basic training,                                        *
11
    *    + Wanting to improve your FreeRTOS skills and productivity           *
12
    *                                                                         *
13
    * then take a look at the FreeRTOS books - available as PDF or paperback  *
14
    *                                                                         *
15
    *        "Using the FreeRTOS Real Time Kernel - a Practical Guide"        *
16
    *                  http://www.FreeRTOS.org/Documentation                  *
17
    *                                                                         *
18
    * A pdf reference manual is also available.  Both are usually delivered   *
19
    * to your inbox within 20 minutes to two hours when purchased between 8am *
20
    * and 8pm GMT (although please allow up to 24 hours in case of            *
21
    * exceptional circumstances).  Thank you for your support!                *
22
    *                                                                         *
23
    ***************************************************************************
24
 
25
    This file is part of the FreeRTOS distribution.
26
 
27
    FreeRTOS is free software; you can redistribute it and/or modify it under
28
    the terms of the GNU General Public License (version 2) as published by the
29
    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
30
    ***NOTE*** The exception to the GPL is included to allow you to distribute
31
    a combined work that includes FreeRTOS without being obliged to provide the
32
    source code for proprietary components outside of the FreeRTOS kernel.
33
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
34
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
35
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
36
    more details. You should have received a copy of the GNU General Public
37
    License and the FreeRTOS license exception along with FreeRTOS; if not it
38
    can be viewed here: http://www.freertos.org/a00114.html and also obtained
39
    by writing to Richard Barry, contact details for whom are available on the
40
    FreeRTOS WEB site.
41
 
42
    1 tab == 4 spaces!
43
 
44
    http://www.FreeRTOS.org - Documentation, latest information, license and
45
    contact details.
46
 
47
    http://www.SafeRTOS.com - A version that is certified for use in safety
48
    critical systems.
49
 
50
    http://www.OpenRTOS.com - Commercial support, development, porting,
51
    licensing and training services.
52
*/
53
 
54
 
55
/*
56
 * Creates all the demo application tasks, then starts the scheduler.  The WEB
57
 * documentation provides more details of the standard demo application tasks.
58
 * In addition to the standard demo tasks, the following tasks and tests are
59
 * defined and/or created within this file:
60
 *
61
 * "Fast Interrupt Test" - A high frequency periodic interrupt is generated
62
 * using a free running timer to demonstrate the use of the
63
 * configKERNEL_INTERRUPT_PRIORITY configuration constant.  The interrupt
64
 * service routine measures the number of processor clocks that occur between
65
 * each interrupt - and in so doing measures the jitter in the interrupt timing.
66
 * The maximum measured jitter time is latched in the ulMaxJitter variable, and
67
 * displayed on the OLED display by the 'OLED' task as described below.  The
68
 * fast interrupt is configured and handled in the timertest.c source file.
69
 *
70
 * "OLED" task - the OLED task is a 'gatekeeper' task.  It is the only task that
71
 * is permitted to access the display directly.  Other tasks wishing to write a
72
 * message to the OLED send the message on a queue to the OLED task instead of
73
 * accessing the OLED themselves.  The OLED task just blocks on the queue waiting
74
 * for messages - waking and displaying the messages as they arrive.
75
 *
76
 * "Check" hook -  This only executes every five seconds from the tick hook.
77
 * Its main function is to check that all the standard demo tasks are still
78
 * operational.  Should any unexpected behaviour within a demo task be discovered
79
 * the tick hook will write an error to the OLED (via the OLED task).  If all the
80
 * demo tasks are executing with their expected behaviour then the check task
81
 * writes PASS to the OLED (again via the OLED task), as described above.
82
 *
83
 * "uIP" task -  This is the task that handles the uIP stack.  All TCP/IP
84
 * processing is performed in this task.
85
 */
86
 
87
 
88
 
89
 
90
/*************************************************************************
91
 * Please ensure to read http://www.freertos.org/portlm3sx965.html
92
 * which provides information on configuring and running this demo for the
93
 * various Luminary Micro EKs.
94
 *************************************************************************/
95
 
96
/* Set the following option to 1 to include the WEB server in the build.  By
97
default the WEB server is excluded to keep the compiled code size under the 32K
98
limit imposed by the KickStart version of the IAR compiler.  The graphics
99
libraries take up a lot of ROM space, hence including the graphics libraries
100
and the TCP/IP stack together cannot be accommodated with the 32K size limit. */
101
#define mainINCLUDE_WEB_SERVER          0
102
 
103
 
104
/* Standard includes. */
105
#include <stdio.h>
106
 
107
/* Scheduler includes. */
108
#include "FreeRTOS.h"
109
#include "task.h"
110
#include "queue.h"
111
#include "semphr.h"
112
 
113
/* Hardware library includes. */
114
#include "hw_memmap.h"
115
#include "hw_types.h"
116
#include "hw_sysctl.h"
117
#include "sysctl.h"
118
#include "gpio.h"
119
#include "grlib.h"
120
#include "rit128x96x4.h"
121
#include "osram128x64x4.h"
122
#include "formike128x128x16.h"
123
 
124
/* Demo app includes. */
125
#include "BlockQ.h"
126
#include "death.h"
127
#include "integer.h"
128
#include "blocktim.h"
129
#include "flash.h"
130
#include "partest.h"
131
#include "semtest.h"
132
#include "PollQ.h"
133
#include "lcd_message.h"
134
#include "bitmap.h"
135
#include "GenQTest.h"
136
#include "QPeek.h"
137
#include "recmutex.h"
138
#include "IntQueue.h"
139
 
140
/*-----------------------------------------------------------*/
141
 
142
/* The time between cycles of the 'check' functionality (defined within the
143
tick hook. */
144
#define mainCHECK_DELAY                                         ( ( portTickType ) 5000 / portTICK_RATE_MS )
145
 
146
/* Size of the stack allocated to the uIP task. */
147
#define mainBASIC_WEB_STACK_SIZE            ( configMINIMAL_STACK_SIZE * 3 )
148
 
149
/* The OLED task uses the sprintf function so requires a little more stack too. */
150
#define mainOLED_TASK_STACK_SIZE                        ( configMINIMAL_STACK_SIZE + 50 )
151
 
152
/* Task priorities. */
153
#define mainQUEUE_POLL_PRIORITY                         ( tskIDLE_PRIORITY + 2 )
154
#define mainCHECK_TASK_PRIORITY                         ( tskIDLE_PRIORITY + 3 )
155
#define mainSEM_TEST_PRIORITY                           ( tskIDLE_PRIORITY + 1 )
156
#define mainBLOCK_Q_PRIORITY                            ( tskIDLE_PRIORITY + 2 )
157
#define mainCREATOR_TASK_PRIORITY           ( tskIDLE_PRIORITY + 3 )
158
#define mainINTEGER_TASK_PRIORITY           ( tskIDLE_PRIORITY )
159
#define mainGEN_QUEUE_TASK_PRIORITY                     ( tskIDLE_PRIORITY )
160
 
161
/* The maximum number of message that can be waiting for display at any one
162
time. */
163
#define mainOLED_QUEUE_SIZE                                     ( 3 )
164
 
165
/* Dimensions the buffer into which the jitter time is written. */
166
#define mainMAX_MSG_LEN                                         25
167
 
168
/* The period of the system clock in nano seconds.  This is used to calculate
169
the jitter time in nano seconds. */
170
#define mainNS_PER_CLOCK                                        ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) )
171
 
172
/* Constants used when writing strings to the display. */
173
#define mainCHARACTER_HEIGHT                            ( 9 )
174
#define mainMAX_ROWS_128                                        ( mainCHARACTER_HEIGHT * 14 )
175
#define mainMAX_ROWS_96                                         ( mainCHARACTER_HEIGHT * 10 )
176
#define mainMAX_ROWS_64                                         ( mainCHARACTER_HEIGHT * 7 )
177
#define mainFULL_SCALE                                          ( 15 )
178
#define ulSSI_FREQUENCY                                         ( 3500000UL )
179
 
180
/*-----------------------------------------------------------*/
181
 
182
/*
183
 * The task that handles the uIP stack.  All TCP/IP processing is performed in
184
 * this task.
185
 */
186
extern void vuIP_Task( void *pvParameters );
187
 
188
/*
189
 * The display is written two by more than one task so is controlled by a
190
 * 'gatekeeper' task.  This is the only task that is actually permitted to
191
 * access the display directly.  Other tasks wanting to display a message send
192
 * the message to the gatekeeper.
193
 */
194
static void vOLEDTask( void *pvParameters );
195
 
196
/*
197
 * Configure the hardware for the demo.
198
 */
199
static void prvSetupHardware( void );
200
 
201
/*
202
 * Configures the high frequency timers - those used to measure the timing
203
 * jitter while the real time kernel is executing.
204
 */
205
extern void vSetupHighFrequencyTimer( void );
206
 
207
/*
208
 * Hook functions that can get called by the kernel.
209
 */
210
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );
211
void vApplicationTickHook( void );
212
 
213
 
214
/*-----------------------------------------------------------*/
215
 
216
/* The queue used to send messages to the OLED task. */
217
xQueueHandle xOLEDQueue;
218
 
219
/* The welcome text. */
220
const portCHAR * const pcWelcomeMessage = "   www.FreeRTOS.org";
221
 
222
/*-----------------------------------------------------------*/
223
 
224
 
225
/*************************************************************************
226
 * Please ensure to read http://www.freertos.org/portlm3sx965.html
227
 * which provides information on configuring and running this demo for the
228
 * various Luminary Micro EKs.
229
 *************************************************************************/
230
int main( void )
231
{
232
        prvSetupHardware();
233
 
234
        /* Create the queue used by the OLED task.  Messages for display on the OLED
235
        are received via this queue. */
236
        xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) );
237
 
238
        /* Start the standard demo tasks. */
239
    vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY );
240
    vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );
241
    vStartInterruptQueueTasks();
242
        vStartRecursiveMutexTasks();
243
        vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
244
        vCreateBlockTimeTasks();
245
        vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
246
        vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
247
        vStartQueuePeekTasks();
248
 
249
        /* Exclude some tasks if using the kickstart version to ensure we stay within
250
        the 32K code size limit. */
251
        #if mainINCLUDE_WEB_SERVER != 0
252
        {
253
                /* Create the uIP task if running on a processor that includes a MAC and
254
                PHY. */
255
                if( SysCtlPeripheralPresent( SYSCTL_PERIPH_ETH ) )
256
                {
257
                        xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL );
258
                }
259
        }
260
        #endif
261
 
262
 
263
 
264
        /* Start the tasks defined within this file/specific to this demo. */
265
        xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", mainOLED_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
266
 
267
        /* The suicide tasks must be created last as they need to know how many
268
        tasks were running prior to their creation in order to ascertain whether
269
        or not the correct/expected number of tasks are running at any given time. */
270
    vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );
271
 
272
        /* Configure the high frequency interrupt used to measure the interrupt
273
        jitter time. */
274
        vSetupHighFrequencyTimer();
275
 
276
        /* Start the scheduler. */
277
        vTaskStartScheduler();
278
 
279
    /* Will only get here if there was insufficient memory to create the idle
280
    task. */
281
        return 0;
282
}
283
/*-----------------------------------------------------------*/
284
 
285
void prvSetupHardware( void )
286
{
287
    /* If running on Rev A2 silicon, turn the LDO voltage up to 2.75V.  This is
288
    a workaround to allow the PLL to operate reliably. */
289
    if( DEVICE_IS_REVA2 )
290
    {
291
        SysCtlLDOSet( SYSCTL_LDO_2_75V );
292
    }
293
 
294
        /* Set the clocking to run from the PLL at 50 MHz */
295
        SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ );
296
 
297
        /*      Enable Port F for Ethernet LEDs
298
                LED0        Bit 3   Output
299
                LED1        Bit 2   Output */
300
        SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF );
301
        GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW );
302
        GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD );
303
 
304
        vParTestInitialise();
305
}
306
/*-----------------------------------------------------------*/
307
 
308
void vApplicationTickHook( void )
309
{
310
static xOLEDMessage xMessage = { "PASS" };
311
static unsigned portLONG ulTicksSinceLastDisplay = 0;
312
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
313
 
314
        /* Called from every tick interrupt.  Have enough ticks passed to make it
315
        time to perform our health status check again? */
316
        ulTicksSinceLastDisplay++;
317
        if( ulTicksSinceLastDisplay >= mainCHECK_DELAY )
318
        {
319
                ulTicksSinceLastDisplay = 0;
320
 
321
                /* Has an error been found in any task? */
322
                if( xAreGenericQueueTasksStillRunning() != pdTRUE )
323
                {
324
                        xMessage.pcMessage = "ERROR IN GEN Q";
325
                }
326
            else if( xIsCreateTaskStillRunning() != pdTRUE )
327
            {
328
                xMessage.pcMessage = "ERROR IN CREATE";
329
            }
330
            else if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
331
            {
332
                xMessage.pcMessage = "ERROR IN MATH";
333
            }
334
                else if( xAreIntQueueTasksStillRunning() != pdTRUE )
335
                {
336
                        xMessage.pcMessage = "ERROR IN INT QUEUE";
337
                }
338
                else if( xAreBlockingQueuesStillRunning() != pdTRUE )
339
                {
340
                        xMessage.pcMessage = "ERROR IN BLOCK Q";
341
                }
342
                else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
343
                {
344
                        xMessage.pcMessage = "ERROR IN BLOCK TIME";
345
                }
346
                else if( xAreSemaphoreTasksStillRunning() != pdTRUE )
347
                {
348
                        xMessage.pcMessage = "ERROR IN SEMAPHORE";
349
                }
350
                else if( xArePollingQueuesStillRunning() != pdTRUE )
351
                {
352
                        xMessage.pcMessage = "ERROR IN POLL Q";
353
                }
354
                else if( xAreQueuePeekTasksStillRunning() != pdTRUE )
355
                {
356
                        xMessage.pcMessage = "ERROR IN PEEK Q";
357
                }
358
                else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
359
                {
360
                        xMessage.pcMessage = "ERROR IN REC MUTEX";
361
                }
362
 
363
                /* Send the message to the OLED gatekeeper for display. */
364
                xHigherPriorityTaskWoken = pdFALSE;
365
                xQueueSendFromISR( xOLEDQueue, &xMessage, &xHigherPriorityTaskWoken );
366
        }
367
}
368
/*-----------------------------------------------------------*/
369
 
370
void vOLEDTask( void *pvParameters )
371
{
372
xOLEDMessage xMessage;
373
unsigned portLONG ulY, ulMaxY;
374
static portCHAR cMessage[ mainMAX_MSG_LEN ];
375
extern volatile unsigned portLONG ulMaxJitter;
376
unsigned portBASE_TYPE uxUnusedStackOnEntry;
377
const unsigned portCHAR *pucImage;
378
 
379
/* Functions to access the OLED.  The one used depends on the dev kit
380
being used. */
381
void ( *vOLEDInit )( unsigned portLONG ) = NULL;
382
void ( *vOLEDStringDraw )( const portCHAR *, unsigned portLONG, unsigned portLONG, unsigned portCHAR ) = NULL;
383
void ( *vOLEDImageDraw )( const unsigned portCHAR *, unsigned portLONG, unsigned portLONG, unsigned portLONG, unsigned portLONG ) = NULL;
384
void ( *vOLEDClear )( void ) = NULL;
385
 
386
        /* Just for demo purposes. */
387
        uxUnusedStackOnEntry = uxTaskGetStackHighWaterMark( NULL );
388
 
389
        /* Map the OLED access functions to the driver functions that are appropriate
390
        for the evaluation kit being used. */
391
        switch( HWREG( SYSCTL_DID1 ) & SYSCTL_DID1_PRTNO_MASK )
392
        {
393
                case SYSCTL_DID1_PRTNO_6965     :
394
                case SYSCTL_DID1_PRTNO_2965     :       vOLEDInit = OSRAM128x64x4Init;
395
                                                                                vOLEDStringDraw = OSRAM128x64x4StringDraw;
396
                                                                                vOLEDImageDraw = OSRAM128x64x4ImageDraw;
397
                                                                                vOLEDClear = OSRAM128x64x4Clear;
398
                                                                                ulMaxY = mainMAX_ROWS_64;
399
                                                                                pucImage = pucBasicBitmap;
400
                                                                                break;
401
 
402
                case SYSCTL_DID1_PRTNO_1968     :
403
                case SYSCTL_DID1_PRTNO_8962 :   vOLEDInit = RIT128x96x4Init;
404
                                                                                vOLEDStringDraw = RIT128x96x4StringDraw;
405
                                                                                vOLEDImageDraw = RIT128x96x4ImageDraw;
406
                                                                                vOLEDClear = RIT128x96x4Clear;
407
                                                                                ulMaxY = mainMAX_ROWS_96;
408
                                                                                pucImage = pucBasicBitmap;
409
                                                                                break;
410
 
411
                default                                         :       vOLEDInit = vFormike128x128x16Init;
412
                                                                                vOLEDStringDraw = vFormike128x128x16StringDraw;
413
                                                                                vOLEDImageDraw = vFormike128x128x16ImageDraw;
414
                                                                                vOLEDClear = vFormike128x128x16Clear;
415
                                                                                ulMaxY = mainMAX_ROWS_128;
416
                                                                                pucImage = pucGrLibBitmap;
417
                                                                                break;
418
 
419
        }
420
 
421
        ulY = ulMaxY;
422
 
423
        /* Initialise the OLED and display a startup message. */
424
        vOLEDInit( ulSSI_FREQUENCY );
425
        vOLEDStringDraw( "POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE );
426
        vOLEDImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT );
427
 
428
        for( ;; )
429
        {
430
                /* Wait for a message to arrive that requires displaying. */
431
                xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY );
432
 
433
                /* Write the message on the next available row. */
434
                ulY += mainCHARACTER_HEIGHT;
435
                if( ulY >= ulMaxY )
436
                {
437
                        ulY = mainCHARACTER_HEIGHT;
438
                        vOLEDClear();
439
                        vOLEDStringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE );
440
                }
441
 
442
                /* Display the message along with the maximum jitter time from the
443
                high priority time test. */
444
                sprintf( cMessage, "%s [%uns]", xMessage.pcMessage, ulMaxJitter * mainNS_PER_CLOCK );
445
                vOLEDStringDraw( cMessage, 0, ulY, mainFULL_SCALE );
446
        }
447
}
448
/*-----------------------------------------------------------*/
449
 
450
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName )
451
{
452
        ( void ) pxTask;
453
        ( void ) pcTaskName;
454
 
455
        for( ;; );
456
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.