在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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();
}


審核編輯:符乾江

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

    關注

    5144

    文章

    19596

    瀏覽量

    316107
  • RT
    RT
    +關注

    關注

    0

    文章

    73

    瀏覽量

    40440
  • 線程
    +關注

    關注

    0

    文章

    508

    瀏覽量

    20129
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深度剖析 RT-Thread 線程調度流程

    RT-Thread調度第一個線程的主要流程分如下:rtthread_startup:RTT的啟動函數,主要負責板級驅動,調度器,系統線程初始化,啟動
    的頭像 發表于 06-25 18:24 ?337次閱讀
    深度剖析 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>線程</b>調度流程

    RT-Thread Nano移植后動態創建線程創建不了怎么處理?

    RT-Thread Nano移植后動態創建線程創建不了,靜態可以.直接燒錄DEMO也一樣,將RT_USING_HEAP開起來,使用動態創建就創建不起來,RT_USING_HEAP關掉后
    發表于 06-11 06:36

    請問rt-thread studio如何進行多線程編譯?

    使用 rt-thread studio 在工程配置 C/C++構建->Behavior->parallel build 數量修改,CPU的占用率沒有明顯的改變
    發表于 02-19 08:30

    如何將RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默認支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內容比較簡單但稍有瑣碎,希望對有需要的小伙伴有所幫助。
    的頭像 發表于 02-13 10:37 ?1827次閱讀
    如何將<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    從開源中來到開源中去-RT-Thread北京社區篇

    RT-Thread今年全域推行不同區域社區網,通過建立區域社區網,構建更加緊密聯系的開源社區,實現更廣泛的開源資源共享,讓更多的RT-Thread開發者受益。今年8月份RT-Thread正式
    的頭像 發表于 11-29 01:05 ?437次閱讀
    從開源中來到開源中去-<b class='flag-5'>RT-Thread</b>北京社區篇

    RT-Thread上CAN實踐

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

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

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

    2024 RT-Thread全球巡回 線下培訓火熱來襲!

    親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入式開發的絕佳機會。
    的頭像 發表于 08-07 08:35 ?2685次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!

    【好書推薦】RT-Thread設備驅動開發指南

    近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需求越來越
    的頭像 發表于 08-01 08:35 ?1228次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設備驅動開發指南

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

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

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第一!倉庫地址:https://github.com
    的頭像 發表于 07-04 08:35 ?731次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

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

    使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因為這個lvgl只能移植到標準版里? 嘗試過給lvgl的線程分配更大的棧,但是依舊會卡死在硬件錯誤中斷里。但只要把用戶的ui
    發表于 07-04 07:40
    主站蜘蛛池模板: 日本一本在线视频 | 操碰人人| 59日本人xxxxxxxxx69 | 色偷偷综合网 | 国产免费色视频 | 美女被啪到哭网站在线观看 | 天天操精品 | 国产亚洲papapa| 天天摸天天做天天爽水多 | 日本黄色大片免费观看 | 天天搞一搞 | 亚洲影视网 | 久草亚洲视频 | 日本aaaaa级片 | 女人被狂躁视频网站免费 | 久久精品国产四虎 | 久久99久久精品97久久综合 | 一级片在线免费观看 | 国产成人经典三级在线观看 | 色婷婷综合激情视频免费看 | 四虎影院中文字幕 | 午夜影视免费完整高清在线观看网站 | 日韩在线三级 | 毛片大全高清免费 | 韩国三级日本三级在线观看 | www.妖精视频 | 亚洲性天堂 | 天天艹天天艹 | www.干| 日本三级电影在线观看 | 午夜香蕉网 | 日本加勒比一区 | 在线你懂的视频 | 伊人yinren6综合网色狠狠 | 2019天天操天天干天天透 | 色婷婷5月精品久久久久 | 在线免费看黄的网站 | 亚洲综合成人网在线观看 | 久久精品久 | 天天摸夜夜摸爽爽狠狠婷婷97 | 扒开双腿爽爽爽视频www |