RT-Threadはじめに研究ノート-削除できないスレッドを作成する

序文

  • RT-Threadのカーネルコンポーネントとスレッド管理を学んだ後、私は突然、スレッドが作成されるときに、名前がRT_NULLを使用できることを発見しました。
  • 名前のないスレッドを作成します。正常に機能しますが、削除できません

 

関連コード

#include <rtthread.h>

#define DBG_SECTION_NAME    "noname"
#define DBG_LEVEL           DBG_LOG
#include <rtdbg.h>

 /* led test */
extern void led_red_on(void);
extern void led_red_off(void);
extern void led_grn_on(void);
extern void led_grn_off(void);
extern void led_blu_on(void);
extern void led_blu_off(void);

/* no name thread1 */
static void no_name_task1(void* param)
{
    LOG_D("no name thread1 start!\n");

    while (1)
    {
        led_red_on();
        rt_thread_mdelay(2000);
        led_red_off();
        rt_thread_mdelay(2000);
    }
}

/* no name thread2 */
static void no_name_task2(void* param)
{
    LOG_D("no name thread2 start!\n");

    while (1)
    {
        led_blu_on();
        rt_thread_mdelay(3000);
        led_blu_off();
        rt_thread_mdelay(3000);
    }
}

/* no name thread3 */
static void no_name_task3(void* param)
{
    LOG_D("no name thread3 start!\n");

    while (1)
    {
        led_grn_on();
        rt_thread_mdelay(4000);
        led_grn_off();
        rt_thread_mdelay(4000);
    }
}

void no_name_init(void)
{
    rt_thread_t tid;

    tid = rt_thread_create(RT_NULL, no_name_task1, RT_NULL, 2048, 28, 50);
    rt_thread_startup(tid);

    tid = rt_thread_create(RT_NULL, no_name_task2, RT_NULL, 2048, 28, 50);
    rt_thread_startup(tid);

    tid = rt_thread_create(RT_NULL, no_name_task3, RT_NULL, 2048, 28, 50);
    rt_thread_startup(tid);
}

void no_name_del(void)
{
    rt_thread_t tid;

    tid = rt_thread_find(RT_NULL);
    if (tid != RT_NULL)
    {
        rt_thread_delete (tid);
    }
    else
    {
        LOG_D("Not find thread!");
    }
}

MSH_CMD_EXPORT(no_name_init, no_name_init);
MSH_CMD_EXPORT(no_name_del, no_name_del);
msh >no_name_init
msh >[D/noname] no name thread1 start!

[D/noname] no name thread2 start!

[D/noname] no name thread3 start!


msh >list_thread
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---                                                                                      
         28  suspend 0x0000007c 0x00000800    07%   0x0000002e 000                                                                                        
         28  suspend 0x0000007c 0x00000800    07%   0x0000002e 000                                                                                         
         28  suspend 0x0000007c 0x00000800    07%   0x0000002e 000
pms       28  suspend 0x0000009c 0x00000800    07%   0x0000002f 000
tshell    20  running 0x00000084 0x00001000    12%   0x00000005 000
serial    25  suspend 0x00000088 0x00000400    13%   0x0000000a 000
tidle0    31  ready   0x00000080 0x00000800    06%   0x00000016 000
timer      4  suspend 0x00000060 0x00000200    18%   0x00000009 000
msh >

msh >no_name_del
[D/noname] Not find thread!

 

解釈

  • カーネルオブジェクトが初期化されるときに名前の長さが判断されないため、名前のないスレッドを作成できます
  • カーネルオブジェクトは名前で検索されるため、名前のないスレッドを削除することはできません。

 

総括する

  • RT-Threadカーネルコード、スレッド管理コードの研究を継続し、RT-Threadを正しく使用する必要があります
  • 基本的な理論的知識の蓄積を深めます。

おすすめ

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