8
8
#include <kernel.h>
9
9
#include <cmsis_os.h>
10
10
11
+ #include <irq_offload.h>
12
+ #include <kernel_structs.h>
13
+
11
14
#define TIMEOUT (100)
12
15
#define SIGNAL1 (0x00000020)
13
16
#define SIGNAL2 (0x00000004)
14
17
#define SIGNAL (SIGNAL1 | SIGNAL2)
15
18
19
+ #define SIGNAL_FLAG 0x00000001
20
+ #define ISR_SIGNAL 0x50
21
+
22
+ #define SIGNAL_ALL_FLAGS ((1 << osFeature_Signals) - 1)
23
+ #define SIGNAL_OUTOFLIMIT_FLAG ((1 << (osFeature_Signals + 1))-1)
24
+
16
25
void Thread_1 (void const * arg )
17
26
{
18
27
int signals = osSignalSet ((osThreadId )arg , SIGNAL1 );
@@ -27,6 +36,36 @@ void Thread_2(void const *arg)
27
36
zassert_not_equal (signals , 0x80000000 , "" );
28
37
}
29
38
39
+ void test_multiple_signal_flags (void const * thread_id )
40
+ {
41
+ int max_signal_cnt = osFeature_Signals ;
42
+ int signals , sig_cnt ;
43
+
44
+ for (sig_cnt = 0 ; sig_cnt < max_signal_cnt ; sig_cnt ++ ) {
45
+ /* create unique signal flags to set one flag at a time */
46
+ s32_t signal_each_flag = SIGNAL_FLAG << sig_cnt ;
47
+ /* check if each signal flag is set properly */
48
+ signals = osSignalSet ((osThreadId )thread_id , signal_each_flag );
49
+ zassert_not_equal (signals , 0x80000000 ,
50
+ "Setting each signal flag failed" );
51
+ }
52
+ /* clear all the bits to check next scenario */
53
+ signals = osSignalClear ((osThreadId )thread_id , SIGNAL_ALL_FLAGS );
54
+ zassert_not_equal (signals , 0x80000000 , "" );
55
+
56
+ /* signal all the available flags at one shot */
57
+ signals = osSignalSet ((osThreadId )thread_id , SIGNAL_ALL_FLAGS );
58
+ zassert_not_equal (signals , 0x80000000 ,
59
+ "Signal flags maximum limit failed" );
60
+ /* clear all the bits to check next scenario */
61
+ signals = osSignalClear ((osThreadId )thread_id , SIGNAL_ALL_FLAGS );
62
+ zassert_not_equal (signals , 0x80000000 , "" );
63
+
64
+ /* signal invalid flag to validate permissible flag limit */
65
+ signals = osSignalSet ((osThreadId )thread_id , SIGNAL_OUTOFLIMIT_FLAG );
66
+ zassert_equal (signals , 0x80000000 , "Signal flags set unexpectedly" );
67
+ }
68
+
30
69
osThreadDef (Thread_1 , osPriorityHigh , 3 , 0 );
31
70
osThreadDef (Thread_2 , osPriorityHigh , 1 , 0 );
32
71
@@ -47,6 +86,7 @@ void test_signal_events_no_wait(void)
47
86
evt = osSignalWait (SIGNAL1 , 0 );
48
87
zassert_equal (evt .status , osEventSignal , "" );
49
88
zassert_equal ((evt .value .signals & SIGNAL1 ), SIGNAL1 , "" );
89
+ osThreadTerminate (id1 );
50
90
}
51
91
52
92
void test_signal_events_timeout (void )
@@ -62,28 +102,95 @@ void test_signal_events_timeout(void)
62
102
osDelay (10 );
63
103
64
104
signals = osSignalClear (osThreadGetId (), SIGNAL1 );
65
- zassert_not_equal (signals , 0x80000000 , "" );
105
+ zassert_not_equal (signals , 0x80000000 , "signal clear failed " );
66
106
67
107
/* wait for SIGNAL1. It should timeout here as the signal
68
108
* though triggered, gets cleared in the previous step.
69
109
*/
70
110
evt = osSignalWait (SIGNAL1 , TIMEOUT );
71
- zassert_equal (evt .status , osEventTimeout , "" );
111
+ zassert_equal (evt .status , osEventTimeout , "signal timeout failed" );
112
+ osThreadTerminate (id1 );
72
113
}
73
114
74
115
void test_signal_events_signalled (void )
75
116
{
76
117
osThreadId id1 , id2 ;
77
118
osEvent evt ;
119
+ int signals ;
78
120
79
121
id1 = osThreadCreate (osThread (Thread_1 ), osThreadGetId ());
80
122
zassert_true (id1 != NULL , "Thread creation failed" );
81
123
82
124
id2 = osThreadCreate (osThread (Thread_2 ), osThreadGetId ());
83
125
zassert_true (id2 != NULL , "Thread creation failed" );
84
126
85
- /* wait for a signal */
127
+ /* wait for multiple signals */
86
128
evt = osSignalWait (SIGNAL , TIMEOUT );
87
- zassert_equal (evt .status , osEventSignal , "" );
88
- zassert_equal ((evt .value .signals & SIGNAL ), SIGNAL , "" );
129
+ zassert_equal (evt .status , osEventSignal ,
130
+ "wait signal returned unexpected error" );
131
+ zassert_equal ((evt .value .signals & SIGNAL ), SIGNAL ,
132
+ "wait signal failed unexpectedly" );
133
+
134
+ signals = osSignalClear (osThreadGetId (), SIGNAL );
135
+ zassert_not_equal (signals , 0x80000000 , "clear signal failed" );
136
+
137
+ /* Set any single signal */
138
+ signals = osSignalSet (osThreadGetId (), SIGNAL1 );
139
+ zassert_not_equal (signals , 0x80000000 , "set any signal failed" );
140
+
141
+ /* wait for any single signal flag */
142
+ evt = osSignalWait (0 , TIMEOUT );
143
+ zassert_equal (evt .status , osEventSignal , "wait for single flag failed" );
144
+ zassert_equal (evt .value .signals , SIGNAL1 ,
145
+ "wait single flag returned invalid value" );
146
+
147
+ /* validate by passing invalid parameters */
148
+ zassert_equal (osSignalSet (NULL , 0 ), 0x80000000 ,
149
+ "NULL signal set unexpectedly" );
150
+ zassert_equal (osSignalClear (NULL , 0 ), 0x80000000 ,
151
+ "NULL signal cleared unexpectedly" );
152
+ /* cannot wait for Flag mask with MSB set */
153
+ zassert_equal (osSignalWait ((int32_t )0x80010000 , 0 ).status , osErrorValue ,
154
+ "signal wait passed unexpectedly" );
155
+ zassert_equal (osSignalSet (osThreadGetId (), (int32_t )0x80010000 ),
156
+ 0x80000000 , "signal set unexpectedly" );
157
+ zassert_equal (osSignalClear (osThreadGetId (), (int32_t )0x80010000 ),
158
+ 0x80000000 , "signal cleared unexpectedly" );
159
+
160
+ test_multiple_signal_flags (osThreadGetId ());
161
+ }
162
+
163
+ /* IRQ offload function handler to set signal flag */
164
+ static void offload_function (void * param )
165
+ {
166
+ u32_t tid = (u32_t )param ;
167
+ int signals ;
168
+
169
+ /* Make sure we're in IRQ context */
170
+ zassert_true (_is_in_isr (), "Not in IRQ context!" );
171
+
172
+ signals = osSignalSet ((osThreadId )tid , ISR_SIGNAL );
173
+ zassert_not_equal (signals , 0x80000000 , "signal set failed in ISR" );
174
+ }
175
+
176
+ void test_signal_from_isr (void const * thread_id )
177
+ {
178
+ /**TESTPOINT: Offload to IRQ context*/
179
+ irq_offload (offload_function , (void * )thread_id );
180
+ }
181
+
182
+ osThreadDef (test_signal_from_isr , osPriorityHigh , 1 , 0 );
183
+
184
+ void test_signal_events_isr (void )
185
+ {
186
+ osThreadId id ;
187
+ osEvent evt ;
188
+
189
+ id = osThreadCreate (osThread (test_signal_from_isr ), osThreadGetId ());
190
+ zassert_true (id != NULL , "Thread creation failed" );
191
+ evt = osSignalWait (ISR_SIGNAL , TIMEOUT );
192
+ zassert_equal (evt .status , osEventSignal ,
193
+ "signal wait failed unexpectedly" );
194
+ zassert_equal ((evt .value .signals & ISR_SIGNAL ),
195
+ ISR_SIGNAL , "unexpected signal wait value" );
89
196
}
0 commit comments