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線程調(diào)度詳解

嵌入式應(yīng)用開(kāi)發(fā) ? 來(lái)源:嵌入式應(yīng)用開(kāi)發(fā) ? 作者:嵌入式應(yīng)用開(kāi)發(fā) ? 2022-05-19 17:07 ? 次閱讀

系統(tǒng)調(diào)度就是在就緒列表中尋找優(yōu)先級(jí)最高的就緒線程,然后去執(zhí)行該線程。但是目前我們還不支持優(yōu)先級(jí), 僅實(shí)現(xiàn)兩個(gè)線程輪流切換,系統(tǒng)調(diào)度函數(shù)rt_schedule

/* 系統(tǒng)調(diào)度 */
void rt_schedule(void)
{
    struct rt_thread *to_thread;
    struct rt_thread *from_thread;

    /* 兩個(gè)線程輪流切換 *///                                    (1)
    if( rt_current_thread ======== rt_list_entry( rt_thread_priority_table[0].next,
                                                        struct rt_thread,
                                                        tlist) )
    {
        from_thread ==== rt_current_thread;
        to_thread ==== rt_list_entry( rt_thread_priority_table[1].next,
                                                        struct rt_thread,
                                                        tlist);
    rt_current_thread ==== to_thread;
    }
    else//                                                    (2)
    {
        from_thread ==== rt_current_thread;
        to_thread ==== rt_list_entry( rt_thread_priority_table[0].next,
                                                        struct rt_thread,
                                                        tlist);
    rt_current_thread ==== to_thread;
    }//                                                       (3)
    /* 產(chǎn)生上下文切換 */
    rt_hw_context_switch((rt_uint32_t)&from_thread->sp,(rt_uint32_t)&to_thread->sp);
}

主函數(shù)

/**
************************************************************************
* @file    main.c
* @author  fire
* @version V1.0
* @date    2018-xx-xx
* @brief   《RT-Thread內(nèi)核實(shí)現(xiàn)與應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)指南》書籍例程
*
************************************************************************
* @attention
*
* 實(shí)驗(yàn)平臺(tái):野火 STM32  M4系列開(kāi)發(fā)板
*
* 官網(wǎng)    :www.embedfire.com
* 論壇    :http://www.firebbs.cn
* 淘寶    :https://fire-stm32.taobao.com
*
************************************************************************
*/

/*
*************************************************************************
*                             包含的頭文件
*************************************************************************
*/

#include 
#include "ARMCM4.h"


/*
*************************************************************************
*                              全局變量
*************************************************************************
*/
rt_uint8_t flag1;
rt_uint8_t flag2;

extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];

/*
*************************************************************************
*                      線程控制塊 & STACK & 線程聲明
*************************************************************************
*/


/* 定義線程控制塊 */
struct rt_thread rt_flag1_thread;
struct rt_thread rt_flag2_thread;

ALIGN(RT_ALIGN_SIZE)
/* 定義線程棧 */
rt_uint8_t rt_flag1_thread_stack[512];
rt_uint8_t rt_flag2_thread_stack[512];

/* 線程聲明 */
void flag1_thread_entry(void *p_arg);
void flag2_thread_entry(void *p_arg);

/*
*************************************************************************
*                               函數(shù)聲明
*************************************************************************
*/
void delay(uint32_t count);

