看了一下硬汉哥的代码,实现了一下,但最大使用栈的大小用[C] 纯文本查看 复制代码 tx_thread_stack_highest_ptr 怎么都算不对,因此自己实现了一下,主要原理是 ThreadX 用 0xEF 填充栈,此外,暂不清楚 ThreadX 如何显示线程的错误状态,此处暂时用000代替。
[C] 纯文本查看 复制代码
static inline void object_split(int len, char *ch)
{
while (len--) tx_kprintf("%s", ch);
}
/**
* @brief list thread info
* @param None
* @retval None
*/
static void ps(void)
{
TX_THREAD *thread = &shell_thread;
UCHAR stat;
uint8_t *ptr;
int maxlen = TX_NAME_MAX;
/* Print Title */
tx_kprintf("\r\n");
object_split(maxlen, "=");
tx_kprintf("==============================================================================\r\n");
tx_kprintf("cpu usage = %5.2f%%\r\n", cpu_usage);
object_split(maxlen, "=");
tx_kprintf("==============================================================================\r\n");
tx_kprintf("%-*s pri status sp stack size cur used max used cur tick err\r\n", maxlen, "thread");
object_split(maxlen, "-");
tx_kprintf(" --- --------- ---------- ---------- -------- -------- ---------- ---\r\n");
/* Traversing Thread Control List */
while (thread != (TX_THREAD *)0)
{
tx_kprintf("%-*.*s %3d ", maxlen, maxlen, thread->tx_thread_name, thread->tx_thread_priority);
stat = thread->tx_thread_state;
if(stat == TX_READY) tx_kprintf(" ready ");
else if(stat == TX_COMPLETED) tx_kprintf(" complete ");
else if(stat == TX_TERMINATED) tx_kprintf(" terminate");
else if(stat == TX_SUSPENDED) tx_kprintf(" suspend ");
else if(stat == TX_SLEEP) tx_kprintf(" sleep ");
ptr = (uint8_t *)thread->tx_thread_stack_start;
while(*ptr == 0xEF) ++ptr; // ThreadX Fill Stack With 0xEF
tx_kprintf(" 0x%08x 0x%08x %02d%% %02d%%",
(ULONG)thread->tx_thread_stack_ptr,
thread->tx_thread_stack_size,
((ULONG)thread->tx_thread_stack_end - (ULONG)thread->tx_thread_stack_ptr) * 100 / thread->tx_thread_stack_size,
((ULONG)thread->tx_thread_stack_end - (ULONG)ptr) * 100 / thread->tx_thread_stack_size);
if(thread->tx_thread_time_slice == 0) tx_kprintf(" Preemptive");
else tx_kprintf(" 0x%08x", thread->tx_thread_time_slice);
tx_kprintf(" %03d\r\n", 000);
thread = thread->tx_thread_created_next;
if(thread == &shell_thread) break;
}
}
|