0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT—thread线程调度详解

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-05-19 17:07 次阅读

系统调度就是在就绪列表中寻找优先级最高的就绪线程,然后去执行该线程。但是目前我们还不支持优先级, 仅实现两个线程轮流切换,系统调度函数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
    RT
    +关注

    关注

    0

    文章

    73

    浏览量

    39859
  • 系统调用
    +关注

    关注

    0

    文章

    27

    浏览量

    8285
收藏 人收藏

    评论

    相关推荐

    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 nano ,有办法查看线程的资源占用情况麽?
    发表于 02-26 06:05

    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

    RT-Thread Nano入门:独立看门狗(IWDT)

    本文主要介绍怎么用RT-Thread Nano实现独立看门狗IWDT驱动,创建一个喂狗线程,实现定时喂狗功能。
    的头像 发表于 11-22 11:04 826次阅读
    <b class='flag-5'>RT-Thread</b> Nano入门:独立看门狗(IWDT)

    关于Python多进程和多线程详解

    进程(process)和线程thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU
    的头像 发表于 11-06 14:46 307次阅读
    关于Python多进程和多<b class='flag-5'>线程</b><b class='flag-5'>详解</b>

    基于rt-thread的socket通信设计

    最近再研究 rt-thread 的通信 ,想设计出 eps8266(多个) rt-thread(作为中控) 服务器的通信框架,使用的开发板是 潘多拉
    的头像 发表于 10-13 15:02 692次阅读
    基于<b class='flag-5'>rt-thread</b>的socket通信设计

    试用RT-Thread Studio(VSCode)

    想尝试RT-Thread studio (VSCode),先下载安装VSCode,再搜索RT-Thread
    的头像 发表于 10-12 10:58 572次阅读
    试用<b class='flag-5'>RT-Thread</b> Studio(VSCode)

    RT-Thread v5.0.2 发布

    RT-Thread 代码仓库地址: ●  https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情: ●  htt
    的头像 发表于 10-10 18:45 780次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布

    rt-thread线程栈初始化参数分析

    RT-Thread线程初始化的代码内有一段初始化线程堆栈的代码
    的头像 发表于 08-14 16:50 993次阅读
    <b class='flag-5'>rt-thread</b><b class='flag-5'>线程</b>栈初始化参数分析

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 2580次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习

    rtthread nano时间片轮转调度线程失败怎么办呢?

    1)我用cubemx生成的rtthread-nano的makefile工程,不同优先级的线程可以正常调度。但我用官网上给出的线程时间片轮转调度示例程序无法正常运行。 2)例程里面的
    发表于 05-12 16:58

    rt-thread main函数的使用和其它线程的创建问题求助?

    rt-thread main函数只是一个线程任务,如果想再创建其它线程任务,是不是在void rt_application_init(void)函数下创建其它
    发表于 05-12 15:24