/************************************************************************
* @brief  main函數(shù)
* @param  無(wú)
* @retval 無(wú)
*
* @attention
***********************************************************************
*/
int main(void)
{
    /* 硬件初始化 */
    /* 將硬件相關(guān)的初始化放在這里,如果是軟件仿真則沒(méi)有相關(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();
}

/*
*************************************************************************
*                               函數(shù)實(shí)現(xiàn)
*************************************************************************
*/
/* 軟件延時(shí) */
void delay (uint32_t count)
{
    for(; count!====0; count--);
}

/* 線程1 */
void flag1_thread_entry( void *p_arg )
{
    for( ;; )
    {
        flag1 ==== 1;
        delay( 100 );
        flag1 ==== 0;
        delay( 100 );

        /* 線程切換,這里是手動(dòng)切換 */
        rt_schedule();//                                (注意)
    }
}

/* 線程2 */
void flag2_thread_entry( void *p_arg )
{
    for( ;; )
    {
        flag2 ==== 1;
        delay( 100 );
        flag2 ==== 0;
        delay( 100 );

        /* 線程切換,這里是手動(dòng)切換 */
        rt_schedule();//                                (注意)
    }
}

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • RT
    RT
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    39979
  • 系統(tǒng)調(diào)用

    關(guān)注

    0

    文章

    28

    瀏覽量

    8316
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Nordic-RT-Thread5.1.0移植筆記

    Nordic-RT-Thread5.1.0移植筆記
    的頭像 發(fā)表于 10-16 08:09 ?210次閱讀
    Nordic-<b class='flag-5'>RT-Thread</b>5.1.0移植筆記

    使用rt_thread_mdelay函數(shù)后出現(xiàn)hardfault的原因?

    問(wèn)題:在一個(gè)線程中共有前后2部分使用rt_thread_mdelay()進(jìn)行延時(shí)等待,前面部分延時(shí)是正常的,后面部分進(jìn)入rt_thread_mdelay()函數(shù)后立馬打印hardfault錯(cuò)誤,定位
    發(fā)表于 07-16 07:07

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

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 05-28 08:35 ?356次閱讀
    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平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 04-16 08:35 ?359次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    rt-thread是如何在線程運(yùn)行結(jié)束后識(shí)別到的呢?

    我最近在仿寫rt-thread內(nèi)核,在這個(gè)過(guò)程中對(duì)于它線程的處理有些疑惑 代碼如下 #include #define DBG_TAG \"main\" #define
    發(fā)表于 03-22 08:20

    RT-thread中運(yùn)行了好多個(gè)線程,有的線程很長(zhǎng)時(shí)間不執(zhí)行是什么原因?

    RT-thread中運(yùn)行了好多個(gè)線程,有的線程很長(zhǎng)時(shí)間不執(zhí)行,通過(guò)什么方式知道線程因?yàn)槭裁丛蜃枞?/div>
    發(fā)表于 03-22 06:48

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

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

    使用rt_thread nano有辦法查看線程的資源占用情況嗎?

    使用rt_thread nano ,有辦法查看線程的資源占用情況麼?
    發(fā)表于 02-26 06:05

    RT-Thread Nano在調(diào)用rt_thread_control時(shí),修改線程優(yōu)先級(jí)一直不執(zhí)行的原因?如何解決?

    RT-Thread Nano在調(diào)用rt_thread_control時(shí),修改線程優(yōu)先級(jí)一直不執(zhí)行
    發(fā)表于 02-23 07:32

    HC32L130F8UA移植rtthread后程序跑飛了,回不到1線程怎么解決?

    。 還有一種情況是這些初始化函數(shù)里面用的延時(shí)函數(shù)是單片機(jī)自帶文件的delay1ms函數(shù),我在1線程中用rt_thread_delay()函數(shù)進(jìn)行線程調(diào)度后,2
    發(fā)表于 02-23 06:04

    rt-thead和frertos區(qū)別

    RT-Thread(Real-Time Thread,以下簡(jiǎn)稱RTT)的設(shè)計(jì)理念是以“實(shí)時(shí)性”為核心,追求極致的實(shí)時(shí)性能。它提供了輕量級(jí)的線程模型和可裁剪的內(nèi)核,可以在資源受限的嵌入式系統(tǒng)中高效運(yùn)行
    的頭像 發(fā)表于 01-08 14:56 ?5389次閱讀

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

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

    RT-Thread Nano入門:獨(dú)立看門狗(IWDT)

    本文主要介紹怎么用RT-Thread Nano實(shí)現(xiàn)獨(dú)立看門狗IWDT驅(qū)動(dòng),創(chuàng)建一個(gè)喂狗線程,實(shí)現(xiàn)定時(shí)喂狗功能。
    的頭像 發(fā)表于 11-22 11:04 ?2008次閱讀
    <b class='flag-5'>RT-Thread</b> Nano入門:獨(dú)立看門狗(IWDT)

    RT-Thread啟動(dòng)進(jìn)入就緒態(tài)最高優(yōu)先級(jí)線程的全過(guò)程與棧幀分析(上)

    本文簡(jiǎn)單討論RT-Thread在啟動(dòng)后,逐步進(jìn)入到處于就緒態(tài)最高優(yōu)先級(jí)main線程的全過(guò)程。部分內(nèi)容涉及到匯編指令,但通俗易懂。
    的頭像 發(fā)表于 11-08 12:47 ?1146次閱讀
    <b class='flag-5'>RT-Thread</b>啟動(dòng)進(jìn)入就緒態(tài)最高優(yōu)先級(jí)<b class='flag-5'>線程</b>的全過(guò)程與棧幀分析(上)

    關(guān)于Python多進(jìn)程和多線程詳解

    進(jìn)程(process)和線程thread)是操作系統(tǒng)的基本概念,但是它們比較抽象,不容易掌握。關(guān)于多進(jìn)程和多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU
    的頭像 發(fā)表于 11-06 14:46 ?756次閱讀
    關(guān)于Python多進(jìn)程和多<b class='flag-5'>線程</b><b class='flag-5'>詳解</b>