cmd.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. /*
  2. * File : cmd.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://openlab.rt-thread.com/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2006-04-30 Bernard first implementation
  13. * 2006-05-04 Bernard add list_thread,
  14. * list_sem,
  15. * list_timer
  16. * 2006-05-20 Bernard add list_mutex,
  17. * list_mailbox,
  18. * list_msgqueue,
  19. * list_event,
  20. * list_fevent,
  21. * list_mempool
  22. * 2006-06-03 Bernard display stack information in list_thread
  23. * 2006-08-10 Bernard change version to invoke rt_show_version
  24. * 2008-09-10 Bernard update the list function for finsh syscall
  25. * list and sysvar list
  26. * 2009-05-30 Bernard add list_device
  27. */
  28. #include <rtthread.h>
  29. #include "finsh.h"
  30. long hello()
  31. {
  32. rt_kprintf("Hello RT-Thread!\n");
  33. return 0;
  34. }
  35. FINSH_FUNCTION_EXPORT(hello, say hello world)
  36. extern void rt_show_version(void);
  37. long version()
  38. {
  39. rt_show_version();
  40. return 0;
  41. }
  42. FINSH_FUNCTION_EXPORT(version, show RT-Thread version information)
  43. #define rt_list_entry(node, type, member) \
  44. ((type *)((char *)(node) - (unsigned long)(&((type *)0)->member)))
  45. extern struct rt_object_information rt_object_container[];
  46. int list_thread()
  47. {
  48. struct rt_thread *thread;
  49. struct rt_list_node *list, *node;
  50. rt_uint8_t* ptr;
  51. list = &rt_object_container[RT_Object_Class_Thread].object_list;
  52. rt_kprintf(" thread pri status sp stack size max used left tick error\n");
  53. rt_kprintf("-------- ---- ------- ---------- ---------- ---------- ---------- ---\n");
  54. for (node = list->next; node != list; node = node->next)
  55. {
  56. thread = rt_list_entry(node, struct rt_thread, list);
  57. rt_kprintf("%-8s 0x%02x", thread->name, thread->current_priority);
  58. if (thread->stat == RT_THREAD_READY) rt_kprintf(" ready ");
  59. else if (thread->stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
  60. else if (thread->stat == RT_THREAD_INIT) rt_kprintf(" init ");
  61. ptr = (rt_uint8_t*)thread->stack_addr;
  62. while (*ptr == '#')ptr ++;
  63. rt_kprintf(" 0x%08x 0x%08x 0x%08x 0x%08x %03d\n",
  64. thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
  65. thread->stack_size,
  66. thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t)thread->stack_addr),
  67. thread->remaining_tick,
  68. thread->error);
  69. }
  70. return 0;
  71. }
  72. FINSH_FUNCTION_EXPORT(list_thread, list thread)
  73. static void show_wait_queue(struct rt_list_node* list)
  74. {
  75. struct rt_thread *thread;
  76. struct rt_list_node *node;
  77. for (node = list->next; node != list; node = node->next)
  78. {
  79. thread = rt_list_entry(node, struct rt_thread, tlist);
  80. rt_kprintf("%s", thread->name);
  81. if (node->next != list) rt_kprintf("/");
  82. }
  83. }
  84. #ifdef RT_USING_SEMAPHORE
  85. int list_sem()
  86. {
  87. struct rt_semaphore *sem;
  88. struct rt_list_node *list, *node;
  89. list = &rt_object_container[RT_Object_Class_Semaphore].object_list;
  90. rt_kprintf("semaphore v suspend thread\n");
  91. rt_kprintf("-------- --- --------------\n");
  92. for (node = list->next; node != list; node = node->next)
  93. {
  94. sem = (struct rt_semaphore*)(rt_list_entry(node, struct rt_object, list));
  95. if (sem->parent.suspend_thread_count != 0)
  96. {
  97. rt_kprintf("%-8s %03d %d:", sem->parent.parent.name, sem->value, sem->parent.suspend_thread_count);
  98. show_wait_queue(&(sem->parent.suspend_thread));
  99. rt_kprintf("\n");
  100. }
  101. else
  102. {
  103. rt_kprintf("%-8s %03d %d\n", sem->parent.parent.name, sem->value, sem->parent.suspend_thread_count);
  104. }
  105. }
  106. return 0;
  107. }
  108. FINSH_FUNCTION_EXPORT(list_sem, list semaphone in system)
  109. #endif
  110. #ifdef RT_USING_FASTEVENT
  111. int list_fevent()
  112. {
  113. struct rt_fast_event *e;
  114. struct rt_list_node *list, *node;
  115. list = &rt_object_container[RT_Object_Class_FastEvent].object_list;
  116. rt_kprintf("fevent set \n");
  117. rt_kprintf("-------- ----------\n");
  118. for (node = list->next; node != list; node = node->next)
  119. {
  120. e = (struct rt_fast_event*)(rt_list_entry(node, struct rt_object, list));
  121. rt_kprintf("%-8s 0x%08x\n", e->parent.name, e->set);
  122. }
  123. return 0;
  124. }
  125. FINSH_FUNCTION_EXPORT(list_fevent, list fast event in system)
  126. #endif
  127. #ifdef RT_USING_EVENT
  128. int list_event()
  129. {
  130. struct rt_event *e;
  131. struct rt_list_node *list, *node;
  132. list = &rt_object_container[RT_Object_Class_Event].object_list;
  133. rt_kprintf("event set suspend thread\n");
  134. rt_kprintf("-------- ---------- --------------\n");
  135. for (node = list->next; node != list; node = node->next)
  136. {
  137. e = (struct rt_event*)(rt_list_entry(node, struct rt_object, list));
  138. rt_kprintf("%-8s 0x%08x %03d\n", e->parent.parent.name, e->set, e->parent.suspend_thread_count);
  139. }
  140. return 0;
  141. }
  142. FINSH_FUNCTION_EXPORT(list_event, list event in system)
  143. #endif
  144. #ifdef RT_USING_MUTEX
  145. int list_mutex()
  146. {
  147. struct rt_mutex *m;
  148. struct rt_list_node *list, *node;
  149. list = &rt_object_container[RT_Object_Class_Mutex].object_list;
  150. rt_kprintf("mutex owner hold suspend thread\n");
  151. rt_kprintf("-------- -------- ---- --------------\n");
  152. for (node = list->next; node != list; node = node->next)
  153. {
  154. m = (struct rt_mutex*)(rt_list_entry(node, struct rt_object, list));
  155. rt_kprintf("%-8s %-8s %04d %d\n", m->parent.parent.name, m->owner->name, m->hold, m->parent.suspend_thread_count);
  156. }
  157. return 0;
  158. }
  159. FINSH_FUNCTION_EXPORT(list_mutex, list mutex in system)
  160. #endif
  161. #ifdef RT_USING_MAILBOX
  162. int list_mailbox()
  163. {
  164. struct rt_mailbox *m;
  165. struct rt_list_node *list, *node;
  166. list = &rt_object_container[RT_Object_Class_MailBox].object_list;
  167. rt_kprintf("mailbox entry size suspend thread\n");
  168. rt_kprintf("-------- ---- ---- --------------\n");
  169. for (node = list->next; node != list; node = node->next)
  170. {
  171. m = (struct rt_mailbox*)(rt_list_entry(node, struct rt_object, list));
  172. if (m->parent.suspend_thread_count != 0)
  173. {
  174. rt_kprintf("%-8s %04d %04d %d:", m->parent.parent.name, m->entry, m->size, m->parent.suspend_thread_count);
  175. show_wait_queue(&(m->parent.suspend_thread));
  176. rt_kprintf("\n");
  177. }
  178. else
  179. {
  180. rt_kprintf("%-8s %04d %04d %d\n", m->parent.parent.name, m->entry, m->size, m->parent.suspend_thread_count);
  181. }
  182. }
  183. return 0;
  184. }
  185. FINSH_FUNCTION_EXPORT(list_mailbox, list mail box in system)
  186. #endif
  187. #ifdef RT_USING_MESSAGEQUEUE
  188. int list_msgqueue()
  189. {
  190. struct rt_messagequeue *m;
  191. struct rt_list_node *list, *node;
  192. list = &rt_object_container[RT_Object_Class_MessageQueue].object_list;
  193. rt_kprintf("msgqueue entry suspend thread\n");
  194. rt_kprintf("-------- ---- --------------\n");
  195. for (node = list->next; node != list; node = node->next)
  196. {
  197. m = (struct rt_messagequeue*)(rt_list_entry(node, struct rt_object, list));
  198. rt_kprintf("%-8s %04d %d\n", m->parent.parent.name, m->entry, m->parent.suspend_thread_count);
  199. }
  200. return 0;
  201. }
  202. FINSH_FUNCTION_EXPORT(list_msgqueue, list message queue in system)
  203. #endif
  204. #ifdef RT_USING_MEMPOOL
  205. int list_mempool()
  206. {
  207. struct rt_mempool *mp;
  208. struct rt_list_node *list, *node;
  209. list = &rt_object_container[RT_Object_Class_MemPool].object_list;
  210. rt_kprintf("mempool block total free suspend thread\n");
  211. rt_kprintf("-------- ---- ---- ---- --------------\n");
  212. for (node = list->next; node != list; node = node->next)
  213. {
  214. mp = (struct rt_mempool*)rt_list_entry(node, struct rt_object, list);
  215. rt_kprintf("%-8s %04d %04d %04d %d\n", mp->parent.name,
  216. mp->block_size, mp->block_total_count, mp->block_free_count,
  217. mp->suspend_thread_count);
  218. }
  219. return 0;
  220. }
  221. FINSH_FUNCTION_EXPORT(list_mempool, list memory pool in system)
  222. #endif
  223. int list_timer()
  224. {
  225. struct rt_timer *timer;
  226. struct rt_list_node *list, *node;
  227. list = &rt_object_container[RT_Object_Class_Timer].object_list;
  228. rt_kprintf("timer periodic timeout flag\n");
  229. rt_kprintf("-------- ---------- ---------- -----------\n");
  230. for (node = list->next; node != list; node = node->next)
  231. {
  232. timer = (struct rt_timer*)(rt_list_entry(node, struct rt_object, list));
  233. rt_kprintf("%-8s 0x%08x 0x%08x ", timer->parent.name, timer->init_tick, timer->timeout_tick);
  234. if (timer->parent.flag & RT_TIMER_FLAG_ACTIVATED) rt_kprintf("activated\n");
  235. else rt_kprintf("deactivated\n");
  236. }
  237. rt_kprintf("current tick:0x%08x\n", rt_tick_get());
  238. return 0;
  239. }
  240. FINSH_FUNCTION_EXPORT(list_timer, list timer in system)
  241. #ifdef RT_USING_DEVICE
  242. int list_device()
  243. {
  244. struct rt_device *device;
  245. struct rt_list_node *list, *node;
  246. const char *device_type_str[] =
  247. {
  248. "Character Device",
  249. "Block Device",
  250. "Network Interface",
  251. "MTD Device",
  252. "CAN",
  253. "RTC",
  254. "Unknown"
  255. };
  256. list = &rt_object_container[RT_Object_Class_Device].object_list;
  257. rt_kprintf("device type \n");
  258. rt_kprintf("-------- ---------- \n");
  259. for (node = list->next; node != list; node = node->next)
  260. {
  261. device = (struct rt_device*)(rt_list_entry(node, struct rt_object, list));
  262. rt_kprintf("%-8s %-8s \n", device->parent.name, device_type_str[device->type]);
  263. }
  264. return 0;
  265. }
  266. FINSH_FUNCTION_EXPORT(list_device, list device in system)
  267. #endif
  268. int list()
  269. {
  270. struct finsh_syscall_item* syscall_item;
  271. struct finsh_sysvar_item* sysvar_item;
  272. rt_kprintf("--Function List:\n");
  273. {
  274. struct finsh_syscall* index;
  275. for (index = _syscall_table_begin; index < _syscall_table_end; index ++)
  276. {
  277. #ifdef FINSH_USING_DESCRIPTION
  278. rt_kprintf("%-16s -- %s\n", index->name, index->desc);
  279. #else
  280. rt_kprintf("%s\n", index->name);
  281. #endif
  282. }
  283. }
  284. /* list syscall list */
  285. syscall_item = global_syscall_list;
  286. while (syscall_item != NULL)
  287. {
  288. rt_kprintf("[l] %s\n", syscall_item->syscall.name);
  289. syscall_item = syscall_item->next;
  290. }
  291. rt_kprintf("--Variable List:\n");
  292. {
  293. struct finsh_sysvar* index;
  294. for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++)
  295. {
  296. #ifdef FINSH_USING_DESCRIPTION
  297. rt_kprintf("%-16s -- %s\n", index->name, index->desc);
  298. #else
  299. rt_kprintf("%s\n", index->name);
  300. #endif
  301. }
  302. }
  303. sysvar_item = global_sysvar_list;
  304. while (sysvar_item != NULL)
  305. {
  306. rt_kprintf("[l] %s\n", sysvar_item->sysvar.name);
  307. sysvar_item = sysvar_item->next;
  308. }
  309. return 0;
  310. }
  311. FINSH_FUNCTION_EXPORT(list, list all symbol in system)
  312. #ifdef FINSH_USING_SYMTAB
  313. static int dummy = 0;
  314. FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh)
  315. #endif