0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT—thread線程啟動(dòng)詳解

嵌入式應(yīng)用開發(fā) ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-05-19 16:17 ? 次閱讀

就序列表實(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)對(duì)應(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)對(duì)應(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的鏈表中

pYYBAGKGBKOAViENAAE-ZdN1xto145.png

下一步調(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();
}


審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302042
  • RT
    RT
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    39988
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    503

    瀏覽量

    19636
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    開源共生 商業(yè)共贏 | RT-Thread 2024開發(fā)者大會(huì)報(bào)名啟動(dòng)!

    親愛的RT-Thread開發(fā)者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發(fā)者大會(huì))正式啟動(dòng)報(bào)名!2024
    的頭像 發(fā)表于 10-29 08:06 ?157次閱讀
    開源共生 商業(yè)共贏 | <b class='flag-5'>RT-Thread</b> 2024開發(fā)者大會(huì)報(bào)名<b class='flag-5'>啟動(dòng)</b>!

    Nordic-RT-Thread5.1.0移植筆記

    Nordic-RT-Thread5.1.0移植筆記
    的頭像 發(fā)表于 10-16 08:09 ?268次閱讀
    Nordic-<b class='flag-5'>RT-Thread</b>5.1.0移植筆記

    線程創(chuàng)建成功了,為啥ai_thread_entry()函數(shù)不運(yùn)行呢?

    _t thread = rt_thread_create(\"ai\", ai_thread_entry, RT_NULL, 1024, 28, 30); /* 創(chuàng)建成功則
    發(fā)表于 09-27 09:35

    stm32cubmx生成的makefile編譯無法啟動(dòng)線程怎么解決?

    stm32cubmx生成的makefile編譯無法啟動(dòng)線程,rt_thread_startup返回 RT_EOK無錯(cuò)誤 但是使用生成的 keil工程編譯就沒問題, 板子是 stm32f
    發(fā)表于 09-27 09:27

    使用rt_thread_mdelay函數(shù)后出現(xiàn)hardfault的原因?

    問題:在一個(gè)線程中共有前后2部分使用rt_thread_mdelay()進(jìn)行延時(shí)等待,前面部分延時(shí)是正常的,后面部分進(jìn)入rt_thread_mdelay()函數(shù)后立馬打印hardfault錯(cuò)誤,定位
    發(fā)表于 07-16 07:07

    6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 05-28 08:35 ?387次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 04-16 08:35 ?382次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    rt-thread是如何在線程運(yùn)行結(jié)束后識(shí)別到的呢?

    _mdelay(1000); } return RT_EOK; } 總所周知,main本身就是rt-thread創(chuàng)建的線程,我在這個(gè)線程中創(chuàng)建了一個(gè)新的
    發(fā)表于 03-22 08:20

    RT-thread中運(yùn)行了好多個(gè)線程,有的線程很長(zhǎng)時(shí)間不執(zhí)行是什么原因?

    RT-thread中運(yùn)行了好多個(gè)線程,有的線程很長(zhǎng)時(shí)間不執(zhí)行,通過什么方式知道線程因?yàn)槭裁丛蜃枞?/div>
    發(fā)表于 03-22 06:48

    線程中調(diào)用rt_thread_mdelay()函數(shù)程序卡死了怎么解決?

    線程中調(diào)用rt_thread_mdelay()函數(shù)程序卡死。搞了兩天也不知道問題出在哪,怎么解決。 int main(void) { interrupt_config
    發(fā)表于 02-26 08:39

    使用rt_thread nano有辦法查看線程的資源占用情況嗎?

    使用rt_thread nano ,有辦法查看線程的資源占用情況麼?
    發(fā)表于 02-26 06:05

    RT-Thread Nano在調(diào)用rt_thread_control時(shí),修改線程優(yōu)先級(jí)一直不執(zhí)行的原因?如何解決?

    RT-Thread Nano在調(diào)用rt_thread_control時(shí),修改線程優(yōu)先級(jí)一直不執(zhí)行
    發(fā)表于 02-23 07:32

    psoc62-wifi-bt 在rt thread啟動(dòng)thread失敗,如何增加heap空間?

    psoc62-wifi-bt在rt thread啟動(dòng)thread 失敗, 如何增加heap 空間? tid = rt_thread_c
    發(fā)表于 02-21 07:58

    如何設(shè)定RTOS中的任務(wù)棧(線程棧)大小呢?

    首先說明的是,在 `RT-Thread` 中,將本文提及的 `任務(wù)` 稱之為 `線程`。
    的頭像 發(fā)表于 12-01 16:40 ?1596次閱讀

    RT-Thread Nano入門:獨(dú)立看門狗(IWDT)

    本文主要介紹怎么用RT-Thread Nano實(shí)現(xiàn)獨(dú)立看門狗IWDT驅(qū)動(dòng),創(chuàng)建一個(gè)喂狗線程,實(shí)現(xiàn)定時(shí)喂狗功能。
    的頭像 發(fā)表于 11-22 11:04 ?2093次閱讀
    <b class='flag-5'>RT-Thread</b> Nano入門:獨(dú)立看門狗(IWDT)