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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [CORTUS_APS3_GCC/] [Demo/] [RegTest.c] - Blame information for rev 612

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

Line No. Rev Author Line
1 579 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
#include "FreeRTOS.h"
55
#include "task.h"
56
 
57
/*
58
 * Two test tasks that fill the CPU registers with known values before
59
 * continuously looping round checking that each register still contains its
60
 * expected value.  Both tasks use a separate set of values, with an incorrect
61
 * value being found at any time being indicative of an error in the context
62
 * switch mechanism.  One of the tasks uses a yield instruction to increase the
63
 * test coverage.  The nature of these tasks necessitates that they are written
64
 * in assembly code.
65
 */
66
static void vRegTest1( void *pvParameters );
67
static void vRegTest2( void *pvParameters );
68
 
69
/*
70
 * A task that tests the management of the Interrupt Controller (IC) during a
71
 * context switch.  The state of the IC current mask level must be maintained
72
 * across context switches.  Also, yields must be able to be performed when the
73
 * interrupt controller mask is not zero.  This task tests both these
74
 * requirements.
75
 */
76
static void prvICCheck1Task( void *pvParameters );
77
 
78
/* Counters used to ensure the tasks are still running. */
79
static volatile unsigned long ulRegTest1Counter = 0UL, ulRegTest2Counter = 0UL, ulICTestCounter = 0UL;
80
 
81
/* Handle to the task that checks the interrupt controller behaviour.  This is
82
used by the traceTASK_SWITCHED_OUT() macro, which is defined in
83
FreeRTOSConfig.h and can be removed - it is just for the purpose of this test. */
84
xTaskHandle xICTestTask = NULL;
85
 
86
/* Variable that gets set to pdTRUE by traceTASK_SWITCHED_OUT each time
87
is switched out. */
88
volatile unsigned long ulTaskSwitchedOut;
89
/*-----------------------------------------------------------*/
90
 
