RT-Thread物联网操作系统介绍:6、线程挂起和恢复

//恢复线程函数
rt_thread_resume(LED_Thread);
//挂起任务函数
uwRet = rt_thread_suspend(LED_Thread);

工程代码百度网盘链接网址在:RT-Thread物联网操作系统介绍

#include "MyIncludes.h"

static rt_thread_t LED_Thread = RT_NULL;
/*******************************************************************************
* Function Name  : LED_Thread_Process
* Description    : LED线程函数
* Input          : None
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
static void LED_Thread_Process(void* parameter)
{	
    while (1)
    {
        LED_Toggle(LED_R);       //翻转LED
        rt_thread_delay(200);                  /* 延时1000个tick,即1秒 */		 		
    }
}

static rt_thread_t KEY_Thread = RT_NULL;
/*******************************************************************************
* Function Name  : KEY_Thread_Process
* Description    : 按键线程函数
* Input          : None
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
static void KEY_Thread_Process(void* parameter)
{	
    rt_err_t uwRet = RT_EOK;	
    
    while (1)
    {
        Key_Read();    //扫描按键
		
		if(Key_Info.Num_Last != Key_Info.Num)  //按键值发生变化
		{
	        Key_Info.Num_Last = Key_Info.Num;
			
			if(Key_Info.Num != 0)
			{
				switch(Key_Info.Num)
				{
					case KEY_ONE:       
						 rt_kprintf("挂起LED线程!\n");
                         //先恢复一下,再挂起,因为led线程中有delay进行调度,可能正处在挂起状态,导致不能挂起
                         rt_thread_resume(LED_Thread);  //先恢复一下 
                         uwRet = rt_thread_suspend(LED_Thread);/* 挂起LED线程 */
                         if(RT_EOK == uwRet)
                         {
                            rt_kprintf("挂起LED线程成功!\n");
                         }
                         else//挂起失败
                         {
                             if(RT_THREAD_SUSPEND == uwRet)
                             {
                                 rt_kprintf("LED线程已经挂起\n");
                             }
                             else
                                rt_kprintf("挂起LED线程失败!失败代码:0x%lx\n",uwRet);
                         }
			     break;
					case KEY_TWO:       
						 rt_kprintf("恢复LED线程!\n");
                         uwRet = rt_thread_resume(LED_Thread);/* 恢复LED线程! */
                         if(RT_EOK == uwRet)
                         {
                            rt_kprintf("恢复LED线程成功!\n");
                         }
                         else
                         {
                            rt_kprintf("恢复LED线程失败!失败代码:0x%lx\n",uwRet);
                         }
			 break;
			default: break;
			}
			}
		}
        rt_thread_delay(10);                  /* 延时10毫秒 */
    }
}

int main(void)
{
    //LED线程
	LED_Thread =                        /* 线程控制块指针 */
	rt_thread_create("LED",             /* 线程名字 */
                    LED_Thread_Process, /* 线程入口函数 */
                    RT_NULL,             /* 线程入口函数参数 */
                    512,                 /* 线程栈大小 */
                    15,                   /* 线程的优先级 */
                    20);                 /* 线程时间片 */
								 
	/* 启动线程,开启调度 */
    if (LED_Thread != RT_NULL)
        rt_thread_startup(LED_Thread);
    else		
        return -1;
    
    //按键线程
   KEY_Thread =                        /* 线程控制块指针 */
	rt_thread_create("KEY",             /* 线程名字 */
                    KEY_Thread_Process, /* 线程入口函数 */
                    RT_NULL,             /* 线程入口函数参数 */
                    512,                 /* 线程栈大小 */
                    12,                   /* 线程的优先级 */
                    20);                 /* 线程时间片 */
								 
	/* 启动线程,开启调度 */
    if (KEY_Thread != RT_NULL)
        rt_thread_startup(KEY_Thread);
    else		
        return -1;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值