精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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


審核編輯:符乾江

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

    關注

    5069

    文章

    19021

    瀏覽量

    303414
  • RT
    RT
    +關注

    關注

    0

    文章

    73

    瀏覽量

    40007
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19651
收藏 人收藏

    評論

    相關推薦

    RT-Thread上CAN實踐

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

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

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

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

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 05-28 08:35 ?411次閱讀
    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 ?395次閱讀
    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

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

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