就序列表實(shí)現(xiàn)
就序列表實(shí)際上就是一個(gè)數(shù)組,用來存放優(yōu)先級(jí)不同的線程,系統(tǒng)默認(rèn)最大的線程數(shù)量為32個(gè),用戶可自行修改。
線程創(chuàng)建好之后,我們需要把線程添加到就緒列表里面,表示線程已經(jīng)就緒,系統(tǒng)隨時(shí)可以調(diào)度。 就緒列表在scheduler.c中定義(scheduler.c第一次使用需要在rtthread3.0.3src目錄下新建, 然后添加到工程的rtt/source組中)
/* 線程就緒列表*/
rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; // (1)
就緒列表實(shí)際上就是一個(gè)rt_list_t類型的數(shù)組,數(shù)組的大小由決定最大線程優(yōu) 先級(jí)的宏RT_THREAD_PRIORITY_MAX決定,RT_THREAD_PRIORITY_MAX在rtconfig.h中默認(rèn)定義為32。 數(shù)組的下標(biāo)對應(yīng)了線程的優(yōu)先級(jí),同一優(yōu)先級(jí)的線程統(tǒng)一插入到就緒列表的同一條鏈表中。
線程控制塊里面有一個(gè)tlist成員,數(shù)據(jù)類型為rt_list_t,我們將線程插入到就緒列表里面,就是通過將線程控制塊的tlist這個(gè)節(jié)點(diǎn)插入到就緒列表中來實(shí)現(xiàn)的。如果把就緒列表比作是晾衣桿,線程是衣服,那tlist就是晾衣架,每個(gè)線程都自帶晾衣架,就是為了把自己掛在各種不同的鏈表中。
下面在線程中加入就緒列表信息,如下;
/* 初始化線程 */
rt_thread_init( &rt_flag1_thread, /* 線程控制塊 */
flag1_thread_entry, /* 線程入口地址 */
RT_NULL, /* 線程形參 */
&rt_flag1_thread_stack[0], /* 線程棧起始地址 */
sizeof(rt_flag1_thread_stack) ); /* 線程棧大小,單位為字節(jié) */
/* 將線程插入到就緒列表 */
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) ); /* 線程棧大小,單位為字節(jié) */
/* 將線程插入到就緒列表 */
rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );
就緒列表的下標(biāo)對應(yīng)的是線程的優(yōu)先級(jí),但是目前我們的線程還不支持優(yōu)先級(jí),有關(guān)支持多優(yōu)先級(jí)的知識(shí)點(diǎn)我們 后面會(huì)講到,所以flag1和flag2線程在插入到就緒列表的時(shí)候,可以隨便選擇插入的位置。在 代碼清單:線程的定義-21 中,我們選擇將flag1線程插入到就緒列表下標(biāo)為0的鏈表中,flag2線程插入到就緒列表下標(biāo)為1的鏈表中
下一步調(diào)度器初始化:
/* 初始化系統(tǒng)調(diào)度器 */
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]);
}
/* 初始化當(dāng)前線程控制塊指針 */
rt_current_thread ==== RT_NULL;// (3)
}
線程調(diào)度要在硬件初始化之后
int main(void)
{
/* 硬件初始化 */
/* 將硬件相關(guān)的初始化放在這里,如果是軟件仿真則沒有相關(guān)初始化代碼 */
/* 調(diào)度器初始化 */
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) ); /* 線程棧大小,單位為字節(jié) */
/* 將線程插入到就緒列表 */
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) ); /* 線程棧大小,單位為字節(jié) */
/* 將線程插入到就緒列表 */
rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );
/* 啟動(dòng)系統(tǒng)調(diào)度器 */
rt_system_scheduler_start();
}
審核編輯:符乾江
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19126瀏覽量
305247 -
RT
+關(guān)注
關(guān)注
0文章
73瀏覽量
40037 -
線程
+關(guān)注
關(guān)注
0文章
504瀏覽量
19684
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論