任务的挂起与恢复
一、任务挂起和恢复的含义
挂起意思其实就是让任务暂停,与删除任务相似,但是任务的堆栈和内存都没有被删除。
恢复顾名思义就是恢复被挂起的任务。
二、任务挂起与恢复使用的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;// 无按键按下
}