0 工具准备
ThreadX V6.2.0
1 ThreadX打印线程信息方法
示例代码:
typedef struct
{
u8 code; /* 状态码 */
char *name; /* 名称 */
} tx_thread_status_t;
tx_thread_status_t tx_thread_status[] =
{
{TX_READY, "READY"},
{TX_COMPLETED, "COMPLETED"},
{TX_TERMINATED, "TERMINATED"},
{TX_SUSPENDED, "SUSPENDED"},
{TX_SLEEP, "SLEEP"},
{TX_QUEUE_SUSP, "QUEUE_SUSP"},
{TX_SEMAPHORE_SUSP, "SEMAPHORE_SUSP"},
{TX_EVENT_FLAG, "EVENT_FLAG"},
{TX_BLOCK_MEMORY, "BLOCK_MEMORY"},
{TX_BYTE_MEMORY, "BYTE_MEMORY"},
{TX_IO_DRIVER, "IO_DRIVER"},
{TX_FILE, "FILE"},
{TX_TCP_IP, "TCP_IP"},
{TX_MUTEX_SUSP, "MUTEX_SUSP"},
{TX_PRIORITY_CHANGE, "PRIORITY_CHANGE"},
};
int osthread(void)
{
ULONG i;
TX_THREAD *thread;
if (_tx_thread_created_count == 0)
{
printf("don't have any thread!\r\n");
return 0;
}
thread = _tx_thread_created_ptr;
printf("No. Status Prio StackSize CurStackUsed MaxStackUsed RunCount Name\r\n");
for (i = 0; i < _tx_thread_created_count; i++)
{
printf("%-3u %-16s %-3u %-10u %-10u %-10u %-10u %s\r\n",
i + 1,
tx_thread_status[thread->tx_thread_state].name,
thread->tx_thread_priority,
thread->tx_thread_stack_size,
(u32)thread->tx_thread_stack_end - (u32)thread->tx_thread_stack_ptr,
(u32)thread->tx_thread_stack_end - (u32)thread->tx_thread_stack_highest_ptr,
thread->tx_thread_run_count,
thread->tx_thread_name);
thread = thread->tx_thread_created_previous;
}
return 0;
}
说明:
以上代码遍历所有线程,依次打印序号、线程状态、线程优先级、线程栈大小、当前线程栈使用量、最大线程栈使用量、线程运行次数、线程名称。
原理介绍:
(1)ThreadX各线程采用双向链表连接起来,链表头指针为_tx_thread_created_ptr,每新增一个线程都在表头前一个位置插入。知道了线程的连接结构,我们就可以遍历所有的线程。
(2)_tx_thread_created_count表示线程的数量。
注:
为了知道最大线程栈使用量,需要在tx_port.h添加如下定义:
#define TX_ENABLE_STACK_CHECKING
打印效果展示