xref: /nrf52832-nimble/rt-thread/examples/test/rbb_test.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * File      : rbb_test.c
3*10465441SEvalZero  * This file is part of RT-Thread RTOS
4*10465441SEvalZero  * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
5*10465441SEvalZero  *
6*10465441SEvalZero  *  This program is free software; you can redistribute it and/or modify
7*10465441SEvalZero  *  it under the terms of the GNU General Public License as published by
8*10465441SEvalZero  *  the Free Software Foundation; either version 2 of the License, or
9*10465441SEvalZero  *  (at your option) any later version.
10*10465441SEvalZero  *
11*10465441SEvalZero  *  This program is distributed in the hope that it will be useful,
12*10465441SEvalZero  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*10465441SEvalZero  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*10465441SEvalZero  *  GNU General Public License for more details.
15*10465441SEvalZero  *
16*10465441SEvalZero  *  You should have received a copy of the GNU General Public License along
17*10465441SEvalZero  *  with this program; if not, write to the Free Software Foundation, Inc.,
18*10465441SEvalZero  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19*10465441SEvalZero  *
20*10465441SEvalZero  * Change Logs:
21*10465441SEvalZero  * Date           Author       Notes
22*10465441SEvalZero  * 2018-08-31     armink       the first version
23*10465441SEvalZero  */
24*10465441SEvalZero 
25*10465441SEvalZero #include <string.h>
26*10465441SEvalZero #include <rtthread.h>
27*10465441SEvalZero #include <rtdevice.h>
28*10465441SEvalZero #include <stdlib.h>
29*10465441SEvalZero 
30*10465441SEvalZero static rt_bool_t put_finish = RT_FALSE;
31*10465441SEvalZero 
put_thread(void * param)32*10465441SEvalZero static void put_thread(void *param)
33*10465441SEvalZero {
34*10465441SEvalZero     rt_rbb_t rbb = (rt_rbb_t)param;
35*10465441SEvalZero     rt_rbb_blk_t block;
36*10465441SEvalZero     rt_uint8_t put_count = 0;
37*10465441SEvalZero 
38*10465441SEvalZero     put_finish = RT_FALSE;
39*10465441SEvalZero 
40*10465441SEvalZero     while (put_count < 255)
41*10465441SEvalZero     {
42*10465441SEvalZero         if (put_count == 10)
43*10465441SEvalZero         {
44*10465441SEvalZero             put_count = 10;
45*10465441SEvalZero         }
46*10465441SEvalZero         block = rt_rbb_blk_alloc(rbb, rand() % 10 + 1);
47*10465441SEvalZero         if (block)
48*10465441SEvalZero         {
49*10465441SEvalZero             block->buf[0] = put_count++;
50*10465441SEvalZero             rt_rbb_blk_put(block);
51*10465441SEvalZero         }
52*10465441SEvalZero         rt_thread_mdelay(rand() % 10);
53*10465441SEvalZero     }
54*10465441SEvalZero     rt_kprintf("Put block data finish.\n");
55*10465441SEvalZero 
56*10465441SEvalZero     put_finish = RT_TRUE;
57*10465441SEvalZero }
58*10465441SEvalZero 
get_thread(void * param)59*10465441SEvalZero static void get_thread(void *param)
60*10465441SEvalZero {
61*10465441SEvalZero     rt_rbb_t rbb = (rt_rbb_t)param;
62*10465441SEvalZero     rt_rbb_blk_t block;
63*10465441SEvalZero     rt_uint8_t get_count = 0;
64*10465441SEvalZero 
65*10465441SEvalZero     while (get_count < 255)
66*10465441SEvalZero     {
67*10465441SEvalZero         if (get_count == 10)
68*10465441SEvalZero         {
69*10465441SEvalZero             get_count = 10;
70*10465441SEvalZero         }
71*10465441SEvalZero         block = rt_rbb_blk_get(rbb);
72*10465441SEvalZero         if (block)
73*10465441SEvalZero         {
74*10465441SEvalZero             if (block->buf[0] != get_count++)
75*10465441SEvalZero             {
76*10465441SEvalZero                 rt_kprintf("Error: get data (times %d) has an error!\n", get_count);
77*10465441SEvalZero             }
78*10465441SEvalZero             rt_rbb_blk_free(rbb, block);
79*10465441SEvalZero         }
80*10465441SEvalZero         else if (put_finish)
81*10465441SEvalZero         {
82*10465441SEvalZero             break;
83*10465441SEvalZero         }
84*10465441SEvalZero         rt_thread_mdelay(rand() % 10);
85*10465441SEvalZero     }
86*10465441SEvalZero     rt_kprintf("Get block data finish.\n");
87*10465441SEvalZero     rt_kprintf("\n====================== rbb dynamic test finish =====================\n");
88*10465441SEvalZero }
89*10465441SEvalZero 
rbb_test(void)90*10465441SEvalZero void rbb_test(void)
91*10465441SEvalZero {
92*10465441SEvalZero     rt_rbb_t rbb;
93*10465441SEvalZero     rt_rbb_blk_t blk1, blk2, blk3, blk4, blk5, blk6, _blk1, _blk2;
94*10465441SEvalZero     rt_size_t i, j, k, req_size, size;
95*10465441SEvalZero     struct rt_rbb_blk_queue blk_queue1;
96*10465441SEvalZero     rt_thread_t thread;
97*10465441SEvalZero 
98*10465441SEvalZero     /* create ring block buffer */
99*10465441SEvalZero     rt_kprintf("\n====================== rbb create test =====================\n");
100*10465441SEvalZero     rbb = rt_rbb_create(52, 6);
101*10465441SEvalZero     if (rbb)
102*10465441SEvalZero     {
103*10465441SEvalZero         rt_kprintf("6 blocks in 52 bytes ring block buffer object create success.\n");
104*10465441SEvalZero     }
105*10465441SEvalZero     else
106*10465441SEvalZero     {
107*10465441SEvalZero         rt_kprintf("Test error: 6 blocks in 52 bytes ring block buffer object create failed.\n");
108*10465441SEvalZero     }
109*10465441SEvalZero     /* allocate block */
110*10465441SEvalZero     rt_kprintf("\n====================== rbb alloc test =====================\n");
111*10465441SEvalZero     blk1 = rt_rbb_blk_alloc(rbb, 2);
112*10465441SEvalZero     if (blk1 && blk1->size == 2)
113*10465441SEvalZero     {
114*10465441SEvalZero         memset(blk1->buf, 1, blk1->size);
115*10465441SEvalZero         rt_kprintf("Block1 (2 bytes) allocate success.\n");
116*10465441SEvalZero     }
117*10465441SEvalZero     else
118*10465441SEvalZero     {
119*10465441SEvalZero         rt_kprintf("Test error: block1 (2 bytes) allocate failed.\n");
120*10465441SEvalZero         goto __exit;
121*10465441SEvalZero     }
122*10465441SEvalZero     blk2 = rt_rbb_blk_alloc(rbb, 4);
123*10465441SEvalZero     if (blk2 && blk2->size == 4)
124*10465441SEvalZero     {
125*10465441SEvalZero         memset(blk2->buf, 2, blk2->size);
126*10465441SEvalZero         rt_kprintf("Block2 (4 bytes) allocate success.\n");
127*10465441SEvalZero     }
128*10465441SEvalZero     else
129*10465441SEvalZero     {
130*10465441SEvalZero         rt_kprintf("Test error: block2 (4 bytes) allocate failed.\n");
131*10465441SEvalZero         goto __exit;
132*10465441SEvalZero     }
133*10465441SEvalZero     blk3 = rt_rbb_blk_alloc(rbb, 8);
134*10465441SEvalZero     if (blk3 && blk3->size == 8)
135*10465441SEvalZero     {
136*10465441SEvalZero         memset(blk3->buf, 3, blk3->size);
137*10465441SEvalZero         rt_kprintf("Block3 (8 bytes) allocate success.\n");
138*10465441SEvalZero     }
139*10465441SEvalZero     else
140*10465441SEvalZero     {
141*10465441SEvalZero         rt_kprintf("Test error: block3 (8 bytes) allocate failed.\n");
142*10465441SEvalZero         goto __exit;
143*10465441SEvalZero     }
144*10465441SEvalZero     blk4 = rt_rbb_blk_alloc(rbb, 16);
145*10465441SEvalZero     if (blk4 && blk4->size == 16)
146*10465441SEvalZero     {
147*10465441SEvalZero         memset(blk4->buf, 4, blk4->size);
148*10465441SEvalZero         rt_kprintf("Block4 (16 bytes) allocate success.\n");
149*10465441SEvalZero     }
150*10465441SEvalZero     else
151*10465441SEvalZero     {
152*10465441SEvalZero         rt_kprintf("Test error: block4 (16 bytes) allocate failed.\n");
153*10465441SEvalZero         goto __exit;
154*10465441SEvalZero     }
155*10465441SEvalZero     blk5 = rt_rbb_blk_alloc(rbb, 32);
156*10465441SEvalZero     if (blk5 && blk5->size == 32)
157*10465441SEvalZero     {
158*10465441SEvalZero         memset(blk5->buf, 5, blk5->size);
159*10465441SEvalZero         rt_kprintf("Block5 (32 bytes) allocate success.\n");
160*10465441SEvalZero     }
161*10465441SEvalZero     else
162*10465441SEvalZero     {
163*10465441SEvalZero         rt_kprintf("Block5 (32 bytes) allocate failed.\n");
164*10465441SEvalZero     }
165*10465441SEvalZero     blk5 = rt_rbb_blk_alloc(rbb, 18);
166*10465441SEvalZero     if (blk5 && blk5->size == 18)
167*10465441SEvalZero     {
168*10465441SEvalZero         memset(blk5->buf, 5, blk5->size);
169*10465441SEvalZero         rt_kprintf("Block5 (18 bytes) allocate success.\n");
170*10465441SEvalZero     }
171*10465441SEvalZero     else
172*10465441SEvalZero     {
173*10465441SEvalZero         rt_kprintf("Test error: block5 (18 bytes) allocate failed.\n");
174*10465441SEvalZero         goto __exit;
175*10465441SEvalZero     }
176*10465441SEvalZero     rt_kprintf("Ring block buffer current status:\n");
177*10465441SEvalZero     rt_kprintf("next block queue length: %d\n", rt_rbb_next_blk_queue_len(rbb));
178*10465441SEvalZero     rt_kprintf("block list length: %d\n", rt_slist_len(&rbb->blk_list));
179*10465441SEvalZero     rt_kprintf("|<- 2 -->|<-- 4 -->|<---- 8 ----->|<------- 16 -------->|<------ 18 ------>|<---- 4 ---->|\n");
180*10465441SEvalZero     rt_kprintf("+--------+---------+--------------+---------------------+------------------+-------------+\n");
181*10465441SEvalZero     rt_kprintf("| blcok1 | block2  |    block3    |       block4        |       block5     |    empty    |\n");
182*10465441SEvalZero     rt_kprintf("+--------+---------+--------------+---------------------+------------------+-------------+\n");
183*10465441SEvalZero     rt_kprintf("| inited | inited  |    inited    |       inited        |       inited     |             |\n");
184*10465441SEvalZero 
185*10465441SEvalZero     /* put block */
186*10465441SEvalZero     rt_kprintf("\n====================== rbb put test =====================\n");
187*10465441SEvalZero     rt_rbb_blk_put(blk1);
188*10465441SEvalZero     rt_rbb_blk_put(blk2);
189*10465441SEvalZero     rt_rbb_blk_put(blk3);
190*10465441SEvalZero     rt_rbb_blk_put(blk4);
191*10465441SEvalZero     rt_rbb_blk_put(blk5);
192*10465441SEvalZero     rt_kprintf("Block1 to block5 put success.\n");
193*10465441SEvalZero     rt_kprintf("Ring block buffer current status:\n");
194*10465441SEvalZero     rt_kprintf("next block queue length: %d\n", rt_rbb_next_blk_queue_len(rbb));
195*10465441SEvalZero     rt_kprintf("block list length: %d\n", rt_slist_len(&rbb->blk_list));
196*10465441SEvalZero     rt_kprintf("|<- 2 -->|<-- 4 -->|<---- 8 ----->|<------- 16 -------->|<------ 18 ------>|<---- 4 ---->|\n");
197*10465441SEvalZero     rt_kprintf("+--------+---------+--------------+---------------------+------------------+-------------+\n");
198*10465441SEvalZero     rt_kprintf("| blcok1 | block2  |    block3    |       block4        |       block5     |    empty    |\n");
199*10465441SEvalZero     rt_kprintf("+--------+---------+--------------+---------------------+------------------+-------------+\n");
200*10465441SEvalZero     rt_kprintf("|  put   |  put    |     put      |        put          |        put       |             |\n");
201*10465441SEvalZero 
202*10465441SEvalZero     /* get block */
203*10465441SEvalZero     rt_kprintf("\n====================== rbb get test =====================\n");
204*10465441SEvalZero     _blk1 = rt_rbb_blk_get(rbb);
205*10465441SEvalZero     _blk2 = rt_rbb_blk_get(rbb);
206*10465441SEvalZero     for (i = 0; i < _blk1->size; i++)
207*10465441SEvalZero     {
208*10465441SEvalZero         if (_blk1->buf[i] != 1) break;
209*10465441SEvalZero     }
210*10465441SEvalZero     for (j = 0; j < _blk2->size; j++)
211*10465441SEvalZero     {
212*10465441SEvalZero         if (_blk2->buf[j] != 2) break;
213*10465441SEvalZero     }
214*10465441SEvalZero     if (blk1 == _blk1 && blk2 == _blk2 && i == _blk1->size && j == _blk2->size)
215*10465441SEvalZero     {
216*10465441SEvalZero         rt_kprintf("Block1 and block2 get success.\n");
217*10465441SEvalZero     }
218*10465441SEvalZero     else
219*10465441SEvalZero     {
220*10465441SEvalZero         rt_kprintf("Test error: block1 and block2 get failed.\n");
221*10465441SEvalZero         goto __exit;
222*10465441SEvalZero     }
223*10465441SEvalZero     rt_kprintf("Ring block buffer current status:\n");
224*10465441SEvalZero     rt_kprintf("next block queue length: %d\n", rt_rbb_next_blk_queue_len(rbb));
225*10465441SEvalZero     rt_kprintf("block list length: %d\n", rt_slist_len(&rbb->blk_list));
226*10465441SEvalZero     rt_kprintf("|<- 2 -->|<-- 4 -->|<---- 8 ----->|<------- 16 -------->|<------ 18 ------>|<---- 4 ---->|\n");
227*10465441SEvalZero     rt_kprintf("+--------+---------+--------------+---------------------+------------------+-------------+\n");
228*10465441SEvalZero     rt_kprintf("| blcok1 | block2  |    block3    |       block4        |       block5     |    empty    |\n");
229*10465441SEvalZero     rt_kprintf("+--------+---------+--------------+---------------------+------------------+-------------+\n");
230*10465441SEvalZero     rt_kprintf("|  get   |   get   |     put      |        put          |        put       |             |\n");
231*10465441SEvalZero 
232*10465441SEvalZero     /* free block */
233*10465441SEvalZero     rt_kprintf("\n====================== rbb free test =====================\n");
234*10465441SEvalZero     rt_rbb_blk_free(rbb, blk2);
235*10465441SEvalZero     rt_kprintf("Block2 free success.\n");
236*10465441SEvalZero     rt_rbb_blk_free(rbb, blk1);
237*10465441SEvalZero     rt_kprintf("Block1 free success.\n");
238*10465441SEvalZero     rt_kprintf("Ring block buffer current status:\n");
239*10465441SEvalZero     rt_kprintf("next block queue length: %d\n", rt_rbb_next_blk_queue_len(rbb));
240*10465441SEvalZero     rt_kprintf("block list length: %d\n", rt_slist_len(&rbb->blk_list));
241*10465441SEvalZero     rt_kprintf("|<------- 6 ------>|<---- 8 ----->|<------- 16 -------->|<------ 18 ------>|<---- 4 ---->|\n");
242*10465441SEvalZero     rt_kprintf("+------------------+--------------+---------------------+------------------+-------------+\n");
243*10465441SEvalZero     rt_kprintf("|      empty2      |    block3    |       block4        |       block5     |    empty1   |\n");
244*10465441SEvalZero     rt_kprintf("+------------------+--------------+---------------------+------------------+-------------+\n");
245*10465441SEvalZero     rt_kprintf("|                  |     put      |        put          |        put       |             |\n");
246*10465441SEvalZero 
247*10465441SEvalZero     blk6 = rt_rbb_blk_alloc(rbb, 5);
248*10465441SEvalZero     if (blk6)
249*10465441SEvalZero     {
250*10465441SEvalZero         rt_kprintf("Block6 (5 bytes) allocate success.\n");
251*10465441SEvalZero     }
252*10465441SEvalZero     else
253*10465441SEvalZero     {
254*10465441SEvalZero         rt_kprintf("Test error: block6 (5 bytes) allocate failed.\n");
255*10465441SEvalZero         goto __exit;
256*10465441SEvalZero     }
257*10465441SEvalZero 
258*10465441SEvalZero     rt_rbb_blk_put(blk6);
259*10465441SEvalZero     rt_kprintf("Block6 put success.\n");
260*10465441SEvalZero     rt_kprintf("Ring block buffer current status:\n");
261*10465441SEvalZero     rt_kprintf("next block queue length: %d\n", rt_rbb_next_blk_queue_len(rbb));
262*10465441SEvalZero     rt_kprintf("block list length: %d\n", rt_slist_len(&rbb->blk_list));
263*10465441SEvalZero     rt_kprintf("|<--- 5 ---->|< 1 >|<---- 8 ----->|<------- 16 -------->|<------ 18 ------>|<---- 4 ---->|\n");
264*10465441SEvalZero     rt_kprintf("+------------+-----+--------------+---------------------+------------------+-------------+\n");
265*10465441SEvalZero     rt_kprintf("|   block6   |empty|    block3    |       block4        |       block5     |   fragment  |\n");
266*10465441SEvalZero     rt_kprintf("+------------+-----+--------------+---------------------+------------------+-------------+\n");
267*10465441SEvalZero     rt_kprintf("|     put    |     |     put      |        put          |        put       |             |\n");
268*10465441SEvalZero 
269*10465441SEvalZero     /* get block queue */
270*10465441SEvalZero     rt_kprintf("\n====================== rbb block queue get test =====================\n");
271*10465441SEvalZero     req_size = rt_rbb_next_blk_queue_len(rbb) + 5;
272*10465441SEvalZero     size = rt_rbb_blk_queue_get(rbb, req_size, &blk_queue1);
273*10465441SEvalZero     i = j = k = 0;
274*10465441SEvalZero     for (; i < blk3->size; i++)
275*10465441SEvalZero     {
276*10465441SEvalZero         if (rt_rbb_blk_queue_buf(&blk_queue1)[i] != 3) break;
277*10465441SEvalZero     }
278*10465441SEvalZero     for (; j < blk4->size; j++)
279*10465441SEvalZero     {
280*10465441SEvalZero         if (rt_rbb_blk_queue_buf(&blk_queue1)[i + j] != 4) break;
281*10465441SEvalZero     }
282*10465441SEvalZero     for (; k < blk5->size; k++)
283*10465441SEvalZero     {
284*10465441SEvalZero         if (rt_rbb_blk_queue_buf(&blk_queue1)[i + j + k] != 5) break;
285*10465441SEvalZero     }
286*10465441SEvalZero     if (size && size == 42 && rt_rbb_blk_queue_len(&blk_queue1) == 42 && k == blk5->size)
287*10465441SEvalZero     {
288*10465441SEvalZero         rt_kprintf("Block queue (request %d bytes, actual %d) get success.\n", req_size, size);
289*10465441SEvalZero     }
290*10465441SEvalZero     else
291*10465441SEvalZero     {
292*10465441SEvalZero         rt_kprintf("Test error: Block queue (request %d bytes, actual %d) get failed.\n", req_size, size);
293*10465441SEvalZero         goto __exit;
294*10465441SEvalZero     }
295*10465441SEvalZero     rt_kprintf("Ring block buffer current status:\n");
296*10465441SEvalZero     rt_kprintf("next block queue length: %d\n", rt_rbb_next_blk_queue_len(rbb));
297*10465441SEvalZero     rt_kprintf("block list length: %d\n", rt_slist_len(&rbb->blk_list));
298*10465441SEvalZero     rt_kprintf("|            |     |<----- block queue1 (42 bytes continuous buffer) ----->|             |\n");
299*10465441SEvalZero     rt_kprintf("|<--- 5 ---->|< 1 >|<---- 8 ----->|<------- 16 -------->|<------ 18 ------>|<---- 4 ---->|\n");
300*10465441SEvalZero     rt_kprintf("+------------+-----+--------------+---------------------+------------------+-------------+\n");
301*10465441SEvalZero     rt_kprintf("|   block6   |empty|    block3    |       block4        |       block5     |   fragment  |\n");
302*10465441SEvalZero     rt_kprintf("+------------+-----+--------------+---------------------+------------------+-------------+\n");
303*10465441SEvalZero     rt_kprintf("|     put    |     |     get      |        get          |        get       |             |\n");
304*10465441SEvalZero 
305*10465441SEvalZero     /* free block queue */
306*10465441SEvalZero     rt_kprintf("\n====================== rbb block queue free test =====================\n");
307*10465441SEvalZero     rt_rbb_blk_queue_free(rbb, &blk_queue1);
308*10465441SEvalZero     rt_kprintf("Block queue1 free success.\n");
309*10465441SEvalZero     rt_kprintf("Ring block buffer current status:\n");
310*10465441SEvalZero     rt_kprintf("next block queue length: %d\n", rt_rbb_next_blk_queue_len(rbb));
311*10465441SEvalZero     rt_kprintf("block list length: %d\n", rt_slist_len(&rbb->blk_list));
312*10465441SEvalZero     rt_kprintf("|<--- 5 ---->|<--------------------------------- 47 ------------------------------------>|\n");
313*10465441SEvalZero     rt_kprintf("+------------+---------------------------------------------------------------------------+\n");
314*10465441SEvalZero     rt_kprintf("|   block6   |                                 empty                                     |\n");
315*10465441SEvalZero     rt_kprintf("+------------+---------------------------------------------------------------------------+\n");
316*10465441SEvalZero     rt_kprintf("|     put    |                                                                           |\n");
317*10465441SEvalZero     rt_rbb_blk_free(rbb, blk6);
318*10465441SEvalZero 
319*10465441SEvalZero     rt_kprintf("\n====================== rbb static test SUCCESS =====================\n");
320*10465441SEvalZero 
321*10465441SEvalZero     rt_kprintf("\n====================== rbb dynamic test =====================\n");
322*10465441SEvalZero 
323*10465441SEvalZero     thread = rt_thread_create("rbb_put", put_thread, rbb, 1024, 10, 25);
324*10465441SEvalZero     if (thread)
325*10465441SEvalZero     {
326*10465441SEvalZero         rt_thread_startup(thread);
327*10465441SEvalZero     }
328*10465441SEvalZero 
329*10465441SEvalZero     thread = rt_thread_create("rbb_get", get_thread, rbb, 1024, 10, 25);
330*10465441SEvalZero     if (thread)
331*10465441SEvalZero     {
332*10465441SEvalZero         rt_thread_startup(thread);
333*10465441SEvalZero     }
334*10465441SEvalZero 
335*10465441SEvalZero __exit :
336*10465441SEvalZero 
337*10465441SEvalZero     rt_rbb_destroy(rbb);
338*10465441SEvalZero }
339*10465441SEvalZero 
340*10465441SEvalZero MSH_CMD_EXPORT(rbb_test, run ring block buffer testcase)
341*10465441SEvalZero 
342