色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RT—thread線程啟動詳解

嵌入式應用開發 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-05-19 16:17 ? 次閱讀

就序列表實現

就序列表實際上就是一個數組,用來存放優先級不同的線程,系統默認最大的線程數量為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的鏈表中

pYYBAGKGBKOAViENAAE-ZdN1xto145.png

下一步調度器初始化:

/* 初始化系統調度器 */
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();
}


審核編輯:符乾江

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5082

    文章

    19111

    瀏覽量

    304847
  • RT
    RT
    +關注

    關注

    0

    文章

    73

    瀏覽量

    40027
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19676
收藏 人收藏

    評論

    相關推薦

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動
    的頭像 發表于 11-13 01:03 ?1150次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動

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

    Nordic-RT-Thread5.1.0移植筆記

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

    線程創建成功了,為啥ai_thread_entry()函數不運行呢?

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

    stm32cubmx生成的makefile編譯無法啟動線程怎么解決?

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

    使用rt_thread_mdelay函數后出現hardfault的原因?

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

    lvgl移植到RT-Thread Nano后進入硬件錯誤中斷的原因?

    使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因為這個lvgl只能移植到標準版里? 嘗試過給lvgl的線程分配更大的棧,但是依舊會卡死在硬件錯誤中斷里。但只要把用戶的ui
    發表于 07-04 07:40

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

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 05-28 08:35 ?442次閱讀
    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平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 04-16 08:35 ?417次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    rt-thread是如何在線程運行結束后識別到的呢?

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

    RT-thread中運行了好多個線程,有的線程很長時間不執行是什么原因?

    RT-thread中運行了好多個線程,有的線程很長時間不執行,通過什么方式知道線程因為什么原因阻塞
    發表于 03-22 06:48

    線程中調用rt_thread_mdelay()函數程序卡死了怎么解決?

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

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

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

    RT-Thread Nano在調用rt_thread_control時,修改線程優先級一直不執行的原因?如何解決?

    RT-Thread Nano在調用rt_thread_control時,修改線程優先級一直不執行
    發表于 02-23 07:32

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

    psoc62-wifi-bt在rt thread啟動thread 失敗, 如何增加heap 空間? tid = rt_thread_c
    發表于 02-21 07:58
    主站蜘蛛池模板: 欧美丰满白嫩bbxx| 13小箩利洗澡无码视频APP| 十七岁日本免费完整版BD| 欧美精品3atv一区二区三区| 精品人妻伦九区久久AAA片69| 国产精品久久久久久久A片冻果| 99在线观看精品| 91精品国产色综合久久| 最近日本字幕免费高清| 在线欧美免费人成视频| 伊人久久精品午夜| 在线观看免费视频a| 在线观看亚洲免费人成网址| 一个人HD在线观看免费高清视频 | 胸太大被男同桌吃好爽| 十分钟视频影院免费| 日本免费一区二区三区最新vr| 蜜芽一二三区| 男生扒开美女尿口戳戳| 欧美亚洲日本日韩在线| 日本高清免费观看| 无套日出白浆在线播放| 亚洲国产成人精品不卡青青草原| 亚洲精品在线不卡| 找老女人泻火对白自拍| 34g污奶绵uk甩奶| 99热久久久无码国产精品性麻豆 | 色小说在线| 亚洲AV久久无码精品九九软件| 亚洲最大成人| 97在线精品视频免费| 公交车被CAO到合不拢腿| 国产在线观看99| 乱精品一区字幕二区| 日产国产欧美韩国在线| 亚洲乱码国产乱码精品精98| 97人人爽人人爽人人人片AV| 国产AV精品久久久毛片| 久久人妻熟女中文字幕AV蜜芽| 欧美精品XXXXBBBB| 亚洲欧美日韩在线码不卡|