RTThread官网看一下,可以发现【rt_thread_suspend】的函数说明中,特意的说明了这个函数不能通过A线程挂起B线程。
翻开源码看一下,在这个函数中有这么一个判断,会判断需要挂起线程的状态,如果线程不等于就绪态那么就不会进入挂起,而sleep,delay等函数都会导致线程的挂起,那么其他线程想要挂起这个线程肯定会掉到这个if里面,从而挂起不了这个线程。
这里有两个解决思路,一个是通过 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文章
3845浏览量
61215 -
线程
+关注
关注
0文章
484浏览量
19468 -
RTThread
+关注
关注
6文章
126浏览量
40486
发布评论请先 登录
相关推荐
从0到1教你写RT-Thread之线程的定义
本章是我们真正从从 0 到 1 写 RT-Thread 的第一章,属于基础中的基础,必须要学会创建线程,并重点掌握线程是如何切换的。因为线程
发表于 11-21 10:19
•842次阅读
RT-Thread代码启动与线程切换过程的实现
的,换一下函数名就好了2、RT-Thread线程切换过程首先查看RT-Thread内核架构这一章节,明白RT-Thread链表及
发表于 04-25 11:38
基于cortex-m3的rt-thread系统如何实现线程上下文切换呢
线程上下文切换等功能,一般采用汇编格式编写,不同cpu架构实现方式肯定不同,为了使rt-thread系统能够在不同的CPU架构上都能运行,RT-th
发表于 05-05 15:00
【原创精选】RT-Thread征文精选技术文章合集
开发板的详细步骤例程stm32裸机RT—thread开始创建线程详解基于标准库的keil移植到RT-thread例程RT-thread
发表于 07-26 14:56
【RT-thread】如何将RT-thread系统移植到stm32
1.RT-thread简介T-Thread(Real Time-Thread),是一个嵌入式实时多线程操作系统。在 RT-Thread 系统
发表于 12-08 11:06
•17次下载
RT—thread线程调度详解
系统调度就是在就绪列表中寻找优先级最高的就绪线程,然后去执行该线程。但是目前我们还不支持优先级, 仅实现两个线程轮流切换,系统调度函数
RT-Thread学习笔记 RT-Thread的架构概述
的物联网操作系统。 RT-Thread 概述 RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程
评论