系統調度就是在就緒列表中尋找優先級最高的就緒線程,然后去執行該線程。但是目前我們還不支持優先級, 僅實現兩個線程輪流切換,系統調度函數rt_schedule
/* 系統調度 */
void rt_schedule(void)
{
struct rt_thread *to_thread;
struct rt_thread *from_thread;
/* 兩個線程輪流切換 */// (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)
/* 產生上下文切換 */
rt_hw_context_switch((rt_uint32_t)&from_thread->sp,(rt_uint32_t)&to_thread->sp);
}
主函數
/**
************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2018-xx-xx
* @brief 《RT-Thread內核實現與應用開發實戰指南》書籍例程
*
************************************************************************
* @attention
*
* 實驗平臺:野火 STM32 M4系列開發板
*
* 官網 :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);
/*
*************************************************************************
* 函數聲明
*************************************************************************
*/
void delay(uint32_t count);
/************************************************************************
* @brief main函數
* @param 無
* @retval 無
*
* @attention
***********************************************************************
*/
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();
}
/*
*************************************************************************
* 函數實現
*************************************************************************
*/
/* 軟件延時 */
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 );
/* 線程切換,這里是手動切換 */
rt_schedule();// (注意)
}
}
/* 線程2 */
void flag2_thread_entry( void *p_arg )
{
for( ;; )
{
flag2 ==== 1;
delay( 100 );
flag2 ==== 0;
delay( 100 );
/* 線程切換,這里是手動切換 */
rt_schedule();// (注意)
}
}
審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
RT
+關注
關注
0文章
73瀏覽量
40432 -
系統調用
+關注
關注
0文章
28瀏覽量
8453
發布評論請先 登錄
相關推薦
熱點推薦
RT-Thread Nano移植后動態創建線程創建不了怎么處理?
RT-Thread Nano移植后動態創建線程創建不了,靜態可以.直接燒錄DEMO也一樣,將RT_USING_HEAP開起來,使用動態創建就創建不起來,RT_USING_HEAP關掉后
發表于 06-11 06:36
2025 RT-Thread全球技術大會議程正式發布!
RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術大會)是聚焦基礎軟件技術創新與實踐的嵌入式技術盛會,持續推動技術價值轉化

RT-Thread審核團招募: 深度參與開源RTOS社區治理與演進
全球開發者招募:RT-Thread審核團(ReviewTeam)正式開放申請!在開源的世界里,代碼審查(CodeReview)是保證軟件質量、促進技術交流的關鍵環節。RT-Thread作為全球領先

請問rt-thread studio如何進行多線程編譯?
使用 rt-thread studio 在工程配置 C/C++構建->Behavior->parallel build 數量修改,CPU的占用率沒有明顯的改變
發表于 02-19 08:30
如何將RT-Thread移植到NXP MCUXPressoIDE上
RT-Thread默認支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內容比較簡單但稍有瑣碎,希望對有需要的小伙伴有所幫助。

RT-Thread上CAN實踐
開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動RT-T

開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動!
親愛的RT-Thread開發者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發者大會)正式啟動報名!2024RT-Threa

線程創建成功了,為啥ai_thread_entry()函數不運行呢?
我這個線程創建成功了,為啥ai_thread_entry()函數不運行呢?
void airun_thread()
{
/* 創建 serial 線程 */
發表于 09-27 09:35
2024 RT-Thread全球巡回 線下培訓火熱來襲!
親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入式開發的絕佳機會。

【好書推薦】RT-Thread設備驅動開發指南
近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需求越來越

使用rt_thread_mdelay函數后出現hardfault的原因?
問題:在一個線程中共有前后2部分使用rt_thread_mdelay()進行延時等待,前面部分延時是正常的,后面部分進入rt_thread_mdelay()函數后立馬打印hardfault錯誤,定位
發表于 07-16 07:07
RT-Thread 新里程碑達成——GitHub Star 破萬!
RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第一!倉庫地址:https://github.com

lvgl移植到RT-Thread Nano后進入硬件錯誤中斷的原因?
使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因為這個lvgl只能移植到標準版里?
嘗試過給lvgl的線程分配更大的棧,但是依舊會卡死在硬件錯誤中斷里。但只要把用戶的ui
發表于 07-04 07:40
基于 RT-Thread專業版的EtherCAT主站方案
(一)方案介紹本方案基于RT-Thread專業版,在RT-Thread端集成EtherCAT主站協議,通過EtherCAT對伺服電機或遠程IO進行實時控制,具備傳輸速度快,實時性高,擴展設備靈活等

評論