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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-thread線程切換原理與實(shí)現(xiàn)

嵌入式應(yīng)用開(kāi)發(fā) ? 來(lái)源:嵌入式應(yīng)用開(kāi)發(fā) ? 作者:嵌入式應(yīng)用開(kāi)發(fā) ? 2022-06-16 15:12 ? 次閱讀

RTThread官網(wǎng)看一下,可以發(fā)現(xiàn)【rt_thread_suspend】的函數(shù)說(shuō)明中,特意的說(shuō)明了這個(gè)函數(shù)不能通過(guò)A線程掛起B(yǎng)線程。

pYYBAGKq1YiAUjkMAAMDV6QlYek464.png

翻開(kāi)源碼看一下,在這個(gè)函數(shù)中有這么一個(gè)判斷,會(huì)判斷需要掛起線程的狀態(tài),如果線程不等于就緒態(tài)那么就不會(huì)進(jìn)入掛起,而sleep,delay等函數(shù)都會(huì)導(dǎo)致線程的掛起,那么其他線程想要掛起這個(gè)線程肯定會(huì)掉到這個(gè)if里面,從而掛起不了這個(gè)線程。

pYYBAGKq1cSAXT4GAAJS8yyvsss326.png

這里有兩個(gè)解決思路,一個(gè)是通過(guò) rt_thread_detach(&thread)刪除線程的方法實(shí)現(xiàn),另外一個(gè)就是定義一個(gè)暫停信號(hào)量,然后在需要暫停的線程中去不停的監(jiān)測(cè)這個(gè)信號(hào)量,當(dāng)接收到信號(hào)量時(shí),自己主動(dòng)掛起線程并讓出CPU,這樣就可以實(shí)現(xiàn)暫停線程,而且還能夠知道線程暫停在哪,下面就第二個(gè)思路進(jìn)行的代碼實(shí)現(xiàn)如下:

#include 
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t a_thread_stack[ 512 ];
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t b_thread_stack[ 512 ];
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t c_thread_stack[ 512 ];
static struct rt_thread a_thread;
static struct rt_thread b_thread;
static struct rt_thread c_thread;
static rt_sem_t b_pause_sem = RT_NULL;
static rt_sem_t c_pause_sem = RT_NULL;
static void a_thread_entry(void *parameter)
{
   unsigned int count = 0;
   while (1)
   {
       count++;
       if(count == 10)
       {
           rt_kprintf("b start!\n");
           rt_thread_startup(&b_thread);   //開(kāi)始掃地
       }
       else if(count == 30)
       {
           rt_kprintf("b pause!\n");
           rt_sem_release(b_pause_sem);//rt_thread_suspend(&b_thread);   //停止掃地
           rt_kprintf("c start!\n");
           rt_thread_startup(&c_thread);   //開(kāi)始洗碗
       }
       else if(count == 50)
       {
           rt_kprintf("c pause!\n");
           rt_sem_release(c_pause_sem);//rt_thread_suspend(&c_thread);   //停止洗碗
           rt_kprintf("b start!\n");
           rt_thread_resume(&b_thread);    //開(kāi)始掃地
       }
       rt_thread_delay(100);
   }
}
static void b_thread_entry(void *parameter)
{
   unsigned int count = 0;
   while (1)
   {
       rt_kprintf("b thread run!\n");
       rt_thread_delay(300);
       if(rt_sem_take(b_pause_sem, 0) == RT_EOK)
       {
           rt_thread_suspend(&b_thread);   //停止掃地
           rt_schedule();
       }
   }
}
static void c_thread_entry(void *parameter)
{
   unsigned int count = 0;
   while (1)
   {
       rt_kprintf("c thread run!\n");
       rt_thread_delay(100);
       if(rt_sem_take(c_pause_sem, 0) == RT_EOK)
       {
           rt_thread_suspend(&c_thread);   //停止掃地
           rt_schedule();
       }
   }
}
int pause_thread_init(void)
{
   rt_err_t result;
  
   b_pause_sem = rt_sem_create("b_pause", 0, RT_IPC_FLAG_PRIO);
  
   c_pause_sem = rt_sem_create("c_pause", 0, RT_IPC_FLAG_PRIO);
   /* init led thread */
   result = rt_thread_init(&a_thread,
                           "a_thread",
                           a_thread_entry,
                           RT_NULL,
                           (rt_uint8_t *)&a_thread_stack[0],
                           sizeof(a_thread_stack),
                           5,
                           5);
                          
   if (result == RT_EOK)
   {
       rt_thread_startup(&a_thread);
   }
  
   /* init led thread */
   result = rt_thread_init(&b_thread,
                           "b_thread",
                           b_thread_entry,
                           RT_NULL,
                           (rt_uint8_t *)&b_thread_stack[0],
                           sizeof(b_thread_stack),
                           6,
                           5);
                          
  
   /* init led thread */
   result = rt_thread_init(&c_thread,
                           "c_thread",
                           c_thread_entry,
                           RT_NULL,
                           (rt_uint8_t *)&c_thread_stack[0],
                           sizeof(c_thread_stack),
                           7,
                           5);
                          
   return 0;
}
/* 導(dǎo)出到 msh 命令列表中 */
MSH_CMD_EXPORT(pause_thread_init, pause thread);


