FreeRtos学习笔记---------任务的挂起与恢复

任务的挂起与恢复

一、任务挂起和恢复的含义

挂起意思其实就是让任务暂停,与删除任务相似,但是任务的堆栈和内存都没有被删除。
恢复顾名思义就是恢复被挂起的任务

二、任务挂起与恢复使用的API函数

vTasksuspend()          //挂起函数
vTaksResume()           //恢复任务的运行
vTaskResumeFromISR()    //中断服务函数中恢复任务的运行

其中 vTaskResumeFromISR()有返回值

返回值含义
pdTRUE被恢复的任务的优先级比当前的优先级高
pdFAULSE被恢复的任务的优先级比当前的优先级低

三、创建一个使用按键来挂起和恢复其他任务的任务

#define Task3_Size    128
#define Task3_PRIO    4
StackType_t Task3_stack[StartTaskSize];
StaticTask_t Task3TCB;

TaskHandle_t  Task3_Handler;


  Task3_Handler =  xTaskCreateStatic(  (TaskFunction_t) task3,
                                         (char * ) "task3", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                                         (uint32_t) Task3_Size,
                                         (void *) NULL,
                                         (UBaseType_t) Task3_PRIO,
                                         (StackType_t *) Task3_stack,
                                         (StaticTask_t * ) &Task3TCB );	

void task3(void *Parameters)
{
	while(1)
	{
		if( KEY_Scan(1) == 0)
		{	
		vTaskSuspend(Task2_Handler); //挂起任务二
		}
				vTaskDelay(10);
	}

}
/*要注意在KEY_scan中含有一个延时函数delay_ms(10)来做软件消抖,要替换成vTaskDelay(10)才可以正常使用KEY_scan()函数*/

	

按键配置和检测代码

void key_Init(void)
{
	
	GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //KEY 对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	
	
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
	
	 
}

u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY0==0))
	{
		vTaskDelay(10);//去抖动 
		key_up=0;
		if(KEY0==0)return 1;
		
	}else if(KEY0==1)key_up=1; 	    
 	return 0;// 无按键按下
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验报告三:(1)设计 Task0、Task1 两个任务任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行,并输出两个任务在各个时刻的状态。Task0 的主要功能是显示 Task1 的状态,Task1 的主要功能是显示 Task0 的状态。整个应用的运行流程如图 1 所示,其描述如下:在 main 函数创建起始任务 TaskStart,其优先级为 0。TaskStart 任务主要完成创建 2 个应用任务 Task0、Task1,并挂起自己(不再被其它任务唤醒)。之后整个系统的运行流程如下:t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己;t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒 Task0,后者由于优先级较高而抢占 CPU;Task0 执行到 t4 时刻又挂起自己,内核调度 Task1执行;Task1 运行至 t5 时刻再度唤醒 Task0; 注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。 (2)设计 MyTask、YouTask、KeyTask 三个任务:MyTask 任务输出 M;YouTask 任务输出 Y,并输出 MyTask 任务的状态;KeyTask 任务从键盘接收字符 Y 或 N,当接收 Y 时挂起 MyTask 任务,当接收 N 时恢复 MyTask 任务。 (3)设计 KeyTask 任务,当从键盘输入+号时动态创建任务,最多可以创建 10 个任务,这 10个任务都执行一个函数 MyTask,要求优先级是(PRIO_BASE+0,1,2,3,4,5,6,7,8,9),还要向不同的任务传递不同的参数(0,1,2,3,4,5,6,7,8,9)给 MyTask 函数,优先级为(PRIO_BASE+0,1,2,3,4,5,6,7,8,9)的任务分别输出数字(0,1,2,3,4,5,6,7,8,9)。当从键盘输入-号时动态的删除刚创建的一个任务,最多可删除 10 个任务。提示:多个任务可以执行一个函数。运行结果如下图所示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值