rtthread 主动挂起线程

本文演示了如何在RT-Thread系统中挂起和恢复线程,包括挂起其他线程及自身线程的方法。通过创建两个相同优先级的线程tid1和tid2,实现了tid2每20秒挂起或恢复tid1一次的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rtthread 主动挂起(SUSPEND)线程

一、挂起其他线程

/*
 * 程序清单:创建、启动、挂起、恢复线程
 *
 * 这个例子会创建两个动态线程:tid1和tid2有相同的优先级,tid1线程中因无delay延时,start后tid1始终处于READY态,也正是因为这个前提,tid2才能够成功将tid1挂起。
 * 现象:每隔20s(200ms*100),tid1被tid2挂起或恢复一次。
 */
rt_thread_t my_tid1 = RT_NULL, my_tid2 = RT_NULL;

void my_tid1_thread_entry(void* params)
{
	int cnt = 0;
	rt_kprintf("enter my_tid1, priority = %d, status=%d\n", my_tid1->current_priority, my_tid1->stat);
	while(1){
		cnt++;
		if(cnt%1000000 == 0)
		rt_kprintf("this is my_tid1, cnt = %d\n", cnt);
	}
}

void my_tid2_thread_entry(void* params)
{
	int cnt = 0, ret = 0;
	rt_kprintf("enter my_tid2, priority = %d, status=%d\n", my_tid2->current_priority, my_tid2->stat);
	while(1){
		cnt++;
		rt_kprintf("this is my_tid2, cnt = %d\n", cnt);
		rt_thread_mdelay(200);
		if(cnt%100 == 0){
			if(my_tid1->stat == RT_THREAD_SUSPEND){
				ret = rt_thread_resume(my_tid1);	
				rt_kprintf("============resume tid1 ret=%d ============\n",ret);
			}
			else if(my_tid1->stat == RT_THREAD_READY){
				ret = rt_thread_suspend(my_tid1);
				rt_kprintf("============suspend tid1 ret=%d ============\n",ret);
			}
		}
	}
}

void suspend_resume_test(int argc, char* argv[])
{	
	if(RT_NULL == my_tid1){
		my_tid1 = rt_thread_create("my_tid1", my_tid1_thread_entry, NULL, 
						THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX - 4, THREAD_TIMESLICE);
		if(RT_NULL != my_tid1)
			rt_thread_startup(my_tid1);
	}
	if(RT_NULL == my_tid2){
		my_tid2 = rt_thread_create("my_tid2", my_tid2_thread_entry, NULL, 
						THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX - 4, THREAD_TIMESLICE);
		if(RT_NULL != my_tid2)
			rt_thread_startup(my_tid2);
	}
}
MSH_CMD_EXPORT(suspend_resume_test, suspend_resume_test);

二、挂起自身线程

通常不应该使用rt_err_t rt_thread_suspend(rt_thread_t thread)来挂起线程本身,如果确实需要采用 rt_thread_suspend() 函数挂起当前任务,需要在调用 rt_thread_suspend() 函数后立刻调用 rt_schedule() 函数进行手动的线程上下文切换。只需要了解,不推荐使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值