就序列表實現
就序列表實際上就是一個數組,用來存放優先級不同的線程,系統默認最大的線程數量為32個,用戶可自行修改。
線程創建好之后,我們需要把線程添加到就緒列表里面,表示線程已經就緒,系統隨時可以調度。 就緒列表在scheduler.c中定義(scheduler.c第一次使用需要在rtthread3.0.3src目錄下新建, 然后添加到工程的rtt/source組中)
/* 線程就緒列表*/
rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; // (1)
就緒列表實際上就是一個rt_list_t類型的數組,數組的大小由決定最大線程優 先級的宏RT_THREAD_PRIORITY_MAX決定,RT_THREAD_PRIORITY_MAX在rtconfig.h中默認定義為32。 數組的下標對應了線程的優先級,同一優先級的線程統一插入到就緒列表的同一條鏈表中。
線程控制塊里面有一個tlist成員,數據類型為rt_list_t,我們將線程插入到就緒列表里面,就是通過將線程控制塊的tlist這個節點插入到就緒列表中來實現的。如果把就緒列表比作是晾衣桿,線程是衣服,那tlist就是晾衣架,每個線程都自帶晾衣架,就是為了把自己掛在各種不同的鏈表中。
下面在線程中加入就緒列表信息,如下;
/* 初始化線程 */
rt_thread_init( &rt_flag1_thread, /* 線程控制塊 */
flag1_thread_entry, /* 線程入口地址 */
RT_NULL, /* 線程形參 */
&rt_flag1_thread_stack[0], /* 線程棧起始地址 */
sizeof(rt_flag1_thread_stack) ); /* 線程棧大小,單位為字節 */
/* 將線程插入到就緒列表 */
rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );
/* 初始化線程 */
rt_thread_init( &rt_flag2_thread, /* 線程控制塊 */
flag2_thread_entry, /* 線程入口地址 */
RT_NULL, /* 線程形參 */
&rt_flag2_thread_stack[0], /* 線程棧起始地址 */
sizeof(rt_flag2_thread_stack) ); /* 線程棧大小,單位為字節 */
/* 將線程插入到就緒列表 */
rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );
就緒列表的下標對應的是線程的優先級,但是目前我們的線程還不支持優先級,有關支持多優先級的知識點我們 后面會講到,所以flag1和flag2線程在插入到就緒列表的時候,可以隨便選擇插入的位置。在 代碼清單:線程的定義-21 中,我們選擇將flag1線程插入到就緒列表下標為0的鏈表中,flag2線程插入到就緒列表下標為1的鏈表中

下一步調度器初始化:
/* 初始化系統調度器 */
void rt_system_scheduler_init(void)
{
register rt_base_t offset;// (1)
/* 線程就緒列表初始化 */
for (offset ==== 0; offset < RT_THREAD_PRIORITY_MAX; offset ++)// (2)
{
rt_list_init(&rt_thread_priority_table[offset]);
}
/* 初始化當前線程控制塊指針 */
rt_current_thread ==== RT_NULL;// (3)
}
線程調度要在硬件初始化之后
int main(void)
{
/* 硬件初始化 */
/* 將硬件相關的初始化放在這里,如果是軟件仿真則沒有相關初始化代碼 */
/* 調度器初始化 */
rt_system_scheduler_init();
/* 初始化線程 */
rt_thread_init( &rt_flag1_thread, /* 線程控制塊 */
flag1_thread_entry, /* 線程入口地址 */
RT_NULL, /* 線程形參 */
&rt_flag1_thread_stack[0], /* 線程棧起始地址 */
sizeof(rt_flag1_thread_stack) ); /* 線程棧大小,單位為字節 */
/* 將線程插入到就緒列表 */
rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );
/* 初始化線程 */
rt_thread_init( &rt_flag2_thread, /* 線程控制塊 */
flag2_thread_entry, /* 線程入口地址 */
RT_NULL, /* 線程形參 */
&rt_flag2_thread_stack[0], /* 線程棧起始地址 */
sizeof(rt_flag2_thread_stack) ); /* 線程棧大小,單位為字節 */
/* 將線程插入到就緒列表 */
rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );
/* 啟動系統調度器 */
rt_system_scheduler_start();
}
審核編輯:符乾江
-
嵌入式
+關注
關注
5198文章
20449瀏覽量
334020 -
RT
+關注
關注
0文章
74瀏覽量
40773 -
線程
+關注
關注
0文章
509瀏覽量
20826
發布評論請先 登錄
基于RT-Thread的簡單物聯網溫控箱 | 技術集結
代碼里的青春——我與RT-Thread的故事
使用rt_thread無法輸出PWM怎么解決?
rt-thread studio 如何進行多線程編譯?
線程問題,線程已經創建成功了,為什么線程調用的函數不會運行呢?
切換線程后中斷被屏蔽怎么解決?
2025年RT-Thread開發者巡回培訓報名正式啟動!
RT—thread線程啟動詳解
評論