就序列表實現
就序列表實際上就是一個數組,用來存放優先級不同的線程,系統默認最大的線程數量為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();
}
審核編輯:符乾江
-
嵌入式
+關注
關注
5069文章
19021瀏覽量
303414 -
RT
+關注
關注
0文章
73瀏覽量
40007 -
線程
+關注
關注
0文章
504瀏覽量
19651
發布評論請先 登錄
相關推薦
評論