RT-Threadスタートガイドスタディノート-menuconfigKconfigの使用
RT-Thread入門スタディノート-動的メモリのアプリケーションとリリースに精通している
RT-Threadはじめに研究ノート-スレッドスタックのアドレスを表示する
RT-Threadスタートガイドスタディノート-RT_ASSERT障害の問題を解決する
序文
- 最近、スレッドの部分を調べていたところ、list_threadが各スレッドのスタックアドレスを表示できないことがわかりました。
- カーネルオブジェクトの操作に精通し、RT-Threadスレッドの構造を理解している場合は、テストコードを記述してスレッドスタックアドレスを表示できます。
RTスレッドスレッド構造
- RTスレッドスレッド構造は比較的複雑で、多くのメンバーが含まれています。
- 詳細については、以下を参照してください。<rtdef.h>:structrt_thread構造体
- rt_threadにあるスレッドスタックアドレス:
/* stack point and entry */
void *sp; /**< stack point */
void *entry; /**< entry */
void *parameter; /**< parameter */
void *stack_addr; /**< stack address */
rt_uint32_t stack_size; /**< stack size */
list_threadでモデル化されたテストコードを記述します
void dump_thread_ex(void)
{
rt_uint8_t index = 0;
rt_uint8_t obj_size = 0;
int thread_cnt = rt_object_get_length(RT_Object_Class_Thread);
rt_kprintf("%s: thread count = %d\n", __func__, thread_cnt);
char *thread_buf = rt_malloc(thread_cnt * 4);
if (thread_buf == RT_NULL)
{
rt_kprintf("%s: malloc failed!\n", __func__);
return;
}
rt_object_t* obj_pointers = (rt_object_t *)thread_buf;
obj_size = rt_object_get_pointers(RT_Object_Class_Thread, obj_pointers, thread_cnt);
rt_kprintf("object init : object size=%d\n", obj_size);
rt_kprintf("| name | pri | status | stack addr | stack size | used | remain tick | err |\n");
rt_kprintf("+------------+-----+--------+------------+------------+------+-------------+-----+\n");
for (index = 0; index < obj_size; index++)
{
rt_thread_t ptr_t = (rt_thread_t)obj_pointers[index];
if (obj_pointers[index] == RT_NULL)
{
break;
}
rt_uint8_t *ptr = (rt_uint8_t *)ptr_t->stack_addr;
while (*ptr == '#')
ptr ++;
rt_uint8_t stack_used_percent = (ptr_t->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) ptr_t->stack_addr))
* 100/ ptr_t->stack_size;
rt_kprintf("| %10s | %3d ", obj_pointers[index]->name, ptr_t->current_priority);
rt_uint8_t stat = (ptr_t->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");
rt_kprintf("| 0x%08x | 0x%08x | %02d%% | 0x%08x | %03d |\n", ptr_t->stack_addr,
ptr_t->stack_size, stack_used_percent, ptr_t->remaining_tick, ptr_t->error);
}
rt_kprintf("+------------+-----+--------+------------+------------+------+-------------+-----+\n");
rt_free(thread_buf);
}
MSH_CMD_EXPORT(dump_thread_ex, list thread ex);
実行結果
msh />dump_thread_ex
dump_thread_ex: thread count = 5
object init : object size=5
| name | pri | flag | type | stack addr | stack size | used | remain tick |
+------------+-----+------+------+------------+------------+------+-------------+
| tshell | 20 | 0 | 0x01 | 0x20008a70 | 0x00001000 | 07% | 0x00000008 |
| usbd | 8 | 0 | 0x81 | 0x20002714 | 0x00001000 | 04% | 0x00000014 |
| ulog_async | 30 | 0 | 0x01 | 0x20005e98 | 0x00001000 | 34% | 0x00000009 |
| alarmsvc | 10 | 0 | 0x01 | 0x20004c80 | 0x00000800 | 07% | 0x00000005 |
| tidle0 | 31 | 0 | 0x81 | 0x20001c24 | 0x00000800 | 06% | 0x00000006 |
+------------+-----+------+------+------------+------------+------+-------------+
msh />list_th
list_thread
msh />list_thread
thread pri status sp stack size max used left tick error
---------------- --- ------- ---------- ---------- ------ ---------- ---
tshell 20 running 0x0000013c 0x00001000 12% 0x00000009 000
usbd 8 suspend 0x000000a8 0x00001000 04% 0x00000014 000
ulog_async 30 suspend 0x0000007c 0x00001000 34% 0x0000000b 000
alarmsvc 10 suspend 0x0000009c 0x00000800 07% 0x00000005 000
tidle0 31 ready 0x00000078 0x00000800 06% 0x00000012 000
msh />
- スレッドスタックを理解し、メモリオーバーフローなどのエラーのデバッグとトラブルシューティングに使用できるスレッドスタックアドレスの割り当てを理解します。
総括する
- RTスレッドスレッドの構造と操作方法を引き続き研究する必要があります
- カーネルオブジェクトを介して、スレッドスタックのviewメソッドを理解します
- list_deviceなどのRT-Threadカーネルオブジェクトの表示方法に精通している