88#include <kernel.h>
99#include <cmsis_os.h>
1010
11+ #include <irq_offload.h>
12+ #include <kernel_structs.h>
13+
1114#define TIMEOUT (100)
1215#define SIGNAL1 (0x00000020)
1316#define SIGNAL2 (0x00000004)
1417#define SIGNAL (SIGNAL1 | SIGNAL2)
1518
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+
1625void Thread_1 (void const * arg )
1726{
1827 int signals = osSignalSet ((osThreadId )arg , SIGNAL1 );
@@ -27,6 +36,36 @@ void Thread_2(void const *arg)
2736 zassert_not_equal (signals , 0x80000000 , "" );
2837}
2938
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+
3069osThreadDef (Thread_1 , osPriorityHigh , 3 , 0 );
3170osThreadDef (Thread_2 , osPriorityHigh , 1 , 0 );
3271
@@ -47,6 +86,7 @@ void test_signal_events_no_wait(void)
4786 evt = osSignalWait (SIGNAL1 , 0 );
4887 zassert_equal (evt .status , osEventSignal , "" );
4988 zassert_equal ((evt .value .signals & SIGNAL1 ), SIGNAL1 , "" );
89+ osThreadTerminate (id1 );
5090}
5191
5292void test_signal_events_timeout (void )
@@ -62,28 +102,95 @@ void test_signal_events_timeout(void)
62102 osDelay (10 );
63103
64104 signals = osSignalClear (osThreadGetId (), SIGNAL1 );
65- zassert_not_equal (signals , 0x80000000 , "" );
105+ zassert_not_equal (signals , 0x80000000 , "signal clear failed " );
66106
67107 /* wait for SIGNAL1. It should timeout here as the signal
68108 * though triggered, gets cleared in the previous step.
69109 */
70110 evt = osSignalWait (SIGNAL1 , TIMEOUT );
71- zassert_equal (evt .status , osEventTimeout , "" );
111+ zassert_equal (evt .status , osEventTimeout , "signal timeout failed" );
112+ osThreadTerminate (id1 );
72113}
73114
74115void test_signal_events_signalled (void )
75116{
76117 osThreadId id1 , id2 ;
77118 osEvent evt ;
119+ int signals ;
78120
79121 id1 = osThreadCreate (osThread (Thread_1 ), osThreadGetId ());
80122 zassert_true (id1 != NULL , "Thread creation failed" );
81123
82124 id2 = osThreadCreate (osThread (Thread_2 ), osThreadGetId ());
83125 zassert_true (id2 != NULL , "Thread creation failed" );
84126
85- /* wait for a signal */
127+ /* wait for multiple signals */
86128 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" );
89196}
0 commit comments