xref: /nrf52832-nimble/rt-thread/components/finsh/cmd.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero 
2*10465441SEvalZero /*
3*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
4*10465441SEvalZero  *
5*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
6*10465441SEvalZero  *
7*10465441SEvalZero  * Change Logs:
8*10465441SEvalZero  * Date           Author       Notes
9*10465441SEvalZero  * 2006-04-30     Bernard      first implementation
10*10465441SEvalZero  * 2006-05-04     Bernard      add list_thread,
11*10465441SEvalZero  *                                 list_sem,
12*10465441SEvalZero  *                                 list_timer
13*10465441SEvalZero  * 2006-05-20     Bernard      add list_mutex,
14*10465441SEvalZero  *                                 list_mailbox,
15*10465441SEvalZero  *                                 list_msgqueue,
16*10465441SEvalZero  *                                 list_event,
17*10465441SEvalZero  *                                 list_fevent,
18*10465441SEvalZero  *                                 list_mempool
19*10465441SEvalZero  * 2006-06-03     Bernard      display stack information in list_thread
20*10465441SEvalZero  * 2006-08-10     Bernard      change version to invoke rt_show_version
21*10465441SEvalZero  * 2008-09-10     Bernard      update the list function for finsh syscall
22*10465441SEvalZero  *                                 list and sysvar list
23*10465441SEvalZero  * 2009-05-30     Bernard      add list_device
24*10465441SEvalZero  * 2010-04-21     yi.qiu       add list_module
25*10465441SEvalZero  * 2012-04-29     goprife      improve the command line auto-complete feature.
26*10465441SEvalZero  * 2012-06-02     lgnq         add list_memheap
27*10465441SEvalZero  * 2012-10-22     Bernard      add MS VC++ patch.
28*10465441SEvalZero  * 2016-06-02     armink       beautify the list_thread command
29*10465441SEvalZero  * 2018-11-22     Jesven       list_thread add smp support
30*10465441SEvalZero  * 2018-12-27     Jesven       Fix the problem that disable interrupt too long in list_thread
31*10465441SEvalZero  *                             Provide protection for the "first layer of objects" when list_*
32*10465441SEvalZero  */
33*10465441SEvalZero 
34*10465441SEvalZero #include <rthw.h>
35*10465441SEvalZero #include <rtthread.h>
36*10465441SEvalZero 
37*10465441SEvalZero #ifdef RT_USING_FINSH
38*10465441SEvalZero 
39*10465441SEvalZero #include "finsh.h"
40*10465441SEvalZero 
41*10465441SEvalZero #define LIST_FIND_OBJ_NR 8
42*10465441SEvalZero 
hello(void)43*10465441SEvalZero long hello(void)
44*10465441SEvalZero {
45*10465441SEvalZero     rt_kprintf("Hello RT-Thread!\n");
46*10465441SEvalZero 
47*10465441SEvalZero     return 0;
48*10465441SEvalZero }
49*10465441SEvalZero FINSH_FUNCTION_EXPORT(hello, say hello world);
50*10465441SEvalZero 
51*10465441SEvalZero extern void rt_show_version(void);
version(void)52*10465441SEvalZero long version(void)
53*10465441SEvalZero {
54*10465441SEvalZero     rt_show_version();
55*10465441SEvalZero 
56*10465441SEvalZero     return 0;
57*10465441SEvalZero }
58*10465441SEvalZero FINSH_FUNCTION_EXPORT(version, show RT-Thread version information);
59*10465441SEvalZero MSH_CMD_EXPORT(version, show RT-Thread version information);
60*10465441SEvalZero 
object_split(int len)61*10465441SEvalZero rt_inline void object_split(int len)
62*10465441SEvalZero {
63*10465441SEvalZero     while (len--) rt_kprintf("-");
64*10465441SEvalZero }
65*10465441SEvalZero 
66*10465441SEvalZero typedef struct
67*10465441SEvalZero {
68*10465441SEvalZero     rt_list_t *list;
69*10465441SEvalZero     rt_list_t **array;
70*10465441SEvalZero     rt_uint8_t type;
71*10465441SEvalZero     int nr;             /* input: max nr, can't be 0 */
72*10465441SEvalZero     int nr_out;         /* out: got nr */
73*10465441SEvalZero } list_get_next_t;
74*10465441SEvalZero 
list_find_init(list_get_next_t * p,rt_uint8_t type,rt_list_t ** array,int nr)75*10465441SEvalZero static void list_find_init(list_get_next_t *p, rt_uint8_t type, rt_list_t **array, int nr)
76*10465441SEvalZero {
77*10465441SEvalZero     struct rt_object_information *info;
78*10465441SEvalZero     rt_list_t *list;
79*10465441SEvalZero 
80*10465441SEvalZero     info = rt_object_get_information((enum rt_object_class_type)type);
81*10465441SEvalZero     list = &info->object_list;
82*10465441SEvalZero 
83*10465441SEvalZero     p->list = list;
84*10465441SEvalZero     p->type = type;
85*10465441SEvalZero     p->array = array;
86*10465441SEvalZero     p->nr = nr;
87*10465441SEvalZero     p->nr_out = 0;
88*10465441SEvalZero }
89*10465441SEvalZero 
list_get_next(rt_list_t * current,list_get_next_t * arg)90*10465441SEvalZero static rt_list_t *list_get_next(rt_list_t *current, list_get_next_t *arg)
91*10465441SEvalZero {
92*10465441SEvalZero     int first_flag = 0;
93*10465441SEvalZero     rt_ubase_t level;
94*10465441SEvalZero     rt_list_t *node, *list;
95*10465441SEvalZero     rt_list_t **array;
96*10465441SEvalZero     int nr;
97*10465441SEvalZero 
98*10465441SEvalZero     arg->nr_out = 0;
99*10465441SEvalZero 
100*10465441SEvalZero     if (!arg->nr || !arg->type)
101*10465441SEvalZero     {
102*10465441SEvalZero         return (rt_list_t *)RT_NULL;
103*10465441SEvalZero     }
104*10465441SEvalZero 
105*10465441SEvalZero     list = arg->list;
106*10465441SEvalZero 
107*10465441SEvalZero     if (!current) /* find first */
108*10465441SEvalZero     {
109*10465441SEvalZero         node = list;
110*10465441SEvalZero         first_flag = 1;
111*10465441SEvalZero     }
112*10465441SEvalZero     else
113*10465441SEvalZero     {
114*10465441SEvalZero         node = current;
115*10465441SEvalZero     }
116*10465441SEvalZero 
117*10465441SEvalZero     level = rt_hw_interrupt_disable();
118*10465441SEvalZero 
119*10465441SEvalZero     if (!first_flag)
120*10465441SEvalZero     {
121*10465441SEvalZero         struct rt_object *obj;
122*10465441SEvalZero         /* The node in the list? */
123*10465441SEvalZero         obj = rt_list_entry(node, struct rt_object, list);
124*10465441SEvalZero         if ((obj->type & ~RT_Object_Class_Static) != arg->type)
125*10465441SEvalZero         {
126*10465441SEvalZero             rt_hw_interrupt_enable(level);
127*10465441SEvalZero             return (rt_list_t *)RT_NULL;
128*10465441SEvalZero         }
129*10465441SEvalZero     }
130*10465441SEvalZero 
131*10465441SEvalZero     nr = 0;
132*10465441SEvalZero     array = arg->array;
133*10465441SEvalZero     while (1)
134*10465441SEvalZero     {
135*10465441SEvalZero         node = node->next;
136*10465441SEvalZero 
137*10465441SEvalZero         if (node == list)
138*10465441SEvalZero         {
139*10465441SEvalZero             node = (rt_list_t *)RT_NULL;
140*10465441SEvalZero             break;
141*10465441SEvalZero         }
142*10465441SEvalZero         nr++;
143*10465441SEvalZero         *array++ = node;
144*10465441SEvalZero         if (nr == arg->nr)
145*10465441SEvalZero         {
146*10465441SEvalZero             break;
147*10465441SEvalZero         }
148*10465441SEvalZero     }
149*10465441SEvalZero 
150*10465441SEvalZero     rt_hw_interrupt_enable(level);
151*10465441SEvalZero     arg->nr_out = nr;
152*10465441SEvalZero     return node;
153*10465441SEvalZero }
154*10465441SEvalZero 
list_thread(void)155*10465441SEvalZero long list_thread(void)
156*10465441SEvalZero {
157*10465441SEvalZero     rt_ubase_t level;
158*10465441SEvalZero     list_get_next_t find_arg;
159*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
160*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
161*10465441SEvalZero     const char *item_title = "thread";
162*10465441SEvalZero     int maxlen;
163*10465441SEvalZero 
164*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_Thread, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
165*10465441SEvalZero 
166*10465441SEvalZero     maxlen = RT_NAME_MAX;
167*10465441SEvalZero 
168*10465441SEvalZero #ifdef RT_USING_SMP
169*10465441SEvalZero     rt_kprintf("%-*.s cpu pri  status      sp     stack size max used left tick  error\n", maxlen, item_title); object_split(maxlen);
170*10465441SEvalZero     rt_kprintf(     " --- ---  ------- ---------- ----------  ------  ---------- ---\n");
171*10465441SEvalZero #else
172*10465441SEvalZero     rt_kprintf("%-*.s pri  status      sp     stack size max used left tick  error\n", maxlen, item_title); object_split(maxlen);
173*10465441SEvalZero     rt_kprintf(     " ---  ------- ---------- ----------  ------  ---------- ---\n");
174*10465441SEvalZero #endif /*RT_USING_SMP*/
175*10465441SEvalZero 
176*10465441SEvalZero     do
177*10465441SEvalZero     {
178*10465441SEvalZero         next = list_get_next(next, &find_arg);
179*10465441SEvalZero         {
180*10465441SEvalZero             int i;
181*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
182*10465441SEvalZero             {
183*10465441SEvalZero                 struct rt_object *obj;
184*10465441SEvalZero                 struct rt_thread thread_info, *thread;
185*10465441SEvalZero 
186*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
187*10465441SEvalZero                 level = rt_hw_interrupt_disable();
188*10465441SEvalZero 
189*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
190*10465441SEvalZero                 {
191*10465441SEvalZero                     rt_hw_interrupt_enable(level);
192*10465441SEvalZero                     continue;
193*10465441SEvalZero                 }
194*10465441SEvalZero                 /* copy info */
195*10465441SEvalZero                 memcpy(&thread_info, obj, sizeof thread_info);
196*10465441SEvalZero                 rt_hw_interrupt_enable(level);
197*10465441SEvalZero 
198*10465441SEvalZero                 thread = (struct rt_thread*)obj;
199*10465441SEvalZero                 {
200*10465441SEvalZero                     rt_uint8_t stat;
201*10465441SEvalZero                     rt_uint8_t *ptr;
202*10465441SEvalZero 
203*10465441SEvalZero #ifdef RT_USING_SMP
204*10465441SEvalZero                     if (thread->oncpu != RT_CPU_DETACHED)
205*10465441SEvalZero                         rt_kprintf("%-*.*s %3d %3d ", maxlen, RT_NAME_MAX, thread->name, thread->oncpu, thread->current_priority);
206*10465441SEvalZero                     else
207*10465441SEvalZero                         rt_kprintf("%-*.*s N/A %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
208*10465441SEvalZero 
209*10465441SEvalZero #else
210*10465441SEvalZero                     rt_kprintf("%-*.*s %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
211*10465441SEvalZero #endif /*RT_USING_SMP*/
212*10465441SEvalZero                     stat = (thread->stat & RT_THREAD_STAT_MASK);
213*10465441SEvalZero                     if (stat == RT_THREAD_READY)        rt_kprintf(" ready  ");
214*10465441SEvalZero                     else if (stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
215*10465441SEvalZero                     else if (stat == RT_THREAD_INIT)    rt_kprintf(" init   ");
216*10465441SEvalZero                     else if (stat == RT_THREAD_CLOSE)   rt_kprintf(" close  ");
217*10465441SEvalZero                     else if (stat == RT_THREAD_RUNNING) rt_kprintf(" running");
218*10465441SEvalZero 
219*10465441SEvalZero #if defined(ARCH_CPU_STACK_GROWS_UPWARD)
220*10465441SEvalZero                     ptr = (rt_uint8_t *)thread->stack_addr + thread->stack_size - 1;
221*10465441SEvalZero                     while (*ptr == '#')ptr --;
222*10465441SEvalZero 
223*10465441SEvalZero                     rt_kprintf(" 0x%08x 0x%08x    %02d%%   0x%08x %03d\n",
224*10465441SEvalZero                             ((rt_ubase_t)thread->sp - (rt_ubase_t)thread->stack_addr),
225*10465441SEvalZero                             thread->stack_size,
226*10465441SEvalZero                             ((rt_ubase_t)ptr - (rt_ubase_t)thread->stack_addr) * 100 / thread->stack_size,
227*10465441SEvalZero                             thread->remaining_tick,
228*10465441SEvalZero                             thread->error);
229*10465441SEvalZero #else
230*10465441SEvalZero                     ptr = (rt_uint8_t *)thread->stack_addr;
231*10465441SEvalZero                     while (*ptr == '#')ptr ++;
232*10465441SEvalZero 
233*10465441SEvalZero                     rt_kprintf(" 0x%08x 0x%08x    %02d%%   0x%08x %03d\n",
234*10465441SEvalZero                             thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),
235*10465441SEvalZero                             thread->stack_size,
236*10465441SEvalZero                             (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100
237*10465441SEvalZero                             / thread->stack_size,
238*10465441SEvalZero                             thread->remaining_tick,
239*10465441SEvalZero                             thread->error);
240*10465441SEvalZero #endif
241*10465441SEvalZero                 }
242*10465441SEvalZero             }
243*10465441SEvalZero         }
244*10465441SEvalZero     }
245*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
246*10465441SEvalZero 
247*10465441SEvalZero     return 0;
248*10465441SEvalZero }
249*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_thread, list thread);
250*10465441SEvalZero MSH_CMD_EXPORT(list_thread, list thread);
251*10465441SEvalZero 
show_wait_queue(struct rt_list_node * list)252*10465441SEvalZero static void show_wait_queue(struct rt_list_node *list)
253*10465441SEvalZero {
254*10465441SEvalZero     struct rt_thread *thread;
255*10465441SEvalZero     struct rt_list_node *node;
256*10465441SEvalZero 
257*10465441SEvalZero     for (node = list->next; node != list; node = node->next)
258*10465441SEvalZero     {
259*10465441SEvalZero         thread = rt_list_entry(node, struct rt_thread, tlist);
260*10465441SEvalZero         rt_kprintf("%s", thread->name);
261*10465441SEvalZero 
262*10465441SEvalZero         if (node->next != list)
263*10465441SEvalZero             rt_kprintf("/");
264*10465441SEvalZero     }
265*10465441SEvalZero }
266*10465441SEvalZero 
267*10465441SEvalZero #ifdef RT_USING_SEMAPHORE
list_sem(void)268*10465441SEvalZero long list_sem(void)
269*10465441SEvalZero {
270*10465441SEvalZero     rt_ubase_t level;
271*10465441SEvalZero     list_get_next_t find_arg;
272*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
273*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
274*10465441SEvalZero 
275*10465441SEvalZero     int maxlen;
276*10465441SEvalZero     const char *item_title = "semaphore";
277*10465441SEvalZero 
278*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_Semaphore, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
279*10465441SEvalZero 
280*10465441SEvalZero     maxlen = RT_NAME_MAX;
281*10465441SEvalZero 
282*10465441SEvalZero     rt_kprintf("%-*.s v   suspend thread\n", maxlen, item_title); object_split(maxlen);
283*10465441SEvalZero     rt_kprintf(     " --- --------------\n");
284*10465441SEvalZero 
285*10465441SEvalZero     do
286*10465441SEvalZero     {
287*10465441SEvalZero         next = list_get_next(next, &find_arg);
288*10465441SEvalZero         {
289*10465441SEvalZero             int i;
290*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
291*10465441SEvalZero             {
292*10465441SEvalZero                 struct rt_object *obj;
293*10465441SEvalZero                 struct rt_semaphore *sem;
294*10465441SEvalZero 
295*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
296*10465441SEvalZero                 level = rt_hw_interrupt_disable();
297*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
298*10465441SEvalZero                 {
299*10465441SEvalZero                     rt_hw_interrupt_enable(level);
300*10465441SEvalZero                     continue;
301*10465441SEvalZero                 }
302*10465441SEvalZero                 rt_hw_interrupt_enable(level);
303*10465441SEvalZero 
304*10465441SEvalZero                 sem = (struct rt_semaphore*)obj;
305*10465441SEvalZero                 if (!rt_list_isempty(&sem->parent.suspend_thread))
306*10465441SEvalZero                 {
307*10465441SEvalZero                     rt_kprintf("%-*.*s %03d %d:",
308*10465441SEvalZero                             maxlen, RT_NAME_MAX,
309*10465441SEvalZero                             sem->parent.parent.name,
310*10465441SEvalZero                             sem->value,
311*10465441SEvalZero                             rt_list_len(&sem->parent.suspend_thread));
312*10465441SEvalZero                     show_wait_queue(&(sem->parent.suspend_thread));
313*10465441SEvalZero                     rt_kprintf("\n");
314*10465441SEvalZero                 }
315*10465441SEvalZero                 else
316*10465441SEvalZero                 {
317*10465441SEvalZero                     rt_kprintf("%-*.*s %03d %d\n",
318*10465441SEvalZero                             maxlen, RT_NAME_MAX,
319*10465441SEvalZero                             sem->parent.parent.name,
320*10465441SEvalZero                             sem->value,
321*10465441SEvalZero                             rt_list_len(&sem->parent.suspend_thread));
322*10465441SEvalZero                 }
323*10465441SEvalZero             }
324*10465441SEvalZero         }
325*10465441SEvalZero     }
326*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
327*10465441SEvalZero 
328*10465441SEvalZero     return 0;
329*10465441SEvalZero }
330*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_sem, list semaphore in system);
331*10465441SEvalZero MSH_CMD_EXPORT(list_sem, list semaphore in system);
332*10465441SEvalZero #endif
333*10465441SEvalZero 
334*10465441SEvalZero #ifdef RT_USING_EVENT
list_event(void)335*10465441SEvalZero long list_event(void)
336*10465441SEvalZero {
337*10465441SEvalZero     rt_ubase_t level;
338*10465441SEvalZero     list_get_next_t find_arg;
339*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
340*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
341*10465441SEvalZero 
342*10465441SEvalZero     int maxlen;
343*10465441SEvalZero     const char *item_title = "event";
344*10465441SEvalZero 
345*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_Event, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
346*10465441SEvalZero 
347*10465441SEvalZero     maxlen = RT_NAME_MAX;
348*10465441SEvalZero 
349*10465441SEvalZero     rt_kprintf("%-*.s      set    suspend thread\n", maxlen, item_title); object_split(maxlen);
350*10465441SEvalZero     rt_kprintf(     "  ---------- --------------\n");
351*10465441SEvalZero 
352*10465441SEvalZero     do
353*10465441SEvalZero     {
354*10465441SEvalZero         next = list_get_next(next, &find_arg);
355*10465441SEvalZero         {
356*10465441SEvalZero             int i;
357*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
358*10465441SEvalZero             {
359*10465441SEvalZero                 struct rt_object *obj;
360*10465441SEvalZero                 struct rt_event *e;
361*10465441SEvalZero 
362*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
363*10465441SEvalZero                 level = rt_hw_interrupt_disable();
364*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
365*10465441SEvalZero                 {
366*10465441SEvalZero                     rt_hw_interrupt_enable(level);
367*10465441SEvalZero                     continue;
368*10465441SEvalZero                 }
369*10465441SEvalZero 
370*10465441SEvalZero                 rt_hw_interrupt_enable(level);
371*10465441SEvalZero 
372*10465441SEvalZero                 e = (struct rt_event *)obj;
373*10465441SEvalZero                 if (!rt_list_isempty(&e->parent.suspend_thread))
374*10465441SEvalZero                 {
375*10465441SEvalZero                     rt_kprintf("%-*.*s  0x%08x %03d:",
376*10465441SEvalZero                             maxlen, RT_NAME_MAX,
377*10465441SEvalZero                             e->parent.parent.name,
378*10465441SEvalZero                             e->set,
379*10465441SEvalZero                             rt_list_len(&e->parent.suspend_thread));
380*10465441SEvalZero                     show_wait_queue(&(e->parent.suspend_thread));
381*10465441SEvalZero                     rt_kprintf("\n");
382*10465441SEvalZero                 }
383*10465441SEvalZero                 else
384*10465441SEvalZero                 {
385*10465441SEvalZero                     rt_kprintf("%-*.*s  0x%08x 0\n",
386*10465441SEvalZero                             maxlen, RT_NAME_MAX, e->parent.parent.name, e->set);
387*10465441SEvalZero                 }
388*10465441SEvalZero             }
389*10465441SEvalZero         }
390*10465441SEvalZero     }
391*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
392*10465441SEvalZero 
393*10465441SEvalZero     return 0;
394*10465441SEvalZero }
395*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_event, list event in system);
396*10465441SEvalZero MSH_CMD_EXPORT(list_event, list event in system);
397*10465441SEvalZero #endif
398*10465441SEvalZero 
399*10465441SEvalZero #ifdef RT_USING_MUTEX
list_mutex(void)400*10465441SEvalZero long list_mutex(void)
401*10465441SEvalZero {
402*10465441SEvalZero     rt_ubase_t level;
403*10465441SEvalZero     list_get_next_t find_arg;
404*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
405*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
406*10465441SEvalZero 
407*10465441SEvalZero     int maxlen;
408*10465441SEvalZero     const char *item_title = "mutex";
409*10465441SEvalZero 
410*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_Mutex, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
411*10465441SEvalZero 
412*10465441SEvalZero     maxlen = RT_NAME_MAX;
413*10465441SEvalZero 
414*10465441SEvalZero     rt_kprintf("%-*.s   owner  hold suspend thread\n", maxlen, item_title); object_split(maxlen);
415*10465441SEvalZero     rt_kprintf(     " -------- ---- --------------\n");
416*10465441SEvalZero 
417*10465441SEvalZero     do
418*10465441SEvalZero     {
419*10465441SEvalZero         next = list_get_next(next, &find_arg);
420*10465441SEvalZero         {
421*10465441SEvalZero             int i;
422*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
423*10465441SEvalZero             {
424*10465441SEvalZero                 struct rt_object *obj;
425*10465441SEvalZero                 struct rt_mutex *m;
426*10465441SEvalZero 
427*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
428*10465441SEvalZero                 level = rt_hw_interrupt_disable();
429*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
430*10465441SEvalZero                 {
431*10465441SEvalZero                     rt_hw_interrupt_enable(level);
432*10465441SEvalZero                     continue;
433*10465441SEvalZero                 }
434*10465441SEvalZero 
435*10465441SEvalZero                 rt_hw_interrupt_enable(level);
436*10465441SEvalZero 
437*10465441SEvalZero                 m = (struct rt_mutex *)obj;
438*10465441SEvalZero                 rt_kprintf("%-*.*s %-8.*s %04d %d\n",
439*10465441SEvalZero                         maxlen, RT_NAME_MAX,
440*10465441SEvalZero                         m->parent.parent.name,
441*10465441SEvalZero                         RT_NAME_MAX,
442*10465441SEvalZero                         m->owner->name,
443*10465441SEvalZero                         m->hold,
444*10465441SEvalZero                         rt_list_len(&m->parent.suspend_thread));
445*10465441SEvalZero 
446*10465441SEvalZero             }
447*10465441SEvalZero         }
448*10465441SEvalZero     }
449*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
450*10465441SEvalZero 
451*10465441SEvalZero     return 0;
452*10465441SEvalZero }
453*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_mutex, list mutex in system);
454*10465441SEvalZero MSH_CMD_EXPORT(list_mutex, list mutex in system);
455*10465441SEvalZero #endif
456*10465441SEvalZero 
457*10465441SEvalZero #ifdef RT_USING_MAILBOX
list_mailbox(void)458*10465441SEvalZero long list_mailbox(void)
459*10465441SEvalZero {
460*10465441SEvalZero     rt_ubase_t level;
461*10465441SEvalZero     list_get_next_t find_arg;
462*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
463*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
464*10465441SEvalZero 
465*10465441SEvalZero     int maxlen;
466*10465441SEvalZero     const char *item_title = "mailbox";
467*10465441SEvalZero 
468*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_MailBox, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
469*10465441SEvalZero 
470*10465441SEvalZero     maxlen = RT_NAME_MAX;
471*10465441SEvalZero 
472*10465441SEvalZero     rt_kprintf("%-*.s entry size suspend thread\n", maxlen, item_title); object_split(maxlen);
473*10465441SEvalZero     rt_kprintf(     " ----  ---- --------------\n");
474*10465441SEvalZero 
475*10465441SEvalZero     do
476*10465441SEvalZero     {
477*10465441SEvalZero         next = list_get_next(next, &find_arg);
478*10465441SEvalZero         {
479*10465441SEvalZero             int i;
480*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
481*10465441SEvalZero             {
482*10465441SEvalZero                 struct rt_object *obj;
483*10465441SEvalZero                 struct rt_mailbox *m;
484*10465441SEvalZero 
485*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
486*10465441SEvalZero                 level = rt_hw_interrupt_disable();
487*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
488*10465441SEvalZero                 {
489*10465441SEvalZero                     rt_hw_interrupt_enable(level);
490*10465441SEvalZero                     continue;
491*10465441SEvalZero                 }
492*10465441SEvalZero 
493*10465441SEvalZero                 rt_hw_interrupt_enable(level);
494*10465441SEvalZero 
495*10465441SEvalZero                 m = (struct rt_mailbox *)obj;
496*10465441SEvalZero                 if (!rt_list_isempty(&m->parent.suspend_thread))
497*10465441SEvalZero                 {
498*10465441SEvalZero                     rt_kprintf("%-*.*s %04d  %04d %d:",
499*10465441SEvalZero                             maxlen, RT_NAME_MAX,
500*10465441SEvalZero                             m->parent.parent.name,
501*10465441SEvalZero                             m->entry,
502*10465441SEvalZero                             m->size,
503*10465441SEvalZero                             rt_list_len(&m->parent.suspend_thread));
504*10465441SEvalZero                     show_wait_queue(&(m->parent.suspend_thread));
505*10465441SEvalZero                     rt_kprintf("\n");
506*10465441SEvalZero                 }
507*10465441SEvalZero                 else
508*10465441SEvalZero                 {
509*10465441SEvalZero                     rt_kprintf("%-*.*s %04d  %04d %d\n",
510*10465441SEvalZero                             maxlen, RT_NAME_MAX,
511*10465441SEvalZero                             m->parent.parent.name,
512*10465441SEvalZero                             m->entry,
513*10465441SEvalZero                             m->size,
514*10465441SEvalZero                             rt_list_len(&m->parent.suspend_thread));
515*10465441SEvalZero                 }
516*10465441SEvalZero 
517*10465441SEvalZero             }
518*10465441SEvalZero         }
519*10465441SEvalZero     }
520*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
521*10465441SEvalZero 
522*10465441SEvalZero     return 0;
523*10465441SEvalZero }
524*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_mailbox, list mail box in system);
525*10465441SEvalZero MSH_CMD_EXPORT(list_mailbox, list mail box in system);
526*10465441SEvalZero #endif
527*10465441SEvalZero 
528*10465441SEvalZero #ifdef RT_USING_MESSAGEQUEUE
list_msgqueue(void)529*10465441SEvalZero long list_msgqueue(void)
530*10465441SEvalZero {
531*10465441SEvalZero     rt_ubase_t level;
532*10465441SEvalZero     list_get_next_t find_arg;
533*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
534*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
535*10465441SEvalZero 
536*10465441SEvalZero     int maxlen;
537*10465441SEvalZero     const char *item_title = "msgqueue";
538*10465441SEvalZero 
539*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_MessageQueue, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
540*10465441SEvalZero 
541*10465441SEvalZero     maxlen = RT_NAME_MAX;
542*10465441SEvalZero 
543*10465441SEvalZero     rt_kprintf("%-*.s entry suspend thread\n", maxlen, item_title); object_split(maxlen);
544*10465441SEvalZero     rt_kprintf(     " ----  --------------\n");
545*10465441SEvalZero     do
546*10465441SEvalZero     {
547*10465441SEvalZero         next = list_get_next(next, &find_arg);
548*10465441SEvalZero         {
549*10465441SEvalZero             int i;
550*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
551*10465441SEvalZero             {
552*10465441SEvalZero                 struct rt_object *obj;
553*10465441SEvalZero                 struct rt_messagequeue *m;
554*10465441SEvalZero 
555*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
556*10465441SEvalZero                 level = rt_hw_interrupt_disable();
557*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
558*10465441SEvalZero                 {
559*10465441SEvalZero                     rt_hw_interrupt_enable(level);
560*10465441SEvalZero                     continue;
561*10465441SEvalZero                 }
562*10465441SEvalZero 
563*10465441SEvalZero                 rt_hw_interrupt_enable(level);
564*10465441SEvalZero 
565*10465441SEvalZero                 m = (struct rt_messagequeue *)obj;
566*10465441SEvalZero                 if (!rt_list_isempty(&m->parent.suspend_thread))
567*10465441SEvalZero                 {
568*10465441SEvalZero                     rt_kprintf("%-*.*s %04d  %d:",
569*10465441SEvalZero                             maxlen, RT_NAME_MAX,
570*10465441SEvalZero                             m->parent.parent.name,
571*10465441SEvalZero                             m->entry,
572*10465441SEvalZero                             rt_list_len(&m->parent.suspend_thread));
573*10465441SEvalZero                     show_wait_queue(&(m->parent.suspend_thread));
574*10465441SEvalZero                     rt_kprintf("\n");
575*10465441SEvalZero                 }
576*10465441SEvalZero                 else
577*10465441SEvalZero                 {
578*10465441SEvalZero                     rt_kprintf("%-*.*s %04d  %d\n",
579*10465441SEvalZero                             maxlen, RT_NAME_MAX,
580*10465441SEvalZero                             m->parent.parent.name,
581*10465441SEvalZero                             m->entry,
582*10465441SEvalZero                             rt_list_len(&m->parent.suspend_thread));
583*10465441SEvalZero                 }
584*10465441SEvalZero             }
585*10465441SEvalZero         }
586*10465441SEvalZero     }
587*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
588*10465441SEvalZero 
589*10465441SEvalZero     return 0;
590*10465441SEvalZero }
591*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_msgqueue, list message queue in system);
592*10465441SEvalZero MSH_CMD_EXPORT(list_msgqueue, list message queue in system);
593*10465441SEvalZero #endif
594*10465441SEvalZero 
595*10465441SEvalZero #ifdef RT_USING_MEMHEAP
list_memheap(void)596*10465441SEvalZero long list_memheap(void)
597*10465441SEvalZero {
598*10465441SEvalZero     rt_ubase_t level;
599*10465441SEvalZero     list_get_next_t find_arg;
600*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
601*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
602*10465441SEvalZero 
603*10465441SEvalZero     int maxlen;
604*10465441SEvalZero     const char *item_title = "memheap";
605*10465441SEvalZero 
606*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_MemHeap, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
607*10465441SEvalZero 
608*10465441SEvalZero     maxlen = RT_NAME_MAX;
609*10465441SEvalZero 
610*10465441SEvalZero     rt_kprintf("%-*.s  pool size  max used size available size\n", maxlen, item_title); object_split(maxlen);
611*10465441SEvalZero     rt_kprintf(      " ---------- ------------- --------------\n");
612*10465441SEvalZero     do
613*10465441SEvalZero     {
614*10465441SEvalZero         next = list_get_next(next, &find_arg);
615*10465441SEvalZero         {
616*10465441SEvalZero             int i;
617*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
618*10465441SEvalZero             {
619*10465441SEvalZero                 struct rt_object *obj;
620*10465441SEvalZero                 struct rt_memheap *mh;
621*10465441SEvalZero 
622*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
623*10465441SEvalZero                 level = rt_hw_interrupt_disable();
624*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
625*10465441SEvalZero                 {
626*10465441SEvalZero                     rt_hw_interrupt_enable(level);
627*10465441SEvalZero                     continue;
628*10465441SEvalZero                 }
629*10465441SEvalZero 
630*10465441SEvalZero                 rt_hw_interrupt_enable(level);
631*10465441SEvalZero 
632*10465441SEvalZero                 mh = (struct rt_memheap *)obj;
633*10465441SEvalZero 
634*10465441SEvalZero                 rt_kprintf("%-*.*s %-010d %-013d %-05d\n",
635*10465441SEvalZero                         maxlen, RT_NAME_MAX,
636*10465441SEvalZero                         mh->parent.name,
637*10465441SEvalZero                         mh->pool_size,
638*10465441SEvalZero                         mh->max_used_size,
639*10465441SEvalZero                         mh->available_size);
640*10465441SEvalZero 
641*10465441SEvalZero             }
642*10465441SEvalZero         }
643*10465441SEvalZero     }
644*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
645*10465441SEvalZero 
646*10465441SEvalZero     return 0;
647*10465441SEvalZero }
648*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_memheap, list memory heap in system);
649*10465441SEvalZero MSH_CMD_EXPORT(list_memheap, list memory heap in system);
650*10465441SEvalZero #endif
651*10465441SEvalZero 
652*10465441SEvalZero #ifdef RT_USING_MEMPOOL
list_mempool(void)653*10465441SEvalZero long list_mempool(void)
654*10465441SEvalZero {
655*10465441SEvalZero     rt_ubase_t level;
656*10465441SEvalZero     list_get_next_t find_arg;
657*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
658*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
659*10465441SEvalZero 
660*10465441SEvalZero     int maxlen;
661*10465441SEvalZero     const char *item_title = "mempool";
662*10465441SEvalZero 
663*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_MemPool, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
664*10465441SEvalZero 
665*10465441SEvalZero     maxlen = RT_NAME_MAX;
666*10465441SEvalZero 
667*10465441SEvalZero     rt_kprintf("%-*.s block total free suspend thread\n", maxlen, item_title); object_split(maxlen);
668*10465441SEvalZero     rt_kprintf(     " ----  ----  ---- --------------\n");
669*10465441SEvalZero     do
670*10465441SEvalZero     {
671*10465441SEvalZero         next = list_get_next(next, &find_arg);
672*10465441SEvalZero         {
673*10465441SEvalZero             int i;
674*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
675*10465441SEvalZero             {
676*10465441SEvalZero                 struct rt_object *obj;
677*10465441SEvalZero                 struct rt_mempool *mp;
678*10465441SEvalZero 
679*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
680*10465441SEvalZero                 level = rt_hw_interrupt_disable();
681*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
682*10465441SEvalZero                 {
683*10465441SEvalZero                     rt_hw_interrupt_enable(level);
684*10465441SEvalZero                     continue;
685*10465441SEvalZero                 }
686*10465441SEvalZero 
687*10465441SEvalZero                 rt_hw_interrupt_enable(level);
688*10465441SEvalZero 
689*10465441SEvalZero                 mp = (struct rt_mempool *)obj;
690*10465441SEvalZero                 if (mp->suspend_thread_count > 0)
691*10465441SEvalZero                 {
692*10465441SEvalZero                     rt_kprintf("%-*.*s %04d  %04d  %04d %d:",
693*10465441SEvalZero                             maxlen, RT_NAME_MAX,
694*10465441SEvalZero                             mp->parent.name,
695*10465441SEvalZero                             mp->block_size,
696*10465441SEvalZero                             mp->block_total_count,
697*10465441SEvalZero                             mp->block_free_count,
698*10465441SEvalZero                             mp->suspend_thread_count);
699*10465441SEvalZero                     show_wait_queue(&(mp->suspend_thread));
700*10465441SEvalZero                     rt_kprintf("\n");
701*10465441SEvalZero                 }
702*10465441SEvalZero                 else
703*10465441SEvalZero                 {
704*10465441SEvalZero                     rt_kprintf("%-*.*s %04d  %04d  %04d %d\n",
705*10465441SEvalZero                             maxlen, RT_NAME_MAX,
706*10465441SEvalZero                             mp->parent.name,
707*10465441SEvalZero                             mp->block_size,
708*10465441SEvalZero                             mp->block_total_count,
709*10465441SEvalZero                             mp->block_free_count,
710*10465441SEvalZero                             mp->suspend_thread_count);
711*10465441SEvalZero                 }
712*10465441SEvalZero             }
713*10465441SEvalZero         }
714*10465441SEvalZero     }
715*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
716*10465441SEvalZero 
717*10465441SEvalZero     return 0;
718*10465441SEvalZero }
719*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_mempool, list memory pool in system)
720*10465441SEvalZero MSH_CMD_EXPORT(list_mempool, list memory pool in system);
721*10465441SEvalZero #endif
722*10465441SEvalZero 
list_timer(void)723*10465441SEvalZero long list_timer(void)
724*10465441SEvalZero {
725*10465441SEvalZero     rt_ubase_t level;
726*10465441SEvalZero     list_get_next_t find_arg;
727*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
728*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
729*10465441SEvalZero 
730*10465441SEvalZero     int maxlen;
731*10465441SEvalZero     const char *item_title = "timer";
732*10465441SEvalZero 
733*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_Timer, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
734*10465441SEvalZero 
735*10465441SEvalZero     maxlen = RT_NAME_MAX;
736*10465441SEvalZero 
737*10465441SEvalZero     rt_kprintf("%-*.s  periodic   timeout       flag\n", maxlen, item_title); object_split(maxlen);
738*10465441SEvalZero     rt_kprintf(     " ---------- ---------- -----------\n");
739*10465441SEvalZero     do {
740*10465441SEvalZero         next = list_get_next(next, &find_arg);
741*10465441SEvalZero         {
742*10465441SEvalZero             int i;
743*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
744*10465441SEvalZero             {
745*10465441SEvalZero                 struct rt_object *obj;
746*10465441SEvalZero                 struct rt_timer *timer;
747*10465441SEvalZero 
748*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
749*10465441SEvalZero                 level = rt_hw_interrupt_disable();
750*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
751*10465441SEvalZero                 {
752*10465441SEvalZero                     rt_hw_interrupt_enable(level);
753*10465441SEvalZero                     continue;
754*10465441SEvalZero                 }
755*10465441SEvalZero 
756*10465441SEvalZero                 rt_hw_interrupt_enable(level);
757*10465441SEvalZero 
758*10465441SEvalZero                 timer = (struct rt_timer *)obj;
759*10465441SEvalZero                 rt_kprintf("%-*.*s 0x%08x 0x%08x ",
760*10465441SEvalZero                         maxlen, RT_NAME_MAX,
761*10465441SEvalZero                         timer->parent.name,
762*10465441SEvalZero                         timer->init_tick,
763*10465441SEvalZero                         timer->timeout_tick);
764*10465441SEvalZero                 if (timer->parent.flag & RT_TIMER_FLAG_ACTIVATED)
765*10465441SEvalZero                     rt_kprintf("activated\n");
766*10465441SEvalZero                 else
767*10465441SEvalZero                     rt_kprintf("deactivated\n");
768*10465441SEvalZero 
769*10465441SEvalZero             }
770*10465441SEvalZero         }
771*10465441SEvalZero     }
772*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
773*10465441SEvalZero 
774*10465441SEvalZero     rt_kprintf("current tick:0x%08x\n", rt_tick_get());
775*10465441SEvalZero 
776*10465441SEvalZero     return 0;
777*10465441SEvalZero }
778*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_timer, list timer in system);
779*10465441SEvalZero MSH_CMD_EXPORT(list_timer, list timer in system);
780*10465441SEvalZero 
781*10465441SEvalZero #ifdef RT_USING_DEVICE
782*10465441SEvalZero static char *const device_type_str[] =
783*10465441SEvalZero {
784*10465441SEvalZero     "Character Device",
785*10465441SEvalZero     "Block Device",
786*10465441SEvalZero     "Network Interface",
787*10465441SEvalZero     "MTD Device",
788*10465441SEvalZero     "CAN Device",
789*10465441SEvalZero     "RTC",
790*10465441SEvalZero     "Sound Device",
791*10465441SEvalZero     "Graphic Device",
792*10465441SEvalZero     "I2C Bus",
793*10465441SEvalZero     "USB Slave Device",
794*10465441SEvalZero     "USB Host Bus",
795*10465441SEvalZero     "SPI Bus",
796*10465441SEvalZero     "SPI Device",
797*10465441SEvalZero     "SDIO Bus",
798*10465441SEvalZero     "PM Pseudo Device",
799*10465441SEvalZero     "Pipe",
800*10465441SEvalZero     "Portal Device",
801*10465441SEvalZero     "Timer Device",
802*10465441SEvalZero     "Miscellaneous Device",
803*10465441SEvalZero     "Unknown"
804*10465441SEvalZero };
805*10465441SEvalZero 
list_device(void)806*10465441SEvalZero long list_device(void)
807*10465441SEvalZero {
808*10465441SEvalZero     rt_ubase_t level;
809*10465441SEvalZero     list_get_next_t find_arg;
810*10465441SEvalZero     rt_list_t *obj_list[LIST_FIND_OBJ_NR];
811*10465441SEvalZero     rt_list_t *next = (rt_list_t*)RT_NULL;
812*10465441SEvalZero 
813*10465441SEvalZero     int maxlen;
814*10465441SEvalZero     const char *item_title = "device";
815*10465441SEvalZero 
816*10465441SEvalZero     list_find_init(&find_arg, RT_Object_Class_Device, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
817*10465441SEvalZero 
818*10465441SEvalZero     maxlen = RT_NAME_MAX;
819*10465441SEvalZero 
820*10465441SEvalZero     rt_kprintf("%-*.s         type         ref count\n", maxlen, item_title); object_split(maxlen);
821*10465441SEvalZero     rt_kprintf(     " -------------------- ----------\n");
822*10465441SEvalZero     do
823*10465441SEvalZero     {
824*10465441SEvalZero         next = list_get_next(next, &find_arg);
825*10465441SEvalZero         {
826*10465441SEvalZero             int i;
827*10465441SEvalZero             for (i = 0; i < find_arg.nr_out; i++)
828*10465441SEvalZero             {
829*10465441SEvalZero                 struct rt_object *obj;
830*10465441SEvalZero                 struct rt_device *device;
831*10465441SEvalZero 
832*10465441SEvalZero                 obj = rt_list_entry(obj_list[i], struct rt_object, list);
833*10465441SEvalZero                 level = rt_hw_interrupt_disable();
834*10465441SEvalZero                 if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
835*10465441SEvalZero                 {
836*10465441SEvalZero                     rt_hw_interrupt_enable(level);
837*10465441SEvalZero                     continue;
838*10465441SEvalZero                 }
839*10465441SEvalZero 
840*10465441SEvalZero                 rt_hw_interrupt_enable(level);
841*10465441SEvalZero 
842*10465441SEvalZero                 device = (struct rt_device *)obj;
843*10465441SEvalZero                 rt_kprintf("%-*.*s %-20s %-8d\n",
844*10465441SEvalZero                         maxlen, RT_NAME_MAX,
845*10465441SEvalZero                         device->parent.name,
846*10465441SEvalZero                         (device->type <= RT_Device_Class_Unknown) ?
847*10465441SEvalZero                         device_type_str[device->type] :
848*10465441SEvalZero                         device_type_str[RT_Device_Class_Unknown],
849*10465441SEvalZero                         device->ref_count);
850*10465441SEvalZero 
851*10465441SEvalZero             }
852*10465441SEvalZero         }
853*10465441SEvalZero     }
854*10465441SEvalZero     while (next != (rt_list_t*)RT_NULL);
855*10465441SEvalZero 
856*10465441SEvalZero     return 0;
857*10465441SEvalZero }
858*10465441SEvalZero FINSH_FUNCTION_EXPORT(list_device, list device in system);
859*10465441SEvalZero MSH_CMD_EXPORT(list_device, list device in system);
860*10465441SEvalZero #endif
861*10465441SEvalZero 
list(void)862*10465441SEvalZero long list(void)
863*10465441SEvalZero {
864*10465441SEvalZero #ifndef FINSH_USING_MSH_ONLY
865*10465441SEvalZero     struct finsh_syscall_item *syscall_item;
866*10465441SEvalZero     struct finsh_sysvar_item *sysvar_item;
867*10465441SEvalZero #endif
868*10465441SEvalZero 
869*10465441SEvalZero     rt_kprintf("--Function List:\n");
870*10465441SEvalZero     {
871*10465441SEvalZero         struct finsh_syscall *index;
872*10465441SEvalZero         for (index = _syscall_table_begin;
873*10465441SEvalZero                 index < _syscall_table_end;
874*10465441SEvalZero                 FINSH_NEXT_SYSCALL(index))
875*10465441SEvalZero         {
876*10465441SEvalZero             /* skip the internal command */
877*10465441SEvalZero             if (strncmp((char *)index->name, "__", 2) == 0) continue;
878*10465441SEvalZero 
879*10465441SEvalZero #ifdef FINSH_USING_DESCRIPTION
880*10465441SEvalZero             rt_kprintf("%-16s -- %s\n", index->name, index->desc);
881*10465441SEvalZero #else
882*10465441SEvalZero             rt_kprintf("%s\n", index->name);
883*10465441SEvalZero #endif
884*10465441SEvalZero         }
885*10465441SEvalZero     }
886*10465441SEvalZero 
887*10465441SEvalZero #ifndef FINSH_USING_MSH_ONLY
888*10465441SEvalZero     /* list syscall list */
889*10465441SEvalZero     syscall_item = global_syscall_list;
890*10465441SEvalZero     while (syscall_item != NULL)
891*10465441SEvalZero     {
892*10465441SEvalZero         rt_kprintf("[l] %s\n", syscall_item->syscall.name);
893*10465441SEvalZero         syscall_item = syscall_item->next;
894*10465441SEvalZero     }
895*10465441SEvalZero 
896*10465441SEvalZero     rt_kprintf("--Variable List:\n");
897*10465441SEvalZero     {
898*10465441SEvalZero         struct finsh_sysvar *index;
899*10465441SEvalZero         for (index = _sysvar_table_begin;
900*10465441SEvalZero                 index < _sysvar_table_end;
901*10465441SEvalZero                 FINSH_NEXT_SYSVAR(index))
902*10465441SEvalZero         {
903*10465441SEvalZero #ifdef FINSH_USING_DESCRIPTION
904*10465441SEvalZero             rt_kprintf("%-16s -- %s\n", index->name, index->desc);
905*10465441SEvalZero #else
906*10465441SEvalZero             rt_kprintf("%s\n", index->name);
907*10465441SEvalZero #endif
908*10465441SEvalZero         }
909*10465441SEvalZero     }
910*10465441SEvalZero 
911*10465441SEvalZero     sysvar_item = global_sysvar_list;
912*10465441SEvalZero     while (sysvar_item != NULL)
913*10465441SEvalZero     {
914*10465441SEvalZero         rt_kprintf("[l] %s\n", sysvar_item->sysvar.name);
915*10465441SEvalZero         sysvar_item = sysvar_item->next;
916*10465441SEvalZero     }
917*10465441SEvalZero #endif
918*10465441SEvalZero 
919*10465441SEvalZero     return 0;
920*10465441SEvalZero }
FINSH_FUNCTION_EXPORT(list,list all symbol in system)921*10465441SEvalZero FINSH_FUNCTION_EXPORT(list, list all symbol in system)
922*10465441SEvalZero 
923*10465441SEvalZero #ifndef FINSH_USING_MSH_ONLY
924*10465441SEvalZero static int str_is_prefix(const char *prefix, const char *str)
925*10465441SEvalZero {
926*10465441SEvalZero     while ((*prefix) && (*prefix == *str))
927*10465441SEvalZero     {
928*10465441SEvalZero         prefix ++;
929*10465441SEvalZero         str ++;
930*10465441SEvalZero     }
931*10465441SEvalZero 
932*10465441SEvalZero     if (*prefix == 0)
933*10465441SEvalZero         return 0;
934*10465441SEvalZero 
935*10465441SEvalZero     return -1;
936*10465441SEvalZero }
937*10465441SEvalZero 
str_common(const char * str1,const char * str2)938*10465441SEvalZero static int str_common(const char *str1, const char *str2)
939*10465441SEvalZero {
940*10465441SEvalZero     const char *str = str1;
941*10465441SEvalZero 
942*10465441SEvalZero     while ((*str != 0) && (*str2 != 0) && (*str == *str2))
943*10465441SEvalZero     {
944*10465441SEvalZero         str ++;
945*10465441SEvalZero         str2 ++;
946*10465441SEvalZero     }
947*10465441SEvalZero 
948*10465441SEvalZero     return (str - str1);
949*10465441SEvalZero }
950*10465441SEvalZero 
list_prefix(char * prefix)951*10465441SEvalZero void list_prefix(char *prefix)
952*10465441SEvalZero {
953*10465441SEvalZero     struct finsh_syscall_item *syscall_item;
954*10465441SEvalZero     struct finsh_sysvar_item *sysvar_item;
955*10465441SEvalZero     rt_uint16_t func_cnt, var_cnt;
956*10465441SEvalZero     int length, min_length;
957*10465441SEvalZero     const char *name_ptr;
958*10465441SEvalZero 
959*10465441SEvalZero     func_cnt = 0;
960*10465441SEvalZero     var_cnt  = 0;
961*10465441SEvalZero     min_length = 0;
962*10465441SEvalZero     name_ptr = RT_NULL;
963*10465441SEvalZero 
964*10465441SEvalZero     /* checks in system function call */
965*10465441SEvalZero     {
966*10465441SEvalZero         struct finsh_syscall *index;
967*10465441SEvalZero         for (index = _syscall_table_begin;
968*10465441SEvalZero                 index < _syscall_table_end;
969*10465441SEvalZero                 FINSH_NEXT_SYSCALL(index))
970*10465441SEvalZero         {
971*10465441SEvalZero             /* skip internal command */
972*10465441SEvalZero             if (str_is_prefix("__", index->name) == 0) continue;
973*10465441SEvalZero 
974*10465441SEvalZero             if (str_is_prefix(prefix, index->name) == 0)
975*10465441SEvalZero             {
976*10465441SEvalZero                 if (func_cnt == 0)
977*10465441SEvalZero                 {
978*10465441SEvalZero                     rt_kprintf("--function:\n");
979*10465441SEvalZero 
980*10465441SEvalZero                     if (*prefix != 0)
981*10465441SEvalZero                     {
982*10465441SEvalZero                         /* set name_ptr */
983*10465441SEvalZero                         name_ptr = index->name;
984*10465441SEvalZero 
985*10465441SEvalZero                         /* set initial length */
986*10465441SEvalZero                         min_length = strlen(name_ptr);
987*10465441SEvalZero                     }
988*10465441SEvalZero                 }
989*10465441SEvalZero 
990*10465441SEvalZero                 func_cnt ++;
991*10465441SEvalZero 
992*10465441SEvalZero                 if (*prefix != 0)
993*10465441SEvalZero                 {
994*10465441SEvalZero                     length = str_common(name_ptr, index->name);
995*10465441SEvalZero                     if (length < min_length)
996*10465441SEvalZero                         min_length = length;
997*10465441SEvalZero                 }
998*10465441SEvalZero 
999*10465441SEvalZero #ifdef FINSH_USING_DESCRIPTION
1000*10465441SEvalZero                 rt_kprintf("%-16s -- %s\n", index->name, index->desc);
1001*10465441SEvalZero #else
1002*10465441SEvalZero                 rt_kprintf("%s\n", index->name);
1003*10465441SEvalZero #endif
1004*10465441SEvalZero             }
1005*10465441SEvalZero         }
1006*10465441SEvalZero     }
1007*10465441SEvalZero 
1008*10465441SEvalZero     /* checks in dynamic system function call */
1009*10465441SEvalZero     syscall_item = global_syscall_list;
1010*10465441SEvalZero     while (syscall_item != NULL)
1011*10465441SEvalZero     {
1012*10465441SEvalZero         if (str_is_prefix(prefix, syscall_item->syscall.name) == 0)
1013*10465441SEvalZero         {
1014*10465441SEvalZero             if (func_cnt == 0)
1015*10465441SEvalZero             {
1016*10465441SEvalZero                 rt_kprintf("--function:\n");
1017*10465441SEvalZero                 if (*prefix != 0 && name_ptr == NULL)
1018*10465441SEvalZero                 {
1019*10465441SEvalZero                     /* set name_ptr */
1020*10465441SEvalZero                     name_ptr = syscall_item->syscall.name;
1021*10465441SEvalZero 
1022*10465441SEvalZero                     /* set initial length */
1023*10465441SEvalZero                     min_length = strlen(name_ptr);
1024*10465441SEvalZero                 }
1025*10465441SEvalZero             }
1026*10465441SEvalZero 
1027*10465441SEvalZero             func_cnt ++;
1028*10465441SEvalZero 
1029*10465441SEvalZero             if (*prefix != 0)
1030*10465441SEvalZero             {
1031*10465441SEvalZero                 length = str_common(name_ptr, syscall_item->syscall.name);
1032*10465441SEvalZero                 if (length < min_length)
1033*10465441SEvalZero                     min_length = length;
1034*10465441SEvalZero             }
1035*10465441SEvalZero 
1036*10465441SEvalZero             rt_kprintf("[l] %s\n", syscall_item->syscall.name);
1037*10465441SEvalZero         }
1038*10465441SEvalZero         syscall_item = syscall_item->next;
1039*10465441SEvalZero     }
1040*10465441SEvalZero 
1041*10465441SEvalZero     /* checks in system variable */
1042*10465441SEvalZero     {
1043*10465441SEvalZero         struct finsh_sysvar *index;
1044*10465441SEvalZero         for (index = _sysvar_table_begin;
1045*10465441SEvalZero                 index < _sysvar_table_end;
1046*10465441SEvalZero                 FINSH_NEXT_SYSVAR(index))
1047*10465441SEvalZero         {
1048*10465441SEvalZero             if (str_is_prefix(prefix, index->name) == 0)
1049*10465441SEvalZero             {
1050*10465441SEvalZero                 if (var_cnt == 0)
1051*10465441SEvalZero                 {
1052*10465441SEvalZero                     rt_kprintf("--variable:\n");
1053*10465441SEvalZero 
1054*10465441SEvalZero                     if (*prefix != 0 && name_ptr == NULL)
1055*10465441SEvalZero                     {
1056*10465441SEvalZero                         /* set name_ptr */
1057*10465441SEvalZero                         name_ptr = index->name;
1058*10465441SEvalZero 
1059*10465441SEvalZero                         /* set initial length */
1060*10465441SEvalZero                         min_length = strlen(name_ptr);
1061*10465441SEvalZero 
1062*10465441SEvalZero                     }
1063*10465441SEvalZero                 }
1064*10465441SEvalZero 
1065*10465441SEvalZero                 var_cnt ++;
1066*10465441SEvalZero 
1067*10465441SEvalZero                 if (*prefix != 0)
1068*10465441SEvalZero                 {
1069*10465441SEvalZero                     length = str_common(name_ptr, index->name);
1070*10465441SEvalZero                     if (length < min_length)
1071*10465441SEvalZero                         min_length = length;
1072*10465441SEvalZero                 }
1073*10465441SEvalZero 
1074*10465441SEvalZero #ifdef FINSH_USING_DESCRIPTION
1075*10465441SEvalZero                 rt_kprintf("%-16s -- %s\n", index->name, index->desc);
1076*10465441SEvalZero #else
1077*10465441SEvalZero                 rt_kprintf("%s\n", index->name);
1078*10465441SEvalZero #endif
1079*10465441SEvalZero             }
1080*10465441SEvalZero         }
1081*10465441SEvalZero     }
1082*10465441SEvalZero 
1083*10465441SEvalZero     /* checks in dynamic system variable */
1084*10465441SEvalZero     sysvar_item = global_sysvar_list;
1085*10465441SEvalZero     while (sysvar_item != NULL)
1086*10465441SEvalZero     {
1087*10465441SEvalZero         if (str_is_prefix(prefix, sysvar_item->sysvar.name) == 0)
1088*10465441SEvalZero         {
1089*10465441SEvalZero             if (var_cnt == 0)
1090*10465441SEvalZero             {
1091*10465441SEvalZero                 rt_kprintf("--variable:\n");
1092*10465441SEvalZero                 if (*prefix != 0 && name_ptr == NULL)
1093*10465441SEvalZero                 {
1094*10465441SEvalZero                     /* set name_ptr */
1095*10465441SEvalZero                     name_ptr = sysvar_item->sysvar.name;
1096*10465441SEvalZero 
1097*10465441SEvalZero                     /* set initial length */
1098*10465441SEvalZero                     min_length = strlen(name_ptr);
1099*10465441SEvalZero                 }
1100*10465441SEvalZero             }
1101*10465441SEvalZero 
1102*10465441SEvalZero             var_cnt ++;
1103*10465441SEvalZero 
1104*10465441SEvalZero             if (*prefix != 0)
1105*10465441SEvalZero             {
1106*10465441SEvalZero                 length = str_common(name_ptr, sysvar_item->sysvar.name);
1107*10465441SEvalZero                 if (length < min_length)
1108*10465441SEvalZero                     min_length = length;
1109*10465441SEvalZero             }
1110*10465441SEvalZero 
1111*10465441SEvalZero             rt_kprintf("[v] %s\n", sysvar_item->sysvar.name);
1112*10465441SEvalZero         }
1113*10465441SEvalZero         sysvar_item = sysvar_item->next;
1114*10465441SEvalZero     }
1115*10465441SEvalZero 
1116*10465441SEvalZero     /* only one matched */
1117*10465441SEvalZero     if (name_ptr != NULL)
1118*10465441SEvalZero     {
1119*10465441SEvalZero         rt_strncpy(prefix, name_ptr, min_length);
1120*10465441SEvalZero     }
1121*10465441SEvalZero }
1122*10465441SEvalZero #endif
1123*10465441SEvalZero 
1124*10465441SEvalZero #if defined(FINSH_USING_SYMTAB) && !defined(FINSH_USING_MSH_ONLY)
1125*10465441SEvalZero static int dummy = 0;
1126*10465441SEvalZero FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh)
1127*10465441SEvalZero #endif
1128*10465441SEvalZero 
1129*10465441SEvalZero #endif /* RT_USING_FINSH */
1130*10465441SEvalZero 
1131