RT-Thread 學習筆記:一、通俗易懂學會創建線程

任務:

  1. 在多線程操作系統中,需要開發人員把一個複雜的應用分解成多個小的、可調度的、序列化的程序單元。
  2. 線程中不能陷入死循環操作,必須要有讓出 CPU 使用權的動作,如循環中調用延時函數或者主動掛起。
  3. 在空閒線程運行時可以調用鉤子函數,合適鉤入功耗管理、看門狗喂狗等工作。

優先級:

  1. 重要的任務可設置相對較高的優先級,非重要的任務可以設置較低的優先級,不用的任務還可以設置相同的優先級,輪流運行。
  2. RT-Thread 最大支持 256 個線程優先級,數值越小的優先級越高,0 爲最高優先級。

調度:

  1. 當一個運行着的線程使一個比它優先級高的線程滿足運行條件,當前線程的 CPU 使用權被讓出,高優先級的線程立刻得到了 CPU 的使用權。
  2. 如果是中斷服務程序使一個高優先級的線程滿足運行條件,中斷完成時,被中斷的線程掛起,優先級高的線程開始運行。
  3. 當調度器調度線程切換時,先將當前線程上下文保存起來,當再切回到這個線程時,線程調度器將該線程的上下文信息恢復。

創建動態線程

/* 1. 線程棧(字節) */
#define THREAD_STACK_SIZE       512
/* 2. 線程優先級 */
#define THREAD_PRIORITY         25
/* 3. 時間片(tick) */
#define THREAD_TIMESLICE        5

/* 4. 動態線程句柄 */
static rt_thread_t tid1 = RT_NULL;

/* 5. 線程 1 的入口函數 */
static void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;

    while (1)
    {
        /* 線程 1 採用低優先級運行,一直打印計數值 */
        rt_kprintf("thread1 count: %d\n", count ++);
        rt_thread_mdelay(500);
    }
}

初始化靜態線程

/* 靜態線程特有,線程棧初始化 */
static char thread2_stack[1024];
/* 注意句柄類型,區別於動態線程 */
static struct rt_thread thread2;
/* 線程 2 入口函數 */
static void thread2_entry(void *param)
{
    rt_uint32_t count = 0;

    /* 線程 2 擁有較高的優先級,以搶佔線程 1 而獲得執行 */
    for (count = 0; count < 10 ; count++)
    {
        /* 線程 2 打印計數值 */
        rt_kprintf("thread2 count: %d\n", count);
    }
    rt_kprintf("thread2 exit\n");
    /* 線程 2 運行結束後也將自動被系統脫離 */
}

創建線程

/* 線程示例 */
int thread_sample(void)
{
    /* 創建線程 1,名稱是 thread1,入口是 thread1_entry*/
    tid1 = rt_thread_create("thread1",
                            thread1_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY, THREAD_TIMESLICE);

    /* 如果獲得線程控制塊,啓動這個線程 */
    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);

    /* 初始化線程 2,名稱是 thread2,入口是 thread2_entry */
    rt_thread_init(&thread2,	 //有取地址符
                   "thread2",
                   thread2_entry,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),
                   THREAD_PRIORITY - 1, THREAD_TIMESLICE);
    rt_thread_startup(&thread2);  //有取地址符

    return 0;
}

/* 導出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_sample, thread sample);

——END——

在這裏插入圖片描述

歡迎掃描上方二維碼,獲取更多編程技巧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章