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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [CORTEX_LM3S102_KEIL/] [Demo2/] [main.c] - Blame information for rev 581

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
 * This demo application creates seven co-routines and one task (two including
56
 * the idle task).  The co-routines execute as part of the idle task hook.
57
 *
58
 * Five of the created co-routines are the standard 'co-routine flash'
59
 * co-routines contained within the Demo/Common/Minimal/crflash.c file and
60
 * documented on the FreeRTOS.org WEB site.
61
 *
62
 * The 'LCD Task' rotates a string on the LCD, delaying between each character
63
 * as necessitated by the slow interface, and delaying between each string just
64
 * long enough to enable the text to be read.
65
 *
66
 * The sixth co-routine controls the transmission of a string to UART 0.  The
67
 * co-routine periodically sends the first character of the string to the UART,
68
 * with the UART's TxEnd interrupt being used to transmit the remaining
69
 * characters.  The UART's RxEnd interrupt receives the characters and places
70
 * them on a queue to be processed by the seventh and final co-routine.  An
71
 * error is latched should an unexpected character be received, or any
72
 * character be received out of sequence.
73
 *
74
 * A loopback connector is required to ensure that each character transmitted
75
 * on the UART is also received on the same UART.  For test purposes the UART
76
 * FIFO's are not utalised in order to maximise the interrupt overhead.  Also
77
 * a pseudo random interval is used between the start of each transmission in
78
 * order that the resultant interrupts are more randomly distributed and
79
 * therefore more likely to highlight any problems.
80
 *
81
 * The flash co-routines control LED's zero to four.  LED five is toggled each
82
 * time the string is transmitted on the UART.  LED six is toggled each time
83
 * the string is CORRECTLY received on the UART.  LED seven is latched on should
84
 * an error be detected in any task or co-routine.
85
 *
86
 * In addition the idle task makes repetative calls to
87
 * prvSetAndCheckRegisters().  This simply loads the general purpose registers
88
 * with a known value, then checks each register to ensure the held value is
89
 * still correct.  As a low priority task this checking routine is likely to
90
 * get repeatedly swapped in and out.  A register being found to contain an
91
 * incorrect value is therefore indicative of an error in the task switching
92
 * mechansim.
93
 *
94
 */
95
 
96
/* Scheduler include files. */
97
#include "FreeRTOS.h"
98
#include "task.h"
99
#include "queue.h"
100
#include "croutine.h"
101
 
102
/* Demo application include files. */
103
#include "partest.h"
104
#include "crflash.h"
105
 
106
/* Library include files. */
107
#include "LM3Sxxx.h"
108
#include "pdc.h"
109
 
110
/* The time to delay between writing each character to the LCD. */
111
#define mainCHAR_WRITE_DELAY            ( 2 / portTICK_RATE_MS )
112
 
113
/* The time to delay between writing each string to the LCD. */
114
#define mainSTRING_WRITE_DELAY          ( 400 / portTICK_RATE_MS )
115
 
116
/* The number of flash co-routines to create. */
117
#define mainNUM_FLASH_CO_ROUTINES       ( 5 )
118
 
119
/* The length of the queue used to pass received characters to the Comms Rx
120
task. */
121
#define mainRX_QUEUE_LEN                        ( 5 )
122
 
123
/* The priority of the co-routine used to initiate the transmission of the
124
string on UART 0. */
125
#define mainTX_CO_ROUTINE_PRIORITY      ( 1 )
126
 
127
/* The priority of the co-routine used to receive characters from the UART. */
128
#define mainRX_CO_ROUTINE_PRIORITY      ( 2 )
129
 
130
/* Only one co-routine is created so its index is not important. */
131
#define mainTX_CO_ROUTINE_INDEX         ( 0 )
132
#define mainRX_CO_ROUTINE_INDEX         ( 0 )
133
 
134
/* The time between transmissions of the string on UART 0.   This is pseudo
135
random in order to generate a bit or randomness to when the interrupts occur.*/
136
#define mainMIN_TX_DELAY                        ( 40 / portTICK_RATE_MS )
137
#define mainMAX_TX_DELAY                        ( ( portTickType ) 0x7f )
138
#define mainOFFSET_TIME                         ( ( portTickType ) 3 )
139
 
