国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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


審核編輯:符乾江

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

    關注

    5198

    文章

    20449

    瀏覽量

    334020
  • RT
    RT
    +關注

    關注

    0

    文章

    74

    瀏覽量

    40773
  • 線程
    +關注

    關注

    0

    文章

    509

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于RT-Thread的簡單物聯網溫控箱 | 技術集結

    接入網絡,配套了功能完善的Web可視化監控和調參Dashboard,實現了完整的物聯網閉環。整個項目充分利用了RT-Thread線程、設備驅動框架和網絡組件的能力
    的頭像 發表于 12-26 18:18 ?7257次閱讀
    基于<b class='flag-5'>RT-Thread</b>的簡單物聯網溫控箱 | 技術集結

    代碼里的青春——我與RT-Thread的故事

    從發出RT-Thread20周年故事征集令的第一天起,我們已陸續收到了數十位開發者的投稿。有人凌晨三點在調試線程棧,有人在社區收獲友情,有人靠RTT拿下比賽順利上岸……今天我們選出幾篇極具代表性
    的頭像 發表于 12-12 20:11 ?1080次閱讀
    代碼里的青春——我與<b class='flag-5'>RT-Thread</b>的故事

    使用rt_thread無法輸出PWM怎么解決?

    ;, pwm_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果獲得
    發表于 10-14 07:05

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

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

    線程問題,線程已經創建成功了,為什么線程調用的函數不會運行呢?

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

    切換線程后中斷被屏蔽怎么解決?

    我在將RT-thread移植到cortex-a7平臺上,版本是rt-thread-5.1.0,參考的bsp是qemu-vexpress-a9。 目前可以啟動到主線程上,具體是高優先級的
    發表于 09-29 07:48

    2025年RT-Thread開發者巡回培訓報名正式啟動

    親愛的RT-Thread社區成員們:新程再啟,共赴熱愛!2025年RT-Thread開發者巡回培訓正式啟動報名!今年,我們選擇了西安、武漢、北京、杭州、深圳、上海、成都這7座城市,為大家帶來
    的頭像 發表于 09-27 10:39 ?1966次閱讀
    2025年<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關掉
    發表于 09-19 06:28

    rtthread一直卡在rt_thread_idle_entry()的原因?

    我上面的代碼中如果加入rt_thread_delay就一直卡在rt_thread_idle_entry空閑線程,如果去掉rt_thread_delay就能正常打印,請問這是怎么回事。
    發表于 09-12 08:13

    線程刪除時遇到斷言,是什么原因導致的?

    不足? (rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread) assertion failed at
    發表于 09-12 06:08

    線程中調用rt_thread_mdelay()函數卡死的原因?怎么解決?

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

    rt-thread線程調用rt_thread_mdelay延時后再恢復運行時thread會變,導致mutex釋放失敗,怎么解決?

    代碼片段如下: 運行結果: 可以看到,在線程延時后,再恢復運行時,用rt_thread_self函數獲取到的值與沒有延時時獲取到的值不一樣了,導致mutex無法釋放,其它等待這個mutex的線程都無法運行了,應該怎么處理這個
    發表于 09-09 08:06

    如何移植 RT-Thread Nano 并創建 2 個線程

    基于 BSP 中的 GPIO_OutputInput 演示,展示了如何移植 RT-Thread Nano 并創建 2 個線程
    發表于 08-19 07:45

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

    RT-Thread調度第一個線程的主要流程分如下:rtthread_startup:RTT的啟動函數,主要負責板級驅動,調度器,系統線程初始化,啟動
    的頭像 發表于 06-25 18:24 ?1769次閱讀
    深度剖析 <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