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

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

3天内不再提示

RT-thread线程切换原理与实现

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-06-16 15:12 次阅读

RTThread官网看一下,可以发现【rt_thread_suspend】的函数说明中,特意的说明了这个函数不能通过A线程挂起B线程。

pYYBAGKq1YiAUjkMAAMDV6QlYek464.png

翻开源码看一下,在这个函数中有这么一个判断,会判断需要挂起线程的状态,如果线程不等于就绪态那么就不会进入挂起,而sleep,delay等函数都会导致线程的挂起,那么其他线程想要挂起这个线程肯定会掉到这个if里面,从而挂起不了这个线程。

pYYBAGKq1cSAXT4GAAJS8yyvsss326.png

这里有两个解决思路,一个是通过 rt_thread_detach(&thread)删除线程的方法实现,另外一个就是定义一个暂停信号量,然后在需要暂停的线程中去不停的监测这个信号量,当接收到信号量时,自己主动挂起线程并让出CPU,这样就可以实现暂停线程,而且还能够知道线程暂停在哪,下面就第二个思路进行的代码实现如下:

#include 
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t a_thread_stack[ 512 ];
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t b_thread_stack[ 512 ];
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t c_thread_stack[ 512 ];
static struct rt_thread a_thread;
static struct rt_thread b_thread;
static struct rt_thread c_thread;
static rt_sem_t b_pause_sem = RT_NULL;
static rt_sem_t c_pause_sem = RT_NULL;
static void a_thread_entry(void *parameter)
{
   unsigned int count = 0;
   while (1)
   {
       count++;
       if(count == 10)
       {
           rt_kprintf("b start!\n");
           rt_thread_startup(&b_thread);   //开始扫地
       }
       else if(count == 30)
       {
           rt_kprintf("b pause!\n");
           rt_sem_release(b_pause_sem);//rt_thread_suspend(&b_thread);   //停止扫地
           rt_kprintf("c start!\n");
           rt_thread_startup(&c_thread);   //开始洗碗
       }
       else if(count == 50)
       {
           rt_kprintf("c pause!\n");
           rt_sem_release(c_pause_sem);//rt_thread_suspend(&c_thread);   //停止洗碗
           rt_kprintf("b start!\n");
           rt_thread_resume(&b_thread);    //开始扫地
       }
       rt_thread_delay(100);
   }
}
static void b_thread_entry(void *parameter)
{
   unsigned int count = 0;
   while (1)
   {
       rt_kprintf("b thread run!\n");
       rt_thread_delay(300);
       if(rt_sem_take(b_pause_sem, 0) == RT_EOK)
       {
           rt_thread_suspend(&b_thread);   //停止扫地
           rt_schedule();
       }
   }
}
static void c_thread_entry(void *parameter)
{
   unsigned int count = 0;
   while (1)
   {
       rt_kprintf("c thread run!\n");
       rt_thread_delay(100);
       if(rt_sem_take(c_pause_sem, 0) == RT_EOK)
       {
           rt_thread_suspend(&c_thread);   //停止扫地
           rt_schedule();
       }
   }
}
int pause_thread_init(void)
{
   rt_err_t result;
  
   b_pause_sem = rt_sem_create("b_pause", 0, RT_IPC_FLAG_PRIO);
  
   c_pause_sem = rt_sem_create("c_pause", 0, RT_IPC_FLAG_PRIO);
   /* init led thread */
   result = rt_thread_init(&a_thread,
                           "a_thread",
                           a_thread_entry,
                           RT_NULL,
                           (rt_uint8_t *)&a_thread_stack[0],
                           sizeof(a_thread_stack),
                           5,
                           5);
                          
   if (result == RT_EOK)
   {
       rt_thread_startup(&a_thread);
   }
  
   /* init led thread */
   result = rt_thread_init(&b_thread,
                           "b_thread",
                           b_thread_entry,
                           RT_NULL,
                           (rt_uint8_t *)&b_thread_stack[0],
                           sizeof(b_thread_stack),
                           6,
                           5);
                          
  
   /* init led thread */
   result = rt_thread_init(&c_thread,
                           "c_thread",
                           c_thread_entry,
                           RT_NULL,
                           (rt_uint8_t *)&c_thread_stack[0],
                           sizeof(c_thread_stack),
                           7,
                           5);
                          
   return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pause_thread_init, pause thread);


审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4353

    浏览量

    63292
  • 线程
    +关注

    关注

    0

    文章

    507

    浏览量

    19855
  • RTThread
    +关注

    关注

    8

    文章

    132

    浏览量

    41141
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(三、RT-Thread线程操作函数)

    讲完了RT-Thread开发环境,启动流程,启动以后当然是开始跑线程了,那么自然我们得学会如何创建线程以及线程的有关操作。
    的头像 发表于 06-20 00:31 7182次阅读
    <b class='flag-5'>RT-Thread</b>记录(三、<b class='flag-5'>RT-Thread</b><b class='flag-5'>线程</b>操作函数)

    什么是RT-Thread线程管理看完你就懂了

    可由用户挂接一些数据信息到线程控制块中,以提供类似线程私有数据的实现线程重要属性线程RT-Thre
    发表于 03-29 06:16

    RT-Thread线程简介

    文章目录RT-Thread线程简介源码分析初始化线程线程脱离启动线程挂起线程
    发表于 08-24 07:56

    RT-Thread代码启动与线程切换过程的实现

    的,换一下函数名就好了2、RT-Thread线程切换过程首先查看RT-Thread内核架构这一章节,明白RT-Thread链表及
    发表于 04-25 11:38

    【原创精选】RT-Thread征文精选技术文章合集

    开发板的详细步骤例程stm32裸机RTthread开始创建线程详解基于标准库的keil移植到RT-thread例程RT-thread
    发表于 07-26 14:56

    RT-Thread学习笔记 --(6)RT-Thread线程间通信学习过程总结

    前两篇文章总结了RT-Thread线程以及多线程同步的学习过程,关于前两篇学习总结,可以查看之前的文章。
    发表于 01-25 18:50 7次下载
    <b class='flag-5'>RT-Thread</b>学习笔记 --(6)<b class='flag-5'>RT-Thread</b><b class='flag-5'>线程</b>间通信学习过程总结

    RTthread线程调度详解

    系统调度就是在就绪列表中寻找优先级最高的就绪线程,然后去执行该线程。但是目前我们还不支持优先级, 仅实现两个线程轮流切换,系统调度函数
    的头像 发表于 05-19 17:07 2647次阅读

    RT-Thread全球技术大会:RT-Thread对POSIX的实现情况介绍

    RT-Thread全球技术大会:RT-Thread对POSIX的实现情况介绍             审核编辑:彭静
    的头像 发表于 05-27 16:52 1990次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>对POSIX的<b class='flag-5'>实现</b>情况介绍

    RT-Thread学习笔记 RT-Thread的架构概述

    联网操作系统。 RT-Thread 概述 RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程
    的头像 发表于 07-09 11:27 4701次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_线程管理

    RT-Thread文档_线程管理
    发表于 02-22 18:28 0次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>线程</b>管理

    RT-Thread文档_线程间同步

    RT-Thread文档_线程间同步
    发表于 02-22 18:29 1次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>线程</b>间同步

    RT-Thread文档_线程间通信

    RT-Thread文档_线程间通信
    发表于 02-22 18:29 0次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>线程</b>间通信

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread v5.0.2 发布

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