Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
rt-thread
提交
2296b2b8
R
rt-thread
项目概览
BaiXuePrincess
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
2296b2b8
编写于
6月 04, 2016
作者:
B
Bernard Xiong
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #639 from armink/master
[finsh] Beautify all list object information command.
上级
7db31229
cd3b0cff
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
156 addition
and
55 deletion
+156
-55
components/finsh/cmd.c
components/finsh/cmd.c
+156
-55
未找到文件。
components/finsh/cmd.c
浏览文件 @
2296b2b8
...
...
@@ -43,6 +43,7 @@
* 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 all list object information command
*/
#include <rtthread.h>
...
...
@@ -81,18 +82,73 @@ MSH_CMD_EXPORT(version, show RT-Thread version information);
extern
struct
rt_object_information
rt_object_container
[];
/**
* Preprocessing the object name show information
*
* @param list object list
* @param type object type e.g., thread, semaphore
* @param header object name header information
* @param split_sign the split sign is using '-' between the object name header and object name table
* @param max_len the maximum object name length in list
*/
static
void
pre_obj_name_show_info
(
struct
rt_list_node
*
list
,
const
char
*
type
,
char
*
header
,
char
*
split_sign
,
rt_size_t
*
max_len
)
{
struct
rt_list_node
*
node
;
struct
rt_object
*
node_obj
=
NULL
;
rt_size_t
i
,
len
,
type_len
=
rt_strlen
(
type
),
type_index
;
*
max_len
=
0
;
/* calculate the maximum object name length */
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
node_obj
=
rt_list_entry
(
node
,
struct
rt_object
,
list
);
len
=
rt_strlen
(
node_obj
->
name
);
if
(
*
max_len
<
len
)
{
*
max_len
=
len
;
}
}
if
(
*
max_len
<
type_len
)
{
*
max_len
=
type_len
;
}
/* calculate the object type string in header index */
type_index
=
(
*
max_len
-
type_len
)
/
2
;
for
(
i
=
0
;
i
<
*
max_len
;
i
++
)
{
split_sign
[
i
]
=
'-'
;
if
(
type_len
<=
*
max_len
)
{
if
(
i
<
type_index
)
{
header
[
i
]
=
' '
;
header
[
*
max_len
-
i
-
1
]
=
' '
;
}
else
if
(
i
<
type_index
+
type_len
)
{
header
[
i
]
=
type
[
i
-
type_index
];
}
else
{
header
[
i
]
=
' '
;
}
}
}
header
[
*
max_len
]
=
'\0'
;
split_sign
[
*
max_len
]
=
'\0'
;
}
static
long
_list_thread
(
struct
rt_list_node
*
list
)
{
struct
rt_thread
*
thread
;
struct
rt_list_node
*
node
;
rt_uint8_t
*
ptr
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"thread"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
thread pri status sp stack size max used left tick error
\n
"
);
rt_kprintf
(
"
-------- ---- ------- ---------- ---------- ---------- ---------- ---
\n
"
);
rt_kprintf
(
"
%s pri status sp stack size max used left tick error
\n
"
,
name_header
);
rt_kprintf
(
"
%s -- ------- ---------- ---------- --- ---------- ---
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
thread
=
rt_list_entry
(
node
,
struct
rt_thread
,
list
);
rt_kprintf
(
"%-8.*s 0x%02x"
,
RT_NAME_MAX
,
thread
->
name
,
thread
->
current_priority
);
rt_kprintf
(
"%-*.s %02d "
,
max_name_len
,
thread
->
name
,
thread
->
current_priority
);
if
(
thread
->
stat
==
RT_THREAD_READY
)
rt_kprintf
(
" ready "
);
else
if
(
thread
->
stat
==
RT_THREAD_SUSPEND
)
rt_kprintf
(
" suspend"
);
...
...
@@ -102,10 +158,11 @@ static long _list_thread(struct rt_list_node *list)
ptr
=
(
rt_uint8_t
*
)
thread
->
stack_addr
;
while
(
*
ptr
==
'#'
)
ptr
++
;
rt_kprintf
(
" 0x%08x 0x%08x
0x%08x
0x%08x %03d
\n
"
,
rt_kprintf
(
" 0x%08x 0x%08x
%02d%%
0x%08x %03d
\n
"
,
thread
->
stack_size
+
((
rt_uint32_t
)
thread
->
stack_addr
-
(
rt_uint32_t
)
thread
->
sp
),
thread
->
stack_size
,
thread
->
stack_size
-
((
rt_uint32_t
)
ptr
-
(
rt_uint32_t
)
thread
->
stack_addr
),
(
thread
->
stack_size
-
((
rt_uint32_t
)
ptr
-
(
rt_uint32_t
)
thread
->
stack_addr
))
*
100
/
thread
->
stack_size
,
thread
->
remaining_tick
,
thread
->
error
);
}
...
...
@@ -140,16 +197,20 @@ static long _list_sem(struct rt_list_node *list)
{
struct
rt_semaphore
*
sem
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"semaphore"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
semaphore v suspend thread
\n
"
);
rt_kprintf
(
"
-------- --- --------------
\n
"
);
rt_kprintf
(
"
%s v suspend thread
\n
"
,
name_header
);
rt_kprintf
(
"
%s --- --------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
sem
=
(
struct
rt_semaphore
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
if
(
!
rt_list_isempty
(
&
sem
->
parent
.
suspend_thread
))
{
rt_kprintf
(
"%-
8.*s
%03d %d:"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.s
%03d %d:"
,
max_name_len
,
sem
->
parent
.
parent
.
name
,
sem
->
value
,
rt_list_len
(
&
sem
->
parent
.
suspend_thread
));
...
...
@@ -158,8 +219,8 @@ static long _list_sem(struct rt_list_node *list)
}
else
{
rt_kprintf
(
"%-
8.*s
%03d %d
\n
"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.s
%03d %d
\n
"
,
max_name_len
,
sem
->
parent
.
parent
.
name
,
sem
->
value
,
rt_list_len
(
&
sem
->
parent
.
suspend_thread
));
...
...
@@ -182,16 +243,20 @@ static long _list_event(struct rt_list_node *list)
{
struct
rt_event
*
e
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"event"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
event set suspend thread
\n
"
);
rt_kprintf
(
"
-------- ---------- --------------
\n
"
);
rt_kprintf
(
"
%s set suspend thread
\n
"
,
name_header
);
rt_kprintf
(
"
%s ---------- --------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
e
=
(
struct
rt_event
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
if
(
!
rt_list_isempty
(
&
e
->
parent
.
suspend_thread
))
{
rt_kprintf
(
"%-
8.*s
0x%08x %03d:"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.s
0x%08x %03d:"
,
max_name_len
,
e
->
parent
.
parent
.
name
,
e
->
set
,
rt_list_len
(
&
e
->
parent
.
suspend_thread
));
...
...
@@ -200,8 +265,10 @@ static long _list_event(struct rt_list_node *list)
}
else
{
rt_kprintf
(
"%-8.*s 0x%08x 0
\n
"
,
RT_NAME_MAX
,
e
->
parent
.
parent
.
name
,
e
->
set
);
rt_kprintf
(
"%-*.s 0x%08x 0
\n
"
,
max_name_len
,
e
->
parent
.
parent
.
name
,
e
->
set
);
}
}
...
...
@@ -221,14 +288,18 @@ static long _list_mutex(struct rt_list_node *list)
{
struct
rt_mutex
*
m
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"mutex"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
mutex owner hold suspend thread
\n
"
);
rt_kprintf
(
"
-------- -------- ---- --------------
\n
"
);
rt_kprintf
(
"
%s owner hold suspend thread
\n
"
,
name_header
);
rt_kprintf
(
"
%s -------- ---- --------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
m
=
(
struct
rt_mutex
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
rt_kprintf
(
"%-
8.*
s %-8.*s %04d %d
\n
"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %-8.*s %04d %d
\n
"
,
max_name_len
,
m
->
parent
.
parent
.
name
,
RT_NAME_MAX
,
m
->
owner
->
name
,
...
...
@@ -252,16 +323,20 @@ static long _list_mailbox(struct rt_list_node *list)
{
struct
rt_mailbox
*
m
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"mailbox"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
mailbox entry size suspend thread
\n
"
);
rt_kprintf
(
"
-------- ---- ---- --------------
\n
"
);
rt_kprintf
(
"
%s entry size suspend thread
\n
"
,
name_header
);
rt_kprintf
(
"
%s ---- ---- --------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
m
=
(
struct
rt_mailbox
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
if
(
!
rt_list_isempty
(
&
m
->
parent
.
suspend_thread
))
{
rt_kprintf
(
"%-
8.*
s %04d %04d %d:"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %04d %04d %d:"
,
max_name_len
,
m
->
parent
.
parent
.
name
,
m
->
entry
,
m
->
size
,
...
...
@@ -271,8 +346,8 @@ static long _list_mailbox(struct rt_list_node *list)
}
else
{
rt_kprintf
(
"%-
8.*
s %04d %04d %d
\n
"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %04d %04d %d
\n
"
,
max_name_len
,
m
->
parent
.
parent
.
name
,
m
->
entry
,
m
->
size
,
...
...
@@ -296,16 +371,20 @@ static long _list_msgqueue(struct rt_list_node *list)
{
struct
rt_messagequeue
*
m
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"msgqueue"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
msgqueue entry suspend thread
\n
"
);
rt_kprintf
(
"
-------- ---- --------------
\n
"
);
rt_kprintf
(
"
%s entry suspend thread
\n
"
,
name_header
);
rt_kprintf
(
"
%s ---- --------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
m
=
(
struct
rt_messagequeue
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
if
(
!
rt_list_isempty
(
&
m
->
parent
.
suspend_thread
))
{
rt_kprintf
(
"%-
8.*
s %04d %d:"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %04d %d:"
,
max_name_len
,
m
->
parent
.
parent
.
name
,
m
->
entry
,
rt_list_len
(
&
m
->
parent
.
suspend_thread
));
...
...
@@ -314,8 +393,8 @@ static long _list_msgqueue(struct rt_list_node *list)
}
else
{
rt_kprintf
(
"%-
8.*
s %04d %d
\n
"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %04d %d
\n
"
,
max_name_len
,
m
->
parent
.
parent
.
name
,
m
->
entry
,
rt_list_len
(
&
m
->
parent
.
suspend_thread
));
...
...
@@ -338,15 +417,18 @@ static long _list_memheap(struct rt_list_node *list)
{
struct
rt_memheap
*
mh
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
mart_size_t
max_name_len
=
0
*
preprocessing
the
object
name
show
information
*/
pre_obj_name_show_info
(
list
,
"memheap"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
memheap pool size max used size available size
\n
"
);
rt_kprintf
(
"
-------- ---------- ------------- --------------
\n
"
);
rt_kprintf
(
"
%s pool size max used size available size
\n
"
,
name_header
);
rt_kprintf
(
"
%s ---------- ------------- --------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
mh
=
(
struct
rt_memheap
*
)
rt_list_entry
(
node
,
struct
rt_object
,
list
);
rt_kprintf
(
"%-
8.*
s %-010d %-013d %-05d
\n
"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %-010d %-013d %-05d
\n
"
,
max_name_len
,
mh
->
parent
.
name
,
mh
->
pool_size
,
mh
->
max_used_size
,
...
...
@@ -369,16 +451,20 @@ static long _list_mempool(struct rt_list_node *list)
{
struct
rt_mempool
*
mp
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"mempool"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
mempool block total free suspend thread
\n
"
);
rt_kprintf
(
"
-------- ---- ---- ---- --------------
\n
"
);
rt_kprintf
(
"
%s block total free suspend thread
\n
"
,
name_header
);
rt_kprintf
(
"
%s ---- ---- ---- --------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
mp
=
(
struct
rt_mempool
*
)
rt_list_entry
(
node
,
struct
rt_object
,
list
);
if
(
mp
->
suspend_thread_count
>
0
)
{
rt_kprintf
(
"%-
8.*
s %04d %04d %04d %d:"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %04d %04d %04d %d:"
,
max_name_len
,
mp
->
parent
.
name
,
mp
->
block_size
,
mp
->
block_total_count
,
...
...
@@ -389,8 +475,8 @@ static long _list_mempool(struct rt_list_node *list)
}
else
{
rt_kprintf
(
"%-
8.*
s %04d %04d %04d %d
\n
"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %04d %04d %04d %d
\n
"
,
max_name_len
,
mp
->
parent
.
name
,
mp
->
block_size
,
mp
->
block_total_count
,
...
...
@@ -414,14 +500,18 @@ static long _list_timer(struct rt_list_node *list)
{
struct
rt_timer
*
timer
;
struct
rt_list_node
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"timer"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
timer periodic timeout flag
\n
"
);
rt_kprintf
(
"
-------- ---------- ---------- -----------
\n
"
);
rt_kprintf
(
"
%s periodic timeout flag
\n
"
,
name_header
);
rt_kprintf
(
"
%s ---------- ---------- -----------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
timer
=
(
struct
rt_timer
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
rt_kprintf
(
"%-
8.*
s 0x%08x 0x%08x "
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s 0x%08x 0x%08x "
,
max_name_len
,
timer
->
parent
.
name
,
timer
->
init_tick
,
timer
->
timeout_tick
);
...
...
@@ -471,14 +561,18 @@ static long _list_device(struct rt_list_node *list)
"Miscellaneous Device"
,
"Unknown"
};
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"device"
,
name_header
,
name_split_sign
,
&
max_name_len
);
rt_kprintf
(
"
device type ref count
\n
"
);
rt_kprintf
(
"
-------- -------------------- ----------
\n
"
);
rt_kprintf
(
"
%s type ref count
\n
"
,
name_header
);
rt_kprintf
(
"
%s -------------------- ----------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
device
=
(
struct
rt_device
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
rt_kprintf
(
"%-
8.*
s %-20s %-8d
\n
"
,
RT_NAME_MAX
,
rt_kprintf
(
"%-
*.
s %-20s %-8d
\n
"
,
max_name_len
,
device
->
parent
.
name
,
(
device
->
type
<=
RT_Device_Class_Unknown
)
?
device_type_str
[
device
->
type
]
:
...
...
@@ -504,16 +598,23 @@ int list_module(void)
{
struct
rt_module
*
module
;
struct
rt_list_node
*
list
,
*
node
;
char
name_header
[
RT_NAME_MAX
],
name_split_sign
[
RT_NAME_MAX
];
rt_size_t
max_name_len
=
0
;
/* preprocessing the object name show information */
pre_obj_name_show_info
(
list
,
"module"
,
name_header
,
name_split_sign
,
&
max_name_len
);
list
=
&
rt_object_container
[
RT_Object_Class_Module
].
object_list
;
rt_kprintf
(
"
module name ref address
\n
"
);
rt_kprintf
(
"
------------ -------- ------------
\n
"
);
rt_kprintf
(
"
%s ref address
\n
"
,
name_header
);
rt_kprintf
(
"
%s -------- ------------
\n
"
,
name_split_sign
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
module
=
(
struct
rt_module
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
rt_kprintf
(
"%-16.*s %-04d 0x%08x
\n
"
,
RT_NAME_MAX
,
module
->
parent
.
name
,
module
->
nref
,
module
->
module_space
);
rt_kprintf
(
"%-*.s %-04d 0x%08x
\n
"
,
max_name_len
,
module
->
parent
.
name
,
module
->
nref
,
module
->
module_space
);
}
return
0
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录