系统调度就是在就绪列表中寻找优先级最高的就绪线程,然后去执行该线程。但是目前我们还不支持优先级, 仅实现两个线程轮流切换,系统调度函数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浏览量
40085 -
系统调用
+关注
关注
0文章
28浏览量
8348
发布评论请先 登录
相关推荐
RT-Thread上CAN实践
开箱测试RT-Thread官方已完成了对英飞凌XMC7200EVK的移植,通过shell可以看到做好了uart3的console。本文将介绍如何进行RT-ThreadCan移植。接下来我们要完成CAN_FD的驱动移植,并正常启动RT-T
2024 RT-Thread全球巡回 线下培训火热来袭!
亲爱的RT-Thread社区成员们:我们非常高兴地宣布,2024年RT-Thread全球开发者线下培训即将拉开帷幕!24年全球巡回培训将覆盖超10座城市及国家,为开发者提供一个深入学习RT-Thread嵌入式开发的绝佳机会。
使用rt_thread_mdelay函数后出现hardfault的原因?
问题:在一个线程中共有前后2部分使用rt_thread_mdelay()进行延时等待,前面部分延时是正常的,后面部分进入rt_thread_mdelay()函数后立马打印hardfault错误,定位
发表于 07-16 07:07
lvgl移植到RT-Thread Nano后进入硬件错误中断的原因?
使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因为这个lvgl只能移植到标准版里?
尝试过给lvgl的线程分配更大的栈,但是依旧会卡死在硬件错误中断里。但只要把用户的ui
发表于 07-04 07:40
6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!
6月6日下午我们将在杭州举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式
4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!
4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!
4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
rt-thread是如何在线程运行结束后识别到的呢?
我最近在仿写rt-thread内核,在这个过程中对于它线程的处理有些疑惑
代码如下
#include
#define DBG_TAG \"main\"
#define
发表于 03-22 08:20
RT-thread中运行了好多个线程,有的线程很长时间不执行是什么原因?
RT-thread中运行了好多个线程,有的线程很长时间不执行,通过什么方式知道线程因为什么原因阻塞
发表于 03-22 06:48
在线程中调用rt_thread_mdelay()函数程序卡死了怎么解决?
在线程中调用rt_thread_mdelay()函数程序卡死。搞了两天也不知道问题出在哪,怎么解决。
int main(void)
{
interrupt_config
发表于 02-26 08:39
RT-Thread Nano在调用rt_thread_control时,修改线程优先级一直不执行的原因?如何解决?
RT-Thread Nano在调用rt_thread_control时,修改线程优先级一直不执行
发表于 02-23 07:32
HC32L130F8UA移植rtthread后程序跑飞了,回不到1线程怎么解决?
。
还有一种情况是这些初始化函数里面用的延时函数是单片机自带文件的delay1ms函数,我在1线程中用rt_thread_delay()函数进行线程调度后,2
发表于 02-23 06:04
评论