Clean up whitespace.
[bertos.git] / bertos / kern / sem_test.c
1 /**
2  * \file
3  * <!--
4  * This file is part of BeRTOS.
5  *
6  * Bertos is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * As a special exception, you may use this file as part of a free software
21  * library without restriction.  Specifically, if other files instantiate
22  * templates or use macros or inline functions from this file, or you compile
23  * this file and link it with other files to produce an executable, this
24  * file does not by itself cause the resulting executable to be covered by
25  * the GNU General Public License.  This exception does not however
26  * invalidate any other reasons why the executable file might be covered by
27  * the GNU General Public License.
28  *
29  * Copyright 2008 Develer S.r.l. (http://www.develer.com/)
30  * -->
31  *
32  * \brief Semaphore test.
33  *
34  * \version $Id$
35  *
36  * \author Daniele Basile <asterix@develer.com>
37  * \author Stefano Fedrigo <aleph@develer.com>
38  *
39  */
40
41 #include <cfg/debug.h>
42 #include <cfg/test.h>
43
44 #include <kern/sem.h>
45 #include <kern/proc.h>
46 #include <kern/irq.h>
47
48 #include <drv/timer.h>
49
50 // Global settings for the test.
51 #define MAX_GLOBAL_COUNT             1024
52 #define TEST_TIME_OUT_MS             6000
53 #define DELAY                          5
54
55 // Settings for the test process.
56 //Process 1
57 #define INC_PROC_T1                     1
58 #define DELAY_PROC_T1   INC_PROC_T1*DELAY
59 //Process 2
60 #define INC_PROC_T2                     3
61 #define DELAY_PROC_T2   INC_PROC_T2*DELAY
62 //Process 3
63 #define INC_PROC_T3                     5
64 #define DELAY_PROC_T3   INC_PROC_T3*DELAY
65 //Process 4
66 #define INC_PROC_T4                     7
67 #define DELAY_PROC_T4   INC_PROC_T4*DELAY
68 //Process 5
69 #define INC_PROC_T5                    11
70 #define DELAY_PROC_T5   INC_PROC_T5*DELAY
71 //Process 6
72 #define INC_PROC_T6                    13
73 #define DELAY_PROC_T6   INC_PROC_T6*DELAY
74 //Process 7
75 #define INC_PROC_T7                    17
76 #define DELAY_PROC_T7   INC_PROC_T7*DELAY
77 //Process 8
78 #define INC_PROC_T8                    19
79 #define DELAY_PROC_T8   INC_PROC_T8*DELAY
80
81 Semaphore sem;
82 unsigned int global_count = 0;
83
84 /*
85  * These macros generate the code needed to create the test process functions.
86  */
87 #define PROC_TEST(num) static void proc_test##num(void) \
88 { \
89         unsigned int local_count = 0; \
90         \
91         for (int i = 0; i < INC_PROC_T##num; ++i) \
92         { \
93                 sem_obtain(&sem); \
94                 kprintf("> test%d: Obtain semaphore.\n", num); \
95                 local_count = global_count; \
96                 kprintf("> test%d: Read global count [%d]\n", num, local_count); \
97                 timer_delay(DELAY_PROC_T##num); \
98                 local_count += INC_PROC_T##num; \
99                 global_count = local_count; \
100                 kprintf("> test%d: Update count g[%d] l[%d]\n", num, global_count, local_count); \
101                 sem_release(&sem); \
102                 kprintf("> test%d: Relase semaphore.\n", num); \
103         } \
104 } \
105
106 #define PROC_TEST_STACK(num)  static cpu_stack_t proc_test##num##_stack[CONFIG_KERN_MINSTACKSIZE / sizeof(cpu_stack_t)];
107 #define PROC_TEST_INIT(num)   proc_new(proc_test##num, NULL, sizeof(proc_test##num##_stack), proc_test##num##_stack);
108
109 // Define process
110 PROC_TEST(1)
111 PROC_TEST(2)
112 PROC_TEST(3)
113 PROC_TEST(4)
114 PROC_TEST(5)
115 PROC_TEST(6)
116 PROC_TEST(7)
117 PROC_TEST(8)
118
119 // Define process stacks for test.
120 PROC_TEST_STACK(1)
121 PROC_TEST_STACK(2)
122 PROC_TEST_STACK(3)
123 PROC_TEST_STACK(4)
124 PROC_TEST_STACK(5)
125 PROC_TEST_STACK(6)
126 PROC_TEST_STACK(7)
127 PROC_TEST_STACK(8)
128
129 /**
130  * Run semaphore test
131  */
132 int sem_testRun(void)
133 {
134         ticks_t start_time = timer_clock();
135
136         kprintf("Run semaphore test..\n");
137
138         //Init the process tests
139         PROC_TEST_INIT(1)
140         PROC_TEST_INIT(2)
141         PROC_TEST_INIT(3)
142         PROC_TEST_INIT(4)
143         PROC_TEST_INIT(5)
144         PROC_TEST_INIT(6)
145         PROC_TEST_INIT(7)
146         PROC_TEST_INIT(8)
147         kputs("> Main: Processes created\n");
148
149         /*
150          * Wait until all processes exit, if something goes wrong we return an
151          * error after timeout_ms.
152          */
153         while((timer_clock() - start_time) < ms_to_ticks(TEST_TIME_OUT_MS))
154         {
155                 if (sem_attempt(&sem))
156                 {
157                         kputs("> Main: Check if test has finished..\n");
158                         if(global_count == MAX_GLOBAL_COUNT)
159                         {
160                                 kputs("> Main: Test Finished..Ok!\n");
161                                 return 0;
162                         }
163                         sem_release(&sem);
164                         kputs("> Main: Test is still running..\n");
165                 }
166                 proc_yield();
167         }
168
169         kputs("Semaphore Test fail..\n");
170         return -1;
171 }
172
173 int sem_testSetup(void)
174 {
175         kdbg_init();
176
177         kprintf("Init Semaphore..");
178         sem_init(&sem);
179         kprintf("Done.\n");
180
181         #if CONFIG_KERN_PREEMPT
182                 kprintf("Init Interrupt (preempt mode)..");
183                 irq_init();
184                 kprintf("Done.\n");
185         #endif
186
187         kprintf("Init Timer..");
188         timer_init();
189         kprintf("Done.\n");
190
191         kprintf("Init Process..");
192         proc_init();
193         kprintf("Done.\n");
194
195         return 0;
196 }
197
198 int sem_testTearDown(void)
199 {
200         kputs("TearDown Semaphore test.\n");
201         return 0;
202 }
203
204 TEST_MAIN(sem);