140
/* The time the Comms Rx task should wait to receive a character.  This should
141
be slightly longer than the time between transmissions.  If we do not receive
142
a character after this time then there must be an error in the transmission or
143
the timing of the transmission. */
144
#define mainCOMMS_RX_DELAY                      ( mainMAX_TX_DELAY + 20 )
145
 
146
/* The task priorites. */
147
#define mainLCD_TASK_PRIORITY           ( tskIDLE_PRIORITY )
148
#define mainCOMMS_RX_TASK_PRIORITY      ( tskIDLE_PRIORITY + 1 )
149
 
150
/* The LED's toggled by the various tasks. */
151
#define mainCOMMS_FAIL_LED                      ( 7 )
152
#define mainCOMMS_RX_LED                        ( 6 )
153
#define mainCOMMS_TX_LED                        ( 5 )
154
 
155
/* The baud rate used by the UART comms tasks/co-routine. */
156
#define mainBAUD_RATE                           ( 57600 )
157
 
158
/* FIFO setting for the UART.  The FIFO is not used to create a better test. */
159
#define mainFIFO_SET                            ( 0x10 )
160
 
161
/* The string that is transmitted on the UART contains sequentially the
162
characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */
163
#define mainFIRST_TX_CHAR '0'
164
#define mainLAST_TX_CHAR 'z'
165
 
166
/* Just used to walk through the program memory in order that some random data
167
can be generated. */
168
#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) )
169
#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 )
170
 
171
/*-----------------------------------------------------------*/
172
 
173
/*
174
 * The task that rotates text on the LCD.
175
 */
176
static void vLCDTask( void * pvParameters );
177
 
178
/*
179
 * The task that receives the characters from UART 0.
180
 */
181
static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex );
182
 
183
/*
184
 * The co-routine that periodically initiates the transmission of the string on
185
 * the UART.
186
 */
187
static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex );
188
 
189
/*
190
 * Writes a string the the LCD.
191
 */
192
static void prvWriteString( const char *pcString );
193
 
194
/*
195
 * Initialisation routine for the UART.
196
 */
197
static void vSerialInit( void );
198
 
199
/*
200
 * Thread safe write to the PDC.
201
 */
202
static void prvPDCWrite( char cAddress, char cData );
203
 
204
/*
205
 * Function to simply set a known value into the general purpose registers
206
 * then read them back to ensure they remain set correctly.  An incorrect value
207
 * being indicative of an error in the task switching mechanism.
208
 */
209
void prvSetAndCheckRegisters( void );
210
 
211
/*
212
 * Latch the LED that indicates that an error has occurred.
213
 */
214
void vSetErrorLED( void );
215
 
216
/*
217
 * Sets up the PLL and ports used by the demo.
218
 */
219
static void prvSetupHardware( void );
220
 
221
/*-----------------------------------------------------------*/
222
 
223
/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines
224
defined within this file. */
225
unsigned portBASE_TYPE uxErrorStatus = pdPASS;
226
 
227
/* The next character to transmit. */
228
static char cNextChar;
229
 
230
/* The queue used to transmit characters from the interrupt to the Comms Rx
231
task. */
232
static xQueueHandle xCommsQueue;
233
 
234
/*-----------------------------------------------------------*/
235
 
236
int main( void )
237
{
238
        /* Create the queue used to communicate between the UART ISR and the Comms
239
        Rx task. */
240
        xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) );
241
 
242
        /* Setup the ports used by the demo and the clock. */
243
        prvSetupHardware();
244
 
245
        /* Create the co-routines that flash the LED's. */
246
        vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES );
247
 
248
        /* Create the co-routine that initiates the transmission of characters
249
        on the UART. */
250
        xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX );
251
 
252
        /* Create the co-routine that receives characters from the UART. */
253
        xCoRoutineCreate( vCommsRxCoRoutine, mainRX_CO_ROUTINE_PRIORITY, mainRX_CO_ROUTINE_INDEX );
