天天看點

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!

           

解讀

  • 之所能建立無名的線程,因為核心對象初始化時,并不判斷name的長度
  • 之所無法删除沒有名字的線程,是因為核心對象的查找,是用名字來查找的。

總結

  • 需要繼續研究RT-Thread核心代碼、線程管理代碼,正确使用RT-Thread
  • 加深基礎理論知識的積累。

繼續閱讀