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

    文章

    74

    浏览量

    40701
  • 系统调用
    +关注

    关注

    0

    文章

    28

    浏览量

    8611
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    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-&gt
    发表于 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
    的头像 发表于 08-17 10:07 2800次阅读
    揭秘!基于<b class='flag-5'>RT-Thread</b>探究“优先级反转”下的任务<b class='flag-5'>调度</b>究竟是什么样的?| 技术集结

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始
    的头像 发表于 06-25 18:24 1437次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>线程</b><b class='flag-5'>调度</b>流程

    RT-Thread Nano移植后动态创建线程创建不了怎么处理?

    RT-Thread Nano移植后动态创建线程创建不了,静态可以.直接烧录DEMO也一样,将RT_USING_HEAP开起来,使用动态创建就创建不起来,RT_USING_HEAP关掉后
    发表于 06-11 06:36

    请问rt-thread studio如何进行多线程编译?

    使用 rt-thread studio 在工程配置 C/C++构建->Behavior->parallel build 数量修改,CPU的占用率没有明显的改变
    发表于 02-19 08:30