254
 
255
        /* Create the LCD task. */
256
        xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );
257
 
258
        /* Start the scheduler running the tasks and co-routines just created. */
259
        vTaskStartScheduler();
260
 
261
        /* Should not get here unless we did not have enough memory to start the
262
        scheduler. */
263
        for( ;; );
264
}
265
/*-----------------------------------------------------------*/
266
 
267
static void prvSetupHardware( void )
268
{
269
        /* Setup the PLL. */
270
        SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ );
271
 
272
        /* Initialise the hardware used to talk to the LCD, LED's and UART. */
273
        PDCInit();
274
        vParTestInitialise();
275
        vSerialInit();
276
}
277
/*-----------------------------------------------------------*/
278
 
279
void vApplicationIdleHook( void )
280
{
281
        /* The co-routines are executed in the idle task using the idle task
282
        hook. */
283
        for( ;; )
284
        {
285
                /* Schedule the co-routines. */
286
                vCoRoutineSchedule();
287
 
288
                /* Run the register check function between each co-routine. */
289
                prvSetAndCheckRegisters();
290
        }
291
}
292
/*-----------------------------------------------------------*/
293
 
294
static void prvWriteString( const char *pcString )
295
{
296
        /* Write pcString to the LED, pausing between each character. */
297
        prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR);
298
        while( *pcString )
299
        {
300
                vTaskDelay( mainCHAR_WRITE_DELAY );
301
                prvPDCWrite( PDC_LCD_RAM, *pcString );
302
                pcString++;
303
        }
304
}
305
/*-----------------------------------------------------------*/
306
 
307
void vLCDTask( void * pvParameters )
308
{
309
unsigned portBASE_TYPE uxIndex;
310
const unsigned char ucCFGData[] = {
311
                                                                                        0x30,   /* Set data bus to 8-bits. */
312
                                                                                        0x30,
313
                                                                                        0x30,
314
                                                                                        0x3C,   /* Number of lines/font. */
315
                                                                                        0x08,   /* Display off. */
316
                                                                                        0x01,   /* Display clear. */
317
                                                                                        0x06,   /* Entry mode [cursor dir][shift]. */
318
                                                                                        0x0C    /* Display on [display on][curson on][blinking on]. */
319
                                                                          };
320
 
321
/* The strings that are written to the LCD. */
322
const char *pcStringsToDisplay[] = {
323
                                                                                        "Stellaris",
324
                                                                                        "Demo",
325
                                                                                        "Two",
326
                                                                                        "www.FreeRTOS.org",
327
                                                                                        ""
328
                                                                           };
329
 
330
        /* Configure the LCD. */
331
        uxIndex = 0;
332
        while( uxIndex < sizeof( ucCFGData ) )
333
        {
334
                prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] );
335
                uxIndex++;
336
                vTaskDelay( mainCHAR_WRITE_DELAY );
337
        }
338
 
339
        /* Turn the LCD Backlight on. */
340
        prvPDCWrite( PDC_CSR, 0x01 );
341
 
342
        /* Clear display. */
343
        vTaskDelay( mainCHAR_WRITE_DELAY );
344
        prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR );
345
 
346
        uxIndex = 0;
347
        for( ;; )
348
        {
349
                /* Display the string on the LCD. */
350
                prvWriteString( pcStringsToDisplay[ uxIndex ] );
351
 
352
                /* Move on to the next string - wrapping if necessary. */
353
                uxIndex++;
354
                if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 )
355
                {
356
                        uxIndex = 0;
357
                        /* Longer pause on the last string to be sent. */
358
                        vTaskDelay( mainSTRING_WRITE_DELAY * 2 );
359
                }
360
 
361
                /* Wait until it is time to move onto the next string. */
362
                vTaskDelay( mainSTRING_WRITE_DELAY );
363
        }
364
}
365
/*-----------------------------------------------------------*/
366
 