審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4364

    瀏覽量

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

    關(guān)注

    0

    文章

    507

    瀏覽量

    20015
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    41422
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread記錄(三、RT-Thread線程操作函數(shù))

    講完了RT-Thread開(kāi)發(fā)環(huán)境,啟動(dòng)流程,啟動(dòng)以后當(dāng)然是開(kāi)始跑線程了,那么自然我們得學(xué)會(huì)如何創(chuàng)建線程以及線程的有關(guān)操作。
    的頭像 發(fā)表于 06-20 00:31 ?7476次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(三、<b class='flag-5'>RT-Thread</b><b class='flag-5'>線程</b>操作函數(shù))

    什么是RT-Thread線程管理看完你就懂了

    可由用戶掛接一些數(shù)據(jù)信息到線程控制塊中,以提供類似線程私有數(shù)據(jù)的實(shí)現(xiàn)線程重要屬性線程RT-Thre
    發(fā)表于 03-29 06:16

    RT-Thread線程簡(jiǎn)介

    文章目錄RT-Thread線程簡(jiǎn)介源碼分析初始化線程線程脫離啟動(dòng)線程掛起線程
    發(fā)表于 08-24 07:56

    RT-Thread代碼啟動(dòng)與線程切換過(guò)程的實(shí)現(xiàn)

    的,換一下函數(shù)名就好了2、RT-Thread線程切換過(guò)程首先查看RT-Thread內(nèi)核架構(gòu)這一章節(jié),明白RT-Thread鏈表及
    發(fā)表于 04-25 11:38

    【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集

    開(kāi)發(fā)板的詳細(xì)步驟例程stm32裸機(jī)RTthread開(kāi)始創(chuàng)建線程詳解基于標(biāo)準(zhǔn)庫(kù)的keil移植到RT-thread例程RT-thread
    發(fā)表于 07-26 14:56

    RT-Thread學(xué)習(xí)筆記 --(6)RT-Thread線程間通信學(xué)習(xí)過(guò)程總結(jié)

    前兩篇文章總結(jié)了RT-Thread線程以及多線程同步的學(xué)習(xí)過(guò)程,關(guān)于前兩篇學(xué)習(xí)總結(jié),可以查看之前的文章。
    發(fā)表于 01-25 18:50 ?7次下載
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 --(6)<b class='flag-5'>RT-Thread</b><b class='flag-5'>線程</b>間通信學(xué)習(xí)過(guò)程總結(jié)

    RTthread線程調(diào)度詳解

    系統(tǒng)調(diào)度就是在就緒列表中尋找優(yōu)先級(jí)最高的就緒線程,然后去執(zhí)行該線程。但是目前我們還不支持優(yōu)先級(jí), 僅實(shí)現(xiàn)兩個(gè)線程輪流切換,系統(tǒng)調(diào)度函數(shù)
    的頭像 發(fā)表于 05-19 17:07 ?2726次閱讀

    RT-Thread全球技術(shù)大會(huì):RT-Thread對(duì)POSIX的實(shí)現(xiàn)情況介紹

    RT-Thread全球技術(shù)大會(huì):RT-Thread對(duì)POSIX的實(shí)現(xiàn)情況介紹 ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:52 ?2061次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b>對(duì)POSIX的<b class='flag-5'>實(shí)現(xiàn)</b>情況介紹

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    聯(lián)網(wǎng)操作系統(tǒng)。 RT-Thread 概述 RT-Thread,全稱是 Real Time-Thread,顧名思義,它是一個(gè)嵌入式實(shí)時(shí)多線程
    的頭像 發(fā)表于 07-09 11:27 ?4799次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

    RT-Thread文檔_RT-Thread 簡(jiǎn)介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡(jiǎn)介

    RT-Thread文檔_線程管理

    RT-Thread文檔_線程管理
    發(fā)表于 02-22 18:28 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>線程</b>管理

    RT-Thread文檔_線程間同步

    RT-Thread文檔_線程間同步
    發(fā)表于 02-22 18:29 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>線程</b>間同步

    RT-Thread文檔_線程間通信

    RT-Thread文檔_線程間通信
    發(fā)表于 02-22 18:29 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>線程</b>間通信

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread v5.0.2 發(fā)布

    RT-Thread 代碼倉(cāng)庫(kù)地址: ●? https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本發(fā)布日志詳情: ●? htt
    的頭像 發(fā)表于 10-10 18:45 ?1744次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布
    主站蜘蛛池模板: 男男小说高h| 黄色片网站大全 | 日韩美女拍拍免费视频网站 | 天堂网在线www资源在线 | 色狠狠综合网 | 天天色综合久久 | 性欧美大战久久久久久久 | 一卡二卡卡四卡无人区中文 | 伊人网亚洲 | 视色4se在线视频播放 | 成人国产日本亚洲精品 | 亚洲午夜网 | 亚洲国产女人aaa毛片在线 | 亚洲视频在线一区二区三区 | 亚洲香蕉电影 | av2021天堂网手机版 | 5252a我爱haose01亚洲 | 美女黄18以下禁止观看的网站 | 夜夜春夜夜爽 | 狠狠干狠狠操 | yellow中文字幕久久网 | 老色歌uuu26 老湿成人影院 | 色播亚洲| 亚洲欧美国产高清va在线播放 | 免费级毛片 | 色色视频免费网 | 在线观看886影院成人影院 | 婷婷激情狠狠综合五月 | 黄色在线播放网址 | 天天干天天射天天插 | 久久天天躁夜夜躁狠狠85麻豆 | 日韩色区 | 你懂的网站在线观看网址 | 亚洲男人的天堂久久香蕉网 | 特黄一级黄色片 | 91在线色| 久久99国产精品久久99 | 色涩在线| 欧美精品四虎在线观看 | 变态重口极致另类在线 | 在线黄视频 |