RT-Threadはじめに研究ノート-スレッドスタックのアドレスを表示する

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カーネルオブジェクトの表示方法に精通している

おすすめ

転載: blog.csdn.net/tcjy1000/article/details/113854463