系統調度就是在就緒列表中尋找優先級最高的就緒線程,然后去執行該線程。但是目前我們還不支持優先級, 僅實現兩個線程輪流切換,系統調度函數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文章
74瀏覽量
40773 -
系統調用
+關注
關注
0文章
28瀏覽量
8632
發布評論請先 登錄
相關推薦
熱點推薦
代碼里的青春——我與RT-Thread的故事
從發出RT-Thread20周年故事征集令的第一天起,我們已陸續收到了數十位開發者的投稿。有人凌晨三點在調試線程棧,有人在社區收獲友情,有人靠RTT拿下比賽順利上岸……今天我們選出幾篇極具代表性
Linux-RT特點及簡單應用
任務:Linux-RT提供了一些API用于創建和管理實時任務。最常用的API是pthread_create()函數,它允許創建新的線程,并為線程指定優先級和調度策略。另外,也可以
發表于 12-05 07:37
使用rt_thread無法輸出PWM怎么解決?
*/
static rt_thread_t tid1 = RT_NULL;/* 線程句柄 */
struct rt_device_pwm *pwm_dev; /* PWM設備句柄
發表于 10-14 07:05
rt-thread studio 如何進行多線程編譯?
使用 rt-thread studio在工程配置 C/C++構建->Behavior->parallel build數量修改,CPU的占用率沒有明顯的改變
發表于 10-11 09:16
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
跑官方的signal例程,執行完signal回調函數后,調度器不可用,是什么原因?
rt_thread_mdelay時,調度器竟然不可用了,程序無法執行下去。不知道時什么原因導致調度器不可用?求助大家。
| /
- RT -Thr
發表于 09-12 08:08
在線程刪除時遇到斷言,是什么原因導致的?
不足?
(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-master內新修改dev_serial_v2.c后導致finsh線程循環無調度怎么解決?
finsh線程死循環無調度,繼而導致無法進入空閑線程,導致看門狗復位。
從兩個截圖中發現,減少了rt_wqueue_wait(&(device->
發表于 09-10 06:56
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,結合RT-Trace調試器細化到實際任務調度的粒度,來調試并逐步講解“優先級反轉”的調度和運行邏輯。如果對RT
RT-Thread Nano移植后動態創建線程創建不了怎么處理?
RT-Thread Nano移植后動態創建線程創建不了,靜態可以.直接燒錄DEMO也一樣,將RT_USING_HEAP開起來,使用動態創建就創建不起來,RT_USING_HEAP關掉后
發表于 06-11 06:36
RT—thread線程調度詳解
評論