91
void vStartRegTestTasks( void )
92
{
93
        xTaskCreate( vRegTest1, ( signed char * ) "RTest1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
94
        xTaskCreate( vRegTest2, ( signed char * ) "RTest1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
95
        xTaskCreate( prvICCheck1Task, ( signed char * ) "ICCheck", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, &xICTestTask );
96
}
97
/*-----------------------------------------------------------*/
98
 
99
static void vRegTest1( void *pvParameters )
100
{
101
        __asm volatile
102
        (
103
                "       mov             r2, #0x02                                                       \n" /* Fill the registers with known values, r0 is always 0 and r1 is the stack pointer. */
104
                "       mov             r3, #0x03                                                       \n"
105
                "       mov             r4, #0x04                                                       \n"
106
                "       mov             r5, #0x05                                                       \n"
107
                "       mov             r6, #0x06                                                       \n"
108
                "       mov             r7, #0x07                                                       \n"
109
                "       mov             r8, #0x08                                                       \n"
110
                "       mov             r9, #0x09                                                       \n"
111
                "       mov             r10, #0x0a                                                      \n"
112
                "       mov             r11, #0x0b                                                      \n"
113
                "       mov             r12, #0x0c                                                      \n"
114
                "       mov             r13, #0x0d                                                      \n"
115
                "       mov             r14, #0x0e                                                      \n"
116
                "       mov             r15, #0x0f                                                      \n"
117
                "                                                                                               \n"
118
                "reg_check_loop_1:                                                              \n"
119
                "       trap    #31                                                                     \n"
120
                "       cmp             r2, #0x02                                                       \n" /* Check that each register still contains the expected value, jump to an infinite loop if an error is found. */
121
                "       bne.s   reg_check_error_1                                       \n"
122
                "       cmp             r3, #0x03                                                       \n"
123
                "       bne.s   reg_check_error_1                                       \n"
124
                "       cmp             r4, #0x04                                                       \n"
125
                "       bne.s   reg_check_error_1                                       \n"
126
                "       cmp             r5, #0x05                                                       \n"
127
                "       bne.s   reg_check_error_1                                       \n"
128
                "       cmp             r6, #0x06                                                       \n"
129
                "       bne.s   reg_check_error_1                                       \n"
130
                "       cmp             r7, #0x07                                                       \n"
131
                "       bne.s   reg_check_error_1                                       \n"
132
                "       cmp             r8, #0x08                                                       \n"
133
                "       bne.s   reg_check_error_1                                       \n"
134
                "       cmp             r9, #0x09                                                       \n"
135
                "       bne.s   reg_check_error_1                                       \n"
136
                "       cmp             r10, #0x0a                                                      \n"
137
                "       bne.s   reg_check_error_1                                       \n"
138
                "       cmp             r11, #0x0b                                                      \n"
139
                "       bne.s   reg_check_error_1                                       \n"
140
                "       cmp             r12, #0x0c                                                      \n"
141
                "       bne.s   reg_check_error_1                                       \n"
142
                "       cmp             r13, #0x0d                                                      \n"
143
                "       bne.s   reg_check_error_1                                       \n"
144
                "       cmp             r14, #0x0e                                                      \n"
145
                "       bne.s   reg_check_error_1                                       \n"
146
                "       cmp             r15, #0x0f                                                      \n"
147
                "       bne.s   reg_check_error_1                                       \n"
148
                "                                                                                               \n"
149
                "       ld              r2, [r0]+short(ulRegTest1Counter)       \n" /* Increment the loop counter to show that this task is still running error free. */
150
                "       add             r2, #1                                                          \n"
151
                "       st              r2, [r0]+short(ulRegTest1Counter)       \n"
152
                "       mov             r2, #0x02                                                       \n"
153
                "                                                                                               \n"
154
                "       bra.s   reg_check_loop_1                                        \n" /* Do it all again. */
155
                "                                                                                               \n"
156
                "reg_check_error_1:                                                             \n"
157
                        "bra.s          .                                                               \n"
158
        );
159
}
160
/*-----------------------------------------------------------*/
161
 
162
static void vRegTest2( void *pvParameters )
163
{
164
        __asm volatile
165
        (
166
                "       mov             r2, #0x12                                                       \n" /* Fill the registers with known values, r0 is always 0 and r1 is the stack pointer. */
167
                "       mov             r3, #0x13                                                       \n"
168
                "       mov             r4, #0x14                                                       \n"
169
                "       mov             r5, #0x15                                                       \n"
170
                "       mov             r6, #0x16                                                       \n"
171
                "       mov             r7, #0x17                                                       \n"
172
                "       mov             r8, #0x18                                                       \n"
173
                "       mov             r9, #0x19                                                       \n"
174
                "       mov             r10, #0x1a                                                      \n"
175
                "       mov             r11, #0x1b                                                      \n"
176
                "       mov             r12, #0x1c                                                      \n"
177
                "       mov             r13, #0x1d                                                      \n"
178
                "       mov             r14, #0x1e                                                      \n"
179
                "       mov             r15, #0x1f                                                      \n"
180
                "                                                                                               \n"
181
                "reg_check_loop_2:                                                              \n"
182
                "       cmp             r2, #0x12                                                       \n" /* Check that each register still contains the expected value, jump to an infinite loop if an error is found. */
183
                "       bne.s   reg_check_error_2                                       \n"
184
                "       cmp             r3, #0x13                                                       \n"
185
                "       bne.s   reg_check_error_2                                       \n"
186
                "       cmp             r4, #0x14                                                       \n"
187
                "       bne.s   reg_check_error_2                                       \n"
188
                "       cmp             r5, #0x15                                                       \n"
189
                "       bne.s   reg_check_error_2                                       \n"
190
                "       cmp             r6, #0x16                                                       \n"
191
                "       bne.s   reg_check_error_2                                       \n"
192
                "       cmp             r7, #0x17                                                       \n"
193
                "       bne.s   reg_check_error_2                                       \n"
194
                "       cmp             r8, #0x18                                                       \n"
195
                "       bne.s   reg_check_error_2                                       \n"
196
                "       cmp             r9, #0x19                                                       \n"
197
                "       bne.s   reg_check_error_2                                       \n"
198
                "       cmp             r10, #0x1a                                                      \n"
199
                "       bne.s   reg_check_error_2                                       \n"
200
                "       cmp             r11, #0x1b                                                      \n"
201
                "       bne.s   reg_check_error_2                                       \n"
202
                "       cmp             r12, #0x1c                                                      \n"
203
                "       bne.s   reg_check_error_2                                       \n"
204
                "       cmp             r13, #0x1d                                                      \n"
205
                "       bne.s   reg_check_error_2                                       \n"
206
                "       cmp             r14, #0x1e                                                      \n"
207
                "       bne.s   reg_check_error_2                                       \n"
208
                "       cmp             r15, #0x1f                                                      \n"
209
                "       bne.s   reg_check_error_2                                       \n"
210
                "                                                                                               \n"
211
                "       ld              r2, [r0]+short(ulRegTest2Counter)       \n" /* Increment the loop counter to show that this task is still running error free. */
212
                "       add             r2, #1                                                          \n"
213
                "       st              r2, [r0]+short(ulRegTest2Counter)       \n"
214
                "       mov             r2, #0x12                                                       \n"
215
                "                                                                                               \n"
216
                "       bra.s   reg_check_loop_2                                        \n" /* Do it all again. */
217
                "                                                                                               \n"
218
                "reg_check_error_2:                                                             \n"
219
                        "bra.s          .                                                               \n"
220
        );
221
}
222
/*-----------------------------------------------------------*/
223
 
224
static void prvICCheck1Task( void *pvParameters )
225
{
226
long lICCheckStatus = pdPASS;
227
 
228
        for( ;; )
229
        {
230
                /* At this point the interrupt mask should be zero. */
231
                if( ic->cpl != 0 )
232
                {
233
                        lICCheckStatus = pdFAIL;
234
                }
235
 
236
                /* If we yield here, it should still be 0 when the task next runs.
237
                ulTaskSwitchedOut is just used to check that a switch does actually
238
                happen. */
239
                ulTaskSwitchedOut = pdFALSE;
240
                taskYIELD();
241
                if( ( ulTaskSwitchedOut != pdTRUE ) || ( ic->cpl != 0 ) )
242
                {
243
                        lICCheckStatus = pdFAIL;
244
                }
245
 
246
                /* Set the interrupt mask to portSYSTEM_INTERRUPT_PRIORITY_LEVEL + 1,
247
                before checking it is as expected. */
248
                taskENTER_CRITICAL();
249
                if( ic->cpl != ( portSYSTEM_INTERRUPT_PRIORITY_LEVEL + 1 ) )
250
                {
251
                        lICCheckStatus = pdFAIL;
252
                }
253
 
254
                /* If we yield here, it should still be
255
                portSYSTEM_INTERRUPT_PRIORITY_LEVEL + 10 when the task next runs.  */
256
                ulTaskSwitchedOut = pdFALSE;
257
                taskYIELD();
258
                if( ( ulTaskSwitchedOut != pdTRUE ) || ( ic->cpl != ( portSYSTEM_INTERRUPT_PRIORITY_LEVEL + 1 ) ) )
259
                {
260
                        lICCheckStatus = pdFAIL;
261
                }
262
 
263
                /* Return the interrupt mask to its default state. */
264
                taskEXIT_CRITICAL();
265
 
266
                /* Just increment a loop counter so the check task knows if this task
267
                is still running or not. */
268
                if( lICCheckStatus == pdPASS )
269
                {
270
                        ulICTestCounter++;
271
                }
272
        }
273
}
274
/*-----------------------------------------------------------*/
275
 
276
portBASE_TYPE xAreRegTestTasksStillRunning( void )
277
{
278
static unsigned long ulLastCounter1 = 0UL, ulLastCounter2 = 0UL, ulLastICTestCounter = 0UL;
279
long lReturn;
280
 
281
        /* Check that both loop counters are still incrementing, indicating that
282
        both reg test tasks are still running error free. */
283
        if( ulLastCounter1 == ulRegTest1Counter )
284
        {
285
                lReturn = pdFAIL;
286
        }
287
        else if( ulLastCounter2 == ulRegTest2Counter )
288
        {
289
                lReturn = pdFAIL;
290
        }
291
        else if( ulLastICTestCounter == ulICTestCounter )
292
        {
293
                lReturn = pdFAIL;
294
        }
295
        else
296
        {
297
                lReturn = pdPASS;
298
        }
299
 
300
        ulLastCounter1 = ulRegTest1Counter;
301
        ulLastCounter2 = ulRegTest2Counter;
302
        ulLastICTestCounter = ulICTestCounter;
303
 
304
        return lReturn;
305
}
306
 
307
 
308
 
309
 
310
 
311
 
312
 
313
 
314
 
315
 
316
 
317
 
318
 
319
 

powered by: WebSVN 2.1.0

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