367
static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
368
{
369
static char cRxedChar, cExpectedChar = mainFIRST_TX_CHAR;
370
portBASE_TYPE xResult;
371
 
372
        crSTART( xHandle );
373
 
374
        for( ;; )
375
        {
376
                /* Wait for a character to be received. */
377
                crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult );
378
 
379
                /* Was the character recived (if any) the expected character. */
380
                if( ( cRxedChar != cExpectedChar ) || ( xResult != pdPASS ) )
381
                {
382
                        /* Got an unexpected character.  This can sometimes occur when
383
                        reseting the system using the debugger leaving characters already
384
                        in the UART regsters. */
385
                        uxErrorStatus = pdFAIL;
386
 
387
                        /* Resync by waiting for the end of the current string. */
388
                        while( cRxedChar != mainLAST_TX_CHAR )
389
                        {
390
                                crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult );
391
                        }
392
 
393
                        /* The next expected character is the start of the string again. */
394
                        cExpectedChar = mainFIRST_TX_CHAR;
395
                }
396
                else
397
                {
398
                        if( cExpectedChar == mainLAST_TX_CHAR )
399
                        {
400
                                /* We have reached the end of the string - we now expect to
401
                                receive the first character in the string again.   The LED is
402
                                toggled to indicate that the entire string was received without
403
                                error. */
404
                                vParTestToggleLED( mainCOMMS_RX_LED );
405
                                cExpectedChar = mainFIRST_TX_CHAR;
406
                        }
407
                        else
408
                        {
409
                                /* We got the expected character, we now expect to receive the
410
                                next character in the string. */
411
                                cExpectedChar++;
412
                        }
413
                }
414
        }
415
 
416
        crEND();
417
}
418
/*-----------------------------------------------------------*/
419
 
420
static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
421
{
422
portTickType xDelayPeriod;
423
static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES;
424
 
425
        /* Co-routine MUST start with a call to crSTART. */
426
        crSTART( xHandle );
427
 
428
        for(;;)
429
    {
430
                /* Was the previously transmitted string received correctly? */
431
                if( uxErrorStatus != pdPASS )
432
                {
433
                        /* An error was encountered so set the error LED. */
434
                        vSetErrorLED();
435
                }
436
 
437
                /* The next character to Tx is the first in the string. */
438
                cNextChar = mainFIRST_TX_CHAR;
439
 
440
                UARTIntDisable( UART0_BASE, UART_INT_TX );
441
                {
442
                        /* Send the first character. */
443
                        if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
444
                        {
445
                                HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
446
                        }
447
 
448
                        /* Move the variable to the char to Tx on so the ISR transmits
449
                        the next character in the string once this one has completed. */
450
                        cNextChar++;
451
                }
452
                UARTIntEnable(UART0_BASE, UART_INT_TX);
453
 
454
                /* Toggle the LED to show a new string is being transmitted. */
455
        vParTestToggleLED( mainCOMMS_TX_LED );
456
 
457
                /* Delay before we start the string off again.  A pseudo-random delay
458
                is used as this will provide a better test. */
459
                xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes );
460
 
461
                pulRandomBytes++;
462
                if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY )
463
                {
464
                        pulRandomBytes = mainFIRST_PROGRAM_BYTES;
465
                }
466
 
467
                /* Make sure we don't wait too long... */
468
                xDelayPeriod &= mainMAX_TX_DELAY;
469
 
470
                /* ...but we do want to wait. */
471
                if( xDelayPeriod < mainMIN_TX_DELAY )
472
                {
473
                        xDelayPeriod = mainMIN_TX_DELAY;
474
                }
475
 
476
                /* Block for the random(ish) time. */
477
                crDELAY( xHandle, xDelayPeriod );
478
    }
479
 
480
        /* Co-routine MUST end with a call to crEND. */
481
        crEND();
482
}
483
/*-----------------------------------------------------------*/
484
 
485
static void vSerialInit( void )
486
{
487
        /* Enable the UART.  GPIOA has already been initialised. */
488
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
489
 
490
        /* Set GPIO A0 and A1 as peripheral function.  They are used to output the
491
        UART signals. */
492
        GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW );
493
 
