1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141 |
- /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2006-04-30 Bernard first implementation
- * 2006-05-04 Bernard add list_thread,
- * list_sem,
- * list_timer
- * 2006-05-20 Bernard add list_mutex,
- * list_mailbox,
- * list_msgqueue,
- * list_event,
- * list_fevent,
- * list_mempool
- * 2006-06-03 Bernard display stack information in list_thread
- * 2006-08-10 Bernard change version to invoke rt_show_version
- * 2008-09-10 Bernard update the list function for finsh syscall
- * list and sysvar list
- * 2009-05-30 Bernard add list_device
- * 2010-04-21 yi.qiu add list_module
- * 2012-04-29 goprife improve the command line auto-complete feature.
- * 2012-06-02 lgnq add list_memheap
- * 2012-10-22 Bernard add MS VC++ patch.
- * 2016-06-02 armink beautify the list_thread command
- * 2018-11-22 Jesven list_thread add smp support
- * 2018-12-27 Jesven Fix the problem that disable interrupt too long in list_thread
- * Provide protection for the "first layer of objects" when list_*
- */
- #include <rthw.h>
- #include <rtthread.h>
- #ifdef RT_USING_FINSH
- #include "finsh.h"
- #define LIST_FIND_OBJ_NR 8
- long hello(void)
- {
- rt_kprintf("Hello RT-Thread!\n");
- return 0;
- }
- FINSH_FUNCTION_EXPORT(hello, say hello world);
- extern void rt_show_version(void);
- long version(void)
- {
- rt_show_version();
- return 0;
- }
- FINSH_FUNCTION_EXPORT(version, show RT-Thread version information);
- MSH_CMD_EXPORT(version, show RT-Thread version information);
- rt_inline void object_split(int len)
- {
- while (len--) rt_kprintf("-");
- }
- typedef struct
- {
- rt_list_t *list;
- rt_list_t **array;
- rt_uint8_t type;
- int nr; /* input: max nr, can't be 0 */
- int nr_out; /* out: got nr */
- } list_get_next_t;
- static void list_find_init(list_get_next_t *p, rt_uint8_t type, rt_list_t **array, int nr)
- {
- struct rt_object_information *info;
- rt_list_t *list;
- info = rt_object_get_information((enum rt_object_class_type)type);
- list = &info->object_list;
- p->list = list;
- p->type = type;
- p->array = array;
- p->nr = nr;
- p->nr_out = 0;
- }
- static rt_list_t *list_get_next(rt_list_t *current, list_get_next_t *arg)
- {
- int first_flag = 0;
- rt_ubase_t level;
- rt_list_t *node, *list;
- rt_list_t **array;
- int nr;
- arg->nr_out = 0;
- if (!arg->nr || !arg->type)
- {
- return (rt_list_t *)RT_NULL;
- }
- list = arg->list;
- if (!current) /* find first */
- {
- node = list;
- first_flag = 1;
- }
- else
- {
- node = current;
- }
- level = rt_hw_interrupt_disable();
- if (!first_flag)
- {
- struct rt_object *obj;
- /* The node in the list? */
- obj = rt_list_entry(node, struct rt_object, list);
- if ((obj->type & ~RT_Object_Class_Static) != arg->type)
- {
- rt_hw_interrupt_enable(level);
- return (rt_list_t *)RT_NULL;
- }
- }
- nr = 0;
- array = arg->array;
- while (1)
- {
- node = node->next;
- if (node == list)
- {
- node = (rt_list_t *)RT_NULL;
- break;
- }
- nr++;
- *array++ = node;
- if (nr == arg->nr)
- {
- break;
- }
- }
-
- rt_hw_interrupt_enable(level);
- arg->nr_out = nr;
- return node;
- }
- long list_thread(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- const char *item_title = "thread";
- int maxlen;
- list_find_init(&find_arg, RT_Object_Class_Thread, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- #ifdef RT_USING_SMP
- rt_kprintf("%-*.s cpu pri status sp stack size max used left tick error\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " --- --- ------- ---------- ---------- ------ ---------- ---\n");
- #else
- rt_kprintf("%-*.s pri status sp stack size max used left tick error\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " --- ------- ---------- ---------- ------ ---------- ---\n");
- #endif /*RT_USING_SMP*/
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_thread thread_info, *thread;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- /* copy info */
- memcpy(&thread_info, obj, sizeof thread_info);
- rt_hw_interrupt_enable(level);
- thread = (struct rt_thread*)obj;
- {
- rt_uint8_t stat;
- rt_uint8_t *ptr;
- #ifdef RT_USING_SMP
- if (thread->oncpu != RT_CPU_DETACHED)
- rt_kprintf("%-*.*s %3d %3d ", maxlen, RT_NAME_MAX, thread->name, thread->oncpu, thread->current_priority);
- else
- rt_kprintf("%-*.*s N/A %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
- #else
- rt_kprintf("%-*.*s %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
- #endif /*RT_USING_SMP*/
- stat = (thread->stat & RT_THREAD_STAT_MASK);
- if (stat == RT_THREAD_READY) rt_kprintf(" ready ");
- else if (stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
- else if (stat == RT_THREAD_INIT) rt_kprintf(" init ");
- else if (stat == RT_THREAD_CLOSE) rt_kprintf(" close ");
- else if (stat == RT_THREAD_RUNNING) rt_kprintf(" running");
- #if defined(ARCH_CPU_STACK_GROWS_UPWARD)
- ptr = (rt_uint8_t *)thread->stack_addr + thread->stack_size - 1;
- while (*ptr == '#')ptr --;
- rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
- ((rt_ubase_t)thread->sp - (rt_ubase_t)thread->stack_addr),
- thread->stack_size,
- ((rt_ubase_t)ptr - (rt_ubase_t)thread->stack_addr) * 100 / thread->stack_size,
- thread->remaining_tick,
- thread->error);
- #else
- ptr = (rt_uint8_t *)thread->stack_addr;
- while (*ptr == '#')ptr ++;
- rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
- thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),
- thread->stack_size,
- (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100
- / thread->stack_size,
- thread->remaining_tick,
- thread->error);
- #endif
- }
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_thread, list thread);
- MSH_CMD_EXPORT(list_thread, list thread);
- static void show_wait_queue(struct rt_list_node *list)
- {
- struct rt_thread *thread;
- struct rt_list_node *node;
- for (node = list->next; node != list; node = node->next)
- {
- thread = rt_list_entry(node, struct rt_thread, tlist);
- rt_kprintf("%s", thread->name);
- if (node->next != list)
- rt_kprintf("/");
- }
- }
- #ifdef RT_USING_SEMAPHORE
- long list_sem(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "semaphore";
- list_find_init(&find_arg, RT_Object_Class_Semaphore, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s v suspend thread\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " --- --------------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_semaphore *sem;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- sem = (struct rt_semaphore*)obj;
- if (!rt_list_isempty(&sem->parent.suspend_thread))
- {
- rt_kprintf("%-*.*s %03d %d:",
- maxlen, RT_NAME_MAX,
- sem->parent.parent.name,
- sem->value,
- rt_list_len(&sem->parent.suspend_thread));
- show_wait_queue(&(sem->parent.suspend_thread));
- rt_kprintf("\n");
- }
- else
- {
- rt_kprintf("%-*.*s %03d %d\n",
- maxlen, RT_NAME_MAX,
- sem->parent.parent.name,
- sem->value,
- rt_list_len(&sem->parent.suspend_thread));
- }
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_sem, list semaphore in system);
- MSH_CMD_EXPORT(list_sem, list semaphore in system);
- #endif
- #ifdef RT_USING_EVENT
- long list_event(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "event";
- list_find_init(&find_arg, RT_Object_Class_Event, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s set suspend thread\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " ---------- --------------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_event *e;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- e = (struct rt_event *)obj;
- if (!rt_list_isempty(&e->parent.suspend_thread))
- {
- rt_kprintf("%-*.*s 0x%08x %03d:",
- maxlen, RT_NAME_MAX,
- e->parent.parent.name,
- e->set,
- rt_list_len(&e->parent.suspend_thread));
- show_wait_queue(&(e->parent.suspend_thread));
- rt_kprintf("\n");
- }
- else
- {
- rt_kprintf("%-*.*s 0x%08x 0\n",
- maxlen, RT_NAME_MAX, e->parent.parent.name, e->set);
- }
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_event, list event in system);
- MSH_CMD_EXPORT(list_event, list event in system);
- #endif
- #ifdef RT_USING_MUTEX
- long list_mutex(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "mutex";
- list_find_init(&find_arg, RT_Object_Class_Mutex, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s owner hold suspend thread\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " -------- ---- --------------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_mutex *m;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- m = (struct rt_mutex *)obj;
- rt_kprintf("%-*.*s %-8.*s %04d %d\n",
- maxlen, RT_NAME_MAX,
- m->parent.parent.name,
- RT_NAME_MAX,
- m->owner->name,
- m->hold,
- rt_list_len(&m->parent.suspend_thread));
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_mutex, list mutex in system);
- MSH_CMD_EXPORT(list_mutex, list mutex in system);
- #endif
- #ifdef RT_USING_MAILBOX
- long list_mailbox(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "mailbox";
- list_find_init(&find_arg, RT_Object_Class_MailBox, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s entry size suspend thread\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " ---- ---- --------------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_mailbox *m;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- m = (struct rt_mailbox *)obj;
- if (!rt_list_isempty(&m->parent.suspend_thread))
- {
- rt_kprintf("%-*.*s %04d %04d %d:",
- maxlen, RT_NAME_MAX,
- m->parent.parent.name,
- m->entry,
- m->size,
- rt_list_len(&m->parent.suspend_thread));
- show_wait_queue(&(m->parent.suspend_thread));
- rt_kprintf("\n");
- }
- else
- {
- rt_kprintf("%-*.*s %04d %04d %d\n",
- maxlen, RT_NAME_MAX,
- m->parent.parent.name,
- m->entry,
- m->size,
- rt_list_len(&m->parent.suspend_thread));
- }
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_mailbox, list mail box in system);
- MSH_CMD_EXPORT(list_mailbox, list mail box in system);
- #endif
- #ifdef RT_USING_MESSAGEQUEUE
- long list_msgqueue(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "msgqueue";
- list_find_init(&find_arg, RT_Object_Class_MessageQueue, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s entry suspend thread\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " ---- --------------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_messagequeue *m;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- m = (struct rt_messagequeue *)obj;
- if (!rt_list_isempty(&m->parent.suspend_thread))
- {
- rt_kprintf("%-*.*s %04d %d:",
- maxlen, RT_NAME_MAX,
- m->parent.parent.name,
- m->entry,
- rt_list_len(&m->parent.suspend_thread));
- show_wait_queue(&(m->parent.suspend_thread));
- rt_kprintf("\n");
- }
- else
- {
- rt_kprintf("%-*.*s %04d %d\n",
- maxlen, RT_NAME_MAX,
- m->parent.parent.name,
- m->entry,
- rt_list_len(&m->parent.suspend_thread));
- }
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_msgqueue, list message queue in system);
- MSH_CMD_EXPORT(list_msgqueue, list message queue in system);
- #endif
- #ifdef RT_USING_MEMHEAP
- long list_memheap(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "memheap";
- list_find_init(&find_arg, RT_Object_Class_MemHeap, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s pool size max used size available size\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " ---------- ------------- --------------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_memheap *mh;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- mh = (struct rt_memheap *)obj;
- rt_kprintf("%-*.*s %-010d %-013d %-05d\n",
- maxlen, RT_NAME_MAX,
- mh->parent.name,
- mh->pool_size,
- mh->max_used_size,
- mh->available_size);
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_memheap, list memory heap in system);
- MSH_CMD_EXPORT(list_memheap, list memory heap in system);
- #endif
- #ifdef RT_USING_MEMPOOL
- long list_mempool(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "mempool";
- list_find_init(&find_arg, RT_Object_Class_MemPool, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s block total free suspend thread\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " ---- ---- ---- --------------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_mempool *mp;
- int suspend_thread_count;
- rt_list_t *node;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- mp = (struct rt_mempool *)obj;
- suspend_thread_count = 0;
- rt_list_for_each(node, &mp->suspend_thread)
- {
- suspend_thread_count++;
- }
- if (suspend_thread_count > 0)
- {
- rt_kprintf("%-*.*s %04d %04d %04d %d:",
- maxlen, RT_NAME_MAX,
- mp->parent.name,
- mp->block_size,
- mp->block_total_count,
- mp->block_free_count,
- suspend_thread_count);
- show_wait_queue(&(mp->suspend_thread));
- rt_kprintf("\n");
- }
- else
- {
- rt_kprintf("%-*.*s %04d %04d %04d %d\n",
- maxlen, RT_NAME_MAX,
- mp->parent.name,
- mp->block_size,
- mp->block_total_count,
- mp->block_free_count,
- suspend_thread_count);
- }
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_mempool, list memory pool in system)
- MSH_CMD_EXPORT(list_mempool, list memory pool in system);
- #endif
- long list_timer(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "timer";
- list_find_init(&find_arg, RT_Object_Class_Timer, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s periodic timeout flag\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " ---------- ---------- -----------\n");
- do {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_timer *timer;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- timer = (struct rt_timer *)obj;
- rt_kprintf("%-*.*s 0x%08x 0x%08x ",
- maxlen, RT_NAME_MAX,
- timer->parent.name,
- timer->init_tick,
- timer->timeout_tick);
- if (timer->parent.flag & RT_TIMER_FLAG_ACTIVATED)
- rt_kprintf("activated\n");
- else
- rt_kprintf("deactivated\n");
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- rt_kprintf("current tick:0x%08x\n", rt_tick_get());
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_timer, list timer in system);
- MSH_CMD_EXPORT(list_timer, list timer in system);
- #ifdef RT_USING_DEVICE
- static char *const device_type_str[] =
- {
- "Character Device",
- "Block Device",
- "Network Interface",
- "MTD Device",
- "CAN Device",
- "RTC",
- "Sound Device",
- "Graphic Device",
- "I2C Bus",
- "USB Slave Device",
- "USB Host Bus",
- "SPI Bus",
- "SPI Device",
- "SDIO Bus",
- "PM Pseudo Device",
- "Pipe",
- "Portal Device",
- "Timer Device",
- "Miscellaneous Device",
- "Sensor Device",
- "Touch Device",
- "Unknown"
- };
- long list_device(void)
- {
- rt_ubase_t level;
- list_get_next_t find_arg;
- rt_list_t *obj_list[LIST_FIND_OBJ_NR];
- rt_list_t *next = (rt_list_t*)RT_NULL;
- int maxlen;
- const char *item_title = "device";
- list_find_init(&find_arg, RT_Object_Class_Device, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
- maxlen = RT_NAME_MAX;
- rt_kprintf("%-*.s type ref count\n", maxlen, item_title); object_split(maxlen);
- rt_kprintf( " -------------------- ----------\n");
- do
- {
- next = list_get_next(next, &find_arg);
- {
- int i;
- for (i = 0; i < find_arg.nr_out; i++)
- {
- struct rt_object *obj;
- struct rt_device *device;
- obj = rt_list_entry(obj_list[i], struct rt_object, list);
- level = rt_hw_interrupt_disable();
- if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
- {
- rt_hw_interrupt_enable(level);
- continue;
- }
- rt_hw_interrupt_enable(level);
- device = (struct rt_device *)obj;
- rt_kprintf("%-*.*s %-20s %-8d\n",
- maxlen, RT_NAME_MAX,
- device->parent.name,
- (device->type <= RT_Device_Class_Unknown) ?
- device_type_str[device->type] :
- device_type_str[RT_Device_Class_Unknown],
- device->ref_count);
- }
- }
- }
- while (next != (rt_list_t*)RT_NULL);
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list_device, list device in system);
- MSH_CMD_EXPORT(list_device, list device in system);
- #endif
- long list(void)
- {
- #ifndef FINSH_USING_MSH_ONLY
- struct finsh_syscall_item *syscall_item;
- struct finsh_sysvar_item *sysvar_item;
- #endif
- rt_kprintf("--Function List:\n");
- {
- struct finsh_syscall *index;
- for (index = _syscall_table_begin;
- index < _syscall_table_end;
- FINSH_NEXT_SYSCALL(index))
- {
- /* skip the internal command */
- if (strncmp((char *)index->name, "__", 2) == 0) continue;
- #if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB)
- rt_kprintf("%-16s -- %s\n", index->name, index->desc);
- #else
- rt_kprintf("%s\n", index->name);
- #endif
- }
- }
- #ifndef FINSH_USING_MSH_ONLY
- /* list syscall list */
- syscall_item = global_syscall_list;
- while (syscall_item != NULL)
- {
- rt_kprintf("[l] %s\n", syscall_item->syscall.name);
- syscall_item = syscall_item->next;
- }
- rt_kprintf("--Variable List:\n");
- {
- struct finsh_sysvar *index;
- for (index = _sysvar_table_begin;
- index < _sysvar_table_end;
- FINSH_NEXT_SYSVAR(index))
- {
- #ifdef FINSH_USING_DESCRIPTION
- rt_kprintf("%-16s -- %s\n", index->name, index->desc);
- #else
- rt_kprintf("%s\n", index->name);
- #endif
- }
- }
- sysvar_item = global_sysvar_list;
- while (sysvar_item != NULL)
- {
- rt_kprintf("[l] %s\n", sysvar_item->sysvar.name);
- sysvar_item = sysvar_item->next;
- }
- #endif
- return 0;
- }
- FINSH_FUNCTION_EXPORT(list, list all symbol in system)
- #ifndef FINSH_USING_MSH_ONLY
- static int str_is_prefix(const char *prefix, const char *str)
- {
- while ((*prefix) && (*prefix == *str))
- {
- prefix ++;
- str ++;
- }
- if (*prefix == 0)
- return 0;
- return -1;
- }
- static int str_common(const char *str1, const char *str2)
- {
- const char *str = str1;
- while ((*str != 0) && (*str2 != 0) && (*str == *str2))
- {
- str ++;
- str2 ++;
- }
- return (str - str1);
- }
- void list_prefix(char *prefix)
- {
- struct finsh_syscall_item *syscall_item;
- struct finsh_sysvar_item *sysvar_item;
- rt_uint16_t func_cnt, var_cnt;
- int length, min_length;
- const char *name_ptr;
- func_cnt = 0;
- var_cnt = 0;
- min_length = 0;
- name_ptr = RT_NULL;
- /* checks in system function call */
- {
- struct finsh_syscall *index;
- for (index = _syscall_table_begin;
- index < _syscall_table_end;
- FINSH_NEXT_SYSCALL(index))
- {
- /* skip internal command */
- if (str_is_prefix("__", index->name) == 0) continue;
- if (str_is_prefix(prefix, index->name) == 0)
- {
- if (func_cnt == 0)
- {
- rt_kprintf("--function:\n");
- if (*prefix != 0)
- {
- /* set name_ptr */
- name_ptr = index->name;
- /* set initial length */
- min_length = strlen(name_ptr);
- }
- }
- func_cnt ++;
- if (*prefix != 0)
- {
- length = str_common(name_ptr, index->name);
- if (length < min_length)
- min_length = length;
- }
- #ifdef FINSH_USING_DESCRIPTION
- rt_kprintf("%-16s -- %s\n", index->name, index->desc);
- #else
- rt_kprintf("%s\n", index->name);
- #endif
- }
- }
- }
- /* checks in dynamic system function call */
- syscall_item = global_syscall_list;
- while (syscall_item != NULL)
- {
- if (str_is_prefix(prefix, syscall_item->syscall.name) == 0)
- {
- if (func_cnt == 0)
- {
- rt_kprintf("--function:\n");
- if (*prefix != 0 && name_ptr == NULL)
- {
- /* set name_ptr */
- name_ptr = syscall_item->syscall.name;
- /* set initial length */
- min_length = strlen(name_ptr);
- }
- }
- func_cnt ++;
- if (*prefix != 0)
- {
- length = str_common(name_ptr, syscall_item->syscall.name);
- if (length < min_length)
- min_length = length;
- }
- rt_kprintf("[l] %s\n", syscall_item->syscall.name);
- }
- syscall_item = syscall_item->next;
- }
- /* checks in system variable */
- {
- struct finsh_sysvar *index;
- for (index = _sysvar_table_begin;
- index < _sysvar_table_end;
- FINSH_NEXT_SYSVAR(index))
- {
- if (str_is_prefix(prefix, index->name) == 0)
- {
- if (var_cnt == 0)
- {
- rt_kprintf("--variable:\n");
- if (*prefix != 0 && name_ptr == NULL)
- {
- /* set name_ptr */
- name_ptr = index->name;
- /* set initial length */
- min_length = strlen(name_ptr);
- }
- }
- var_cnt ++;
- if (*prefix != 0)
- {
- length = str_common(name_ptr, index->name);
- if (length < min_length)
- min_length = length;
- }
- #ifdef FINSH_USING_DESCRIPTION
- rt_kprintf("%-16s -- %s\n", index->name, index->desc);
- #else
- rt_kprintf("%s\n", index->name);
- #endif
- }
- }
- }
- /* checks in dynamic system variable */
- sysvar_item = global_sysvar_list;
- while (sysvar_item != NULL)
- {
- if (str_is_prefix(prefix, sysvar_item->sysvar.name) == 0)
- {
- if (var_cnt == 0)
- {
- rt_kprintf("--variable:\n");
- if (*prefix != 0 && name_ptr == NULL)
- {
- /* set name_ptr */
- name_ptr = sysvar_item->sysvar.name;
- /* set initial length */
- min_length = strlen(name_ptr);
- }
- }
- var_cnt ++;
- if (*prefix != 0)
- {
- length = str_common(name_ptr, sysvar_item->sysvar.name);
- if (length < min_length)
- min_length = length;
- }
- rt_kprintf("[v] %s\n", sysvar_item->sysvar.name);
- }
- sysvar_item = sysvar_item->next;
- }
- /* only one matched */
- if (name_ptr != NULL)
- {
- rt_strncpy(prefix, name_ptr, min_length);
- }
- }
- #endif
- #if defined(FINSH_USING_SYMTAB) && !defined(FINSH_USING_MSH_ONLY)
- static int dummy = 0;
- FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh)
- #endif
- #endif /* RT_USING_FINSH */
|