@@ -21,6 +21,7 @@ struct k_thread tdata2;
21
21
static ZTEST_BMEM char __aligned (4 ) tbuffer [MSG_SIZE * MSGQ_LEN ];
22
22
static ZTEST_DMEM char __aligned (4 ) tbuffer1 [MSG_SIZE ];
23
23
static ZTEST_DMEM uint32_t data [MSGQ_LEN ] = { MSG0 , MSG1 };
24
+ static ZTEST_DMEM uint32_t msg3 = 0x2345 ;
24
25
struct k_sem end_sema ;
25
26
26
27
static void put_msgq (struct k_msgq * pmsgq )
@@ -29,16 +30,16 @@ static void put_msgq(struct k_msgq *pmsgq)
29
30
uint32_t read_data ;
30
31
31
32
for (int i = 0 ; i < MSGQ_LEN ; i ++ ) {
32
- ret = k_msgq_put (pmsgq , (void * )& data [i ], K_NO_WAIT );
33
+ ret = IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ?
34
+ k_msgq_put_front (pmsgq , (void * ) & data [i ]) :
35
+ k_msgq_put (pmsgq , (void * )& data [i ], K_NO_WAIT );
33
36
zassert_equal (ret , 0 );
34
37
35
- /**TESTPOINT: Check if k_msgq_peek reads msgq
36
- * in FIFO manner.
37
- * Everytime msg is enqueued, msg read should
38
- * always be the first message
38
+ /**TESTPOINT: Check if k_msgq_peek reads msgq.
39
39
*/
40
40
zassert_equal (k_msgq_peek (pmsgq , & read_data ), 0 );
41
- zassert_equal (read_data , data [0 ]);
41
+ zassert_equal (read_data , IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ?
42
+ data [i ] : data [0 ]);
42
43
43
44
/**TESTPOINT: msgq free get*/
44
45
zassert_equal (k_msgq_num_free_get (pmsgq ),
@@ -58,7 +59,8 @@ static void get_msgq(struct k_msgq *pmsgq)
58
59
59
60
ret = k_msgq_get (pmsgq , & rx_data , K_FOREVER );
60
61
zassert_equal (ret , 0 );
61
- zassert_equal (rx_data , data [i ]);
62
+ zassert_equal (rx_data ,
63
+ IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ? data [MSGQ_LEN - i - 1 ] : data [i ]);
62
64
63
65
/**TESTPOINT: Check if msg read is the msg deleted*/
64
66
zassert_equal (read_data , rx_data );
@@ -138,7 +140,6 @@ static void msgq_thread_overflow(struct k_msgq *pmsgq)
138
140
K_USER | K_INHERIT_PERMS , K_NO_WAIT );
139
141
140
142
ret = k_msgq_put (pmsgq , (void * )& data [1 ], K_FOREVER );
141
-
142
143
zassert_equal (ret , 0 );
143
144
144
145
k_sem_take (& end_sema , K_FOREVER );
@@ -174,13 +175,19 @@ static void pend_thread_entry(void *p1, void *p2, void *p3)
174
175
{
175
176
int ret ;
176
177
177
- ret = k_msgq_put (p1 , & data [1 ], TIMEOUT );
178
- zassert_equal (ret , 0 );
178
+ ret = IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ?
179
+ k_msgq_put_front (p1 , & data [1 ]) :
180
+ k_msgq_put (p1 , & data [1 ], TIMEOUT );
181
+ zassert_equal (ret , IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ? - ENOMSG : 0 );
179
182
}
180
183
181
184
static void msgq_thread_data_passing (struct k_msgq * pmsgq )
182
185
{
183
- while (k_msgq_put (pmsgq , & data [0 ], K_NO_WAIT ) != 0 ) {
186
+ while (
187
+ IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ?
188
+ k_msgq_put_front (pmsgq , & data [0 ]) != 0 :
189
+ k_msgq_put (pmsgq , & data [0 ], K_NO_WAIT ) != 0
190
+ ) {
184
191
}
185
192
186
193
tids [0 ] = k_thread_create (& tdata2 , tstack2 , STACK_SIZE ,
@@ -242,6 +249,21 @@ static void put_full_entry(void *p1, void *p2, void *p3)
242
249
zassert_equal (ret , 0 );
243
250
}
244
251
252
+ static void prepend_full_entry (void * p1 , void * p2 , void * p3 )
253
+ {
254
+ int ret ;
255
+
256
+ /* make sure the queue is full */
257
+ zassert_equal (k_msgq_num_free_get (p1 ), 0 );
258
+ zassert_equal (k_msgq_num_used_get (p1 ), 2 );
259
+ k_sem_give (& end_sema );
260
+
261
+ /* prepend a new message */
262
+ ret = IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ? k_msgq_put_front (p1 , & msg3 ) :
263
+ k_msgq_put (p1 , & msg3 , K_FOREVER );
264
+ zassert_equal (ret , IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ? - ENOMSG : 0 );
265
+ }
266
+
245
267
/**
246
268
* @addtogroup kernel_message_queue_tests
247
269
* @{
@@ -452,6 +474,52 @@ ZTEST(msgq_api_1cpu, test_msgq_full)
452
474
k_thread_abort (tids [0 ]);
453
475
}
454
476
477
+ /**
478
+ * @brief Put a message to a full queue for behavior test
479
+ *
480
+ * @details
481
+ * - Thread A put message to a full message queue and go to sleep
482
+ * Thread B put a new message to the queue then pending on it.
483
+ * - Thread A get all messages from message queue and check the behavior.
484
+ *
485
+ * @see k_msgq_put(), k_msgq_put_front()
486
+ */
487
+ ZTEST (msgq_api_1cpu , test_msgq_thread_pending )
488
+ {
489
+ uint32_t rx_data ;
490
+ int pri = k_thread_priority_get (k_current_get ()) - 1 ;
491
+ int ret ;
492
+
493
+ k_msgq_init (& msgq1 , tbuffer , MSG_SIZE , 2 );
494
+ ret = k_sem_init (& end_sema , 0 , 1 );
495
+ zassert_equal (ret , 0 );
496
+
497
+ ret = IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ?
498
+ k_msgq_put_front (& msgq1 , & data [1 ]) :
499
+ k_msgq_put (& msgq1 , & data [0 ], K_NO_WAIT );
500
+ zassert_equal (ret , 0 );
501
+ ret = IS_ENABLED (CONFIG_TEST_MSGQ_PUT_FRONT ) ?
502
+ k_msgq_put (& msgq1 , & data [0 ], K_NO_WAIT ) :
503
+ k_msgq_put_front (& msgq1 , & data [1 ]);
504
+ zassert_equal (ret , 0 );
505
+
506
+ k_tid_t tid = k_thread_create (& tdata2 , tstack2 , STACK_SIZE ,
507
+ prepend_full_entry , & msgq1 , NULL ,
508
+ NULL , pri , 0 , K_NO_WAIT );
509
+
510
+ /* that putting thread is being blocked now */
511
+ k_sem_take (& end_sema , K_FOREVER );
512
+
513
+ ret = k_msgq_get (& msgq1 , & rx_data , K_FOREVER );
514
+ zassert_equal (ret , 0 );
515
+ zassert_equal (rx_data , data [1 ]);
516
+
517
+ ret = k_msgq_get (& msgq1 , & rx_data , K_FOREVER );
518
+ zassert_equal (ret , 0 );
519
+ zassert_equal (rx_data , data [0 ]);
520
+ k_thread_abort (tid );
521
+ }
522
+
455
523
/**
456
524
* @}
457
525
*/
0 commit comments