494
        /* Configure the UART for 8-N-1 operation. */
495
        UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE );
496
 
497
        /* We dont want to use the fifo.  This is for test purposes to generate
498
        as many interrupts as possible. */
499
        HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET;
500
 
501
        /* Enable both Rx and Tx interrupts. */
502
        HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX );
503
        IntEnable( INT_UART0 );
504
}
505
/*-----------------------------------------------------------*/
506
 
507
void vUART_ISR(void)
508
{
509
unsigned long ulStatus;
510
char cRxedChar;
511
portBASE_TYPE xTaskWokenByPost = pdFALSE;
512
 
513
        /* What caused the interrupt. */
514
        ulStatus = UARTIntStatus( UART0_BASE, pdTRUE );
515
 
516
        /* Clear the interrupt. */
517
        UARTIntClear( UART0_BASE, ulStatus );
518
 
519
        /* Was an Rx interrpt pending? */
520
        if( ulStatus & UART_INT_RX )
521
        {
522
                if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) )
523
                {
524
                        /* Get the char from the buffer and post it onto the queue of
525
                        Rxed chars.  Posting the character should wake the task that is
526
                        blocked on the queue waiting for characters. */
527
                        cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR );
528
                        xTaskWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsQueue, &cRxedChar, xTaskWokenByPost );
529
                }
530
        }
531
 
532
        /* Was a Tx interrupt pending? */
533
        if( ulStatus & UART_INT_TX )
534
        {
535
                /* Send the next character in the string.  We are not using the FIFO. */
536
                if( cNextChar <= mainLAST_TX_CHAR )
537
                {
538
                        if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
539
                        {
540
                                HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
541
                        }
542
                        cNextChar++;
543
                }
544
        }
545
 
546
        if( xTaskWokenByPost )
547
        {
548
                /* We are posting to a co-routine rather than a task so don't bother
549
                causing a task switch. */
550
        }
551
}
552
/*-----------------------------------------------------------*/
553
 
554
static void prvPDCWrite( char cAddress, char cData )
555
{
556
        vTaskSuspendAll();
557
        {
558
                PDCWrite( cAddress, cData );
559
        }
560
        xTaskResumeAll();
561
}
562
/*-----------------------------------------------------------*/
563
 
564
void vSetErrorLED( void )
565
{
566
        vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE );
567
}
568
/*-----------------------------------------------------------*/
569
 
570
__asm void prvSetAndCheckRegisters( void )
571
{
572
        extern vSetErrorLED
573
 
574
        /* Fill the general purpose registers with known values. */
575
        mov r11, #10
576
        add r0, r11, #1
577
        add r1, r11, #2
578
        add r2, r11, #3
579
        add r3, r11, #4
580
        add r4, r11, #5
581
        add r5, r11, #6
582
        add r6, r11, #7
583
        add r7, r11, #8
584
        add r8, r11, #9
585
        add r9, r11, #10
586
        add r10, r11, #11
587
        add r12, r11, #12
588
 
589
        /* Check the values are as expected. */
590
        cmp r11, #10
591
        bne set_error_led
592
        cmp r0, #11
593
        bne set_error_led
594
        cmp r1, #12
595
        bne set_error_led
596
        cmp r2, #13
597
        bne set_error_led
598
        cmp r3, #14
599
        bne set_error_led
600
        cmp r4, #15
601
        bne set_error_led
602
        cmp r5, #16
603
        bne set_error_led
604
        cmp r6, #17
605
        bne set_error_led
606
        cmp r7, #18
607
        bne set_error_led
608
        cmp r8, #19
609
        bne set_error_led
610
        cmp r9, #20
611
        bne set_error_led
612
        cmp r10, #21
613
        bne set_error_led
614
        cmp r12, #22
615
        bne set_error_led
616
        bx lr
617
 
618
set_error_led;
619
        push {r14}
620
        ldr r1, =vSetErrorLED
621
        blx r1
622
        pop {r14}
623
        bx lr;
624
}
625
/*-----------------------------------------------------------*/

powered by: WebSVN 2.1.0

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