chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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)注

    5198

    文章

    20442

    瀏覽量

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

    關(guān)注

    0

    文章

    74

    瀏覽量

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

    關(guān)注

    0

    文章

    509

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于RT-Thread的簡(jiǎn)單物聯(lián)網(wǎng)溫控箱 | 技術(shù)集結(jié)

    接入網(wǎng)絡(luò),配套了功能完善的Web可視化監(jiān)控和調(diào)參Dashboard,實(shí)現(xiàn)了完整的物聯(lián)網(wǎng)閉環(huán)。整個(gè)項(xiàng)目充分利用了RT-Thread線程、設(shè)備驅(qū)動(dòng)框架和網(wǎng)絡(luò)組件的能力
    的頭像 發(fā)表于 12-26 18:18 ?7234次閱讀
    基于<b class='flag-5'>RT-Thread</b>的簡(jiǎn)單物聯(lián)網(wǎng)溫控箱 | 技術(shù)集結(jié)

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

    從發(fā)出RT-Thread20周年故事征集令的第一天起,我們已陸續(xù)收到了數(shù)十位開發(fā)者的投稿。有人凌晨三點(diǎn)在調(diào)試線程棧,有人在社區(qū)收獲友情,有人靠RTT拿下比賽順利上岸……今天我們選出幾篇極具代表性
    的頭像 發(fā)表于 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); /* 如果獲得
    發(fā)表于 10-14 07:05

    rt-thread studio 如何進(jìn)行多線程編譯?

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

    線程問題,線程已經(jīng)創(chuàng)建成功了,為什么線程調(diào)用的函數(shù)不會(huì)運(yùn)行呢?

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

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

    我在將RT-thread移植到cortex-a7平臺(tái)上,版本是rt-thread-5.1.0,參考的bsp是qemu-vexpress-a9。 目前可以啟動(dòng)到主線程上,具體是高優(yōu)先級(jí)的
    發(fā)表于 09-29 07:48

    2025年RT-Thread開發(fā)者巡回培訓(xùn)報(bào)名正式啟動(dòng)

    親愛的RT-Thread社區(qū)成員們:新程再啟,共赴熱愛!2025年RT-Thread開發(fā)者巡回培訓(xùn)正式啟動(dòng)報(bào)名!今年,我們選擇了西安、武漢、北京、杭州、深圳、上海、成都這7座城市,為大家?guī)?/div>
    的頭像 發(fā)表于 09-27 10:39 ?1962次閱讀
    2025年<b class='flag-5'>RT-Thread</b>開發(fā)者巡回培訓(xùn)報(bào)名正式<b class='flag-5'>啟動(dòng)</b>!

    RT-Thread Nano移植后動(dòng)態(tài)創(chuàng)建線程創(chuàng)建不了怎么解決?

    RT-Thread Nano 移植后動(dòng)態(tài)創(chuàng)建線程創(chuàng)建不了,靜態(tài)可以.直接燒錄DEMO也一樣,將RT_USING_HEAP開起來,使用動(dòng)態(tài)創(chuàng)建就創(chuàng)建不起來,RT_USING_HEAP關(guān)掉
    發(fā)表于 09-19 06:28

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

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

    線程刪除時(shí)遇到斷言,是什么原因?qū)е碌模?/a>

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

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

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

    rt-thread線程調(diào)用rt_thread_mdelay延時(shí)后再恢復(fù)運(yùn)行時(shí)thread會(huì)變,導(dǎo)致mutex釋放失敗,怎么解決?

    代碼片段如下: 運(yùn)行結(jié)果: 可以看到,在線程延時(shí)后,再恢復(fù)運(yùn)行時(shí),用rt_thread_self函數(shù)獲取到的值與沒有延時(shí)時(shí)獲取到的值不一樣了,導(dǎo)致mutex無法釋放,其它等待這個(gè)mutex的線程都無法運(yùn)行了,應(yīng)該怎么處理這個(gè)
    發(fā)表于 09-09 08:06

    如何移植 RT-Thread Nano 并創(chuàng)建 2 個(gè)線程?

    基于 BSP 中的 GPIO_OutputInput 演示,展示了如何移植 RT-Thread Nano 并創(chuàng)建 2 個(gè)線程。
    發(fā)表于 08-19 07:45

    深度剖析 RT-Thread 線程調(diào)度流程

    RT-Thread調(diào)度第一個(gè)線程的主要流程分如下:rtthread_startup:RTT的啟動(dòng)函數(shù),主要負(fù)責(zé)板級(jí)驅(qū)動(dòng),調(diào)度器,系統(tǒng)線程初始化,啟動(dòng)
    的頭像 發(fā)表于 06-25 18:24 ?1767次閱讀
    深度剖析 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>線程</b>調(diào)度流程

    RT-Thread Nano移植后動(dòng)態(tài)創(chuàng)建線程創(chuàng)建不了怎么處理?

    RT-Thread Nano移植后動(dòng)態(tài)創(chuàng)建線程創(chuàng)建不了,靜態(tài)可以.直接燒錄DEMO也一樣,將RT_USING_HEAP開起來,使用動(dòng)態(tài)創(chuàng)建就創(chuàng)建不起來,RT_USING_HEAP關(guān)掉后
    發(fā)表于 06-11 06:36