12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151 |
- /*
- * 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_*
- * 2020-04-07 chenhui add clear
- */
- #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);
- long clear(void)
- {
- rt_kprintf("\x1b[2J\x1b[H");
- return 0;
- }
- FINSH_FUNCTION_EXPORT(clear,clear the terminal screen);
- MSH_CMD_EXPORT(clear,clear the terminal screen);
- 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 */
|