IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> FreeRTOS任务挂起和恢复API函数 -> 正文阅读

[嵌入式]FreeRTOS任务挂起和恢复API函数

API函数

在这里插入图片描述
使用的原因

我们有一个任务在创建过程中,暂停运行等待某个条件触发再去运行,这样就可以有效保留数据 

代码修改

上节代码
在上节代码基础上 加

 			 
				 
				 Key_Task3_Handler= xTaskCreateStatic((TaskFunction_t) Key_task3,
                                   (char *)           "Key_task3", 
                                   (uint32_t)         Key_Task3_Size,/ 
                                   (void*)            NULL,  
                                 (UBaseType_t)        Key_Task3_Priority, 
                                 (StackType_t*)       Key_Task3Stack, 
                                 (StaticTask_t*)      &Key_Task3TCB); 		
                                 							 
																	        

按键初始化

 void Key_Init(void) 
{

	GPIO_InitTypeDef  GPIOE_InitStruct;
	GPIO_InitTypeDef  GPIOA_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);
	
	//上拉电阻 把 初始化电平拉为 高
	GPIOE_InitStruct.GPIO_Mode =GPIO_Mode_IPU;
	GPIOE_InitStruct.GPIO_Pin =GPIO_Pin_3;
	GPIOE_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIOE_InitStruct);
	// 下拉电阻 把 初始化电平拉为低
	GPIOA_InitStruct.GPIO_Mode =GPIO_Mode_IPD;   
	GPIOA_InitStruct.GPIO_Pin =GPIO_Pin_0;
	GPIOA_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIOA_InitStruct);
	
	
}

任务挂起

  
	  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1) //按键按下 
	{
		 
	while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)  //确实按下了 
	    {
	  vTaskSuspend(Task_Task1_Handler); //任务1挂起  
	  printf("task1 is Supend\r\n"); //串口打印 
	  vTaskDelay(1000);
	
	   }
				 
	}

任务恢复

	if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
	{
	
	while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)	 
	  {
	vTaskDelay(1000);
	vTaskResume(Task_Task1_Handler);// 任务恢复 
	printf("task1 is Handler\r\n"); //串口打印 
	vTaskDelay(1000);
	
	  }					
	
	}

挂起的任务函数
在这里插入图片描述

执行的应该LED1 (任务2), 因为挂起了 任务1  

恢复 任务函数

挂起什么就恢复什么 

在这里插入图片描述
实验现象
在这里插入图片描述

使用中断触发

nvic.c

 void NVIC_INIT(void) 
{
	EXTI_InitTypeDef   EXTI_InitStruct;
	NVIC_InitTypeDef  NVIC_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	Key_Init(); 
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3); 
	EXTI_InitStruct.EXTI_Mode =EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Line =EXTI_Line3;
	EXTI_InitStruct.EXTI_Trigger =EXTI_Trigger_Falling;
	EXTI_InitStruct.EXTI_LineCmd =ENABLE;
	EXTI_Init(&EXTI_InitStruct);
	
	NVIC_InitStruct.NVIC_IRQChannel =EXTI3_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =0x04;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority =0x00;
	NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE;
	NVIC_Init(&NVIC_InitStruct);

}

中断函数

extern TaskHandle_t Task_Task1_Handler;

void  EXTI3_IRQHandler(void)
{
 BaseType_t yieldRequired;
 delay_xms(20);
 
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{

     if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)	 
{
    	yieldRequired=xTaskResumeFromISR(Task_Task1_Handler);
	     printf("task1 is Handler\r\n"); 
	  
		if(yieldRequired==pdTRUE)      
	   portYIELD_FROM_ISR(yieldRequired);
	 }
	}
}
   EXTI_ClearITPendingBit(EXTI_Line3);

}

好像这样就行了  是不是呢 
串口打印为什么error 呢 

在这里插入图片描述
原因如下
在这里插入图片描述

 所以把 优先级改了就行了  改 5(包含)以上 

回去代码 需要注意一个地方

在这里插入图片描述

判断条件 是 手册 提供 的 并不是重点 主要我们要看下一句 为什么要进行 上下文切换呢 
因为你进入中断之后 执行完中断事件 如果不进行切换 你就卡在中断事件出不来了 
这里相当于是一个退出条件 退出成功之后就是回到最初的起点。
extern 关键字 可以调用其他文件的变量  并且不改变值 ,不影响调用文件的变量的使用 。
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:31:24  更:2022-03-03 16:32:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:32:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码