news 2026/7/29 5:27:13

FreeRTOS(3):任务挂起与恢复

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FreeRTOS(3):任务挂起与恢复

任务简介

任务大体上与上一篇文章的任务差不多,但是将PB1连接的按键用来挂起任务,PB11的按键用来恢复任务,PB4的按键用中断恢复任务(使用xTaskResumeFromISR函数)。

任务创建

复制上一篇文章的FreeRTOS_任务创建与删除(动态)文件夹,粘贴后改名为FreeRTOS_任务创建与恢复,进入keil。

代码编写

由于PB4引脚是JTAG引脚,所以在使用PB4引脚前要先释放该引脚,然后配置中断,具体函数如下,笔者是直接将它加在了Key.c这个文件里的:

void PB4_EXTI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 1. 使能GPIOB、AFIO复用时钟(EXTI必须AFIO时钟) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // 2. 关闭JTAG,释放PB3/PB4引脚(F1必须加,否则PB4无法做普通IO) GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 3. 配置PB4 GPIO模式:上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 内部上拉输入 GPIO_Init(GPIOB, &GPIO_InitStructure); // 4. 配置EXTI中断线:PB4映射到EXTI4 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4); EXTI_InitStructure.EXTI_Line = EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 5. NVIC中断优先级配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x06; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

随后在key.h这个函数里声明PB4_EXTI_Init函数,使得外部能够调用该函数。

随后打开FreeRTOS_Task.c文件,由于我们定义了PB4_EXTI_Init函数,所以我们要引用该函数,笔者是直接将他加在别的初始化函数下方,如下方代码所示

void FreeRTOS_Task(void) { Key_Init(); LED_Init(); PB4_EXTI_Init(); xTaskCreate( (TaskFunction_t ) Start_task, (char * ) "Start_task", (configSTACK_DEPTH_TYPE) START_TASK_SIZE, (void * ) NULL, (UBaseType_t ) START_TASK_PRIO, (TaskHandle_t * ) &start_task_handle ); vTaskStartScheduler(); }

随后更改一下task_3函数中的部分语句即可,即将PA1所接按键的事件改为触发vTaskSuspend函数,既将task_1任务挂起,将PA1所接按键的事件改为触发vTaskResume函数,既将task_1任务恢复,参考代码如下:

void task_3( void * pvParameters ) { uint8_t KeyVal = 0; while(1) { KeyVal = Key_GetNum(); if(KeyVal != 0) { vTaskDelay(pdMS_TO_TICKS(20)); // RTOS延时,让出CPU,LED正常闪烁 if(Key_GetNum() == KeyVal) // 二次确认消抖 { // 等待按键松开 while(Key_GetNum() != 0) { vTaskDelay(pdMS_TO_TICKS(10)); } vTaskDelay(pdMS_TO_TICKS(20)); // 按键触发逻辑 if(KeyVal == 1) { vTaskSuspend(task1_handle); } else if(KeyVal == 2) { vTaskResume(task1_handle); } } } vTaskDelay(pdMS_TO_TICKS(10)); } }

随后我们就可以写中断函数了,在FreeRTOS_Task.c 文件最后添加EXTI4_IRQHandler中断函数,用来使得PB4触发xTaskResumeFromISR函数,具体代码如下:

void EXTI4_IRQHandler(void) { BaseType_t xNeedSwitch = pdFALSE; if(EXTI_GetITStatus(EXTI_Line4) != RESET) { // 硬件消抖:确认PB4低电平(按键按下) if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0) { // 中断专用恢复任务API xNeedSwitch = xTaskResumeFromISR(task1_handle); } EXTI_ClearITPendingBit(EXTI_Line4); //清除中断标志位 } // 若唤醒更高优先级任务,立即切换上下文 portYIELD_FROM_ISR(xNeedSwitch); }

最后编译后下载即可实现现象。

若有错误,还望海涵。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 5:26:33

芯和半导体携手联想集团在DAC 2026现场发布EDA Agent最新研发成果

国产EDA率先落地AI智能体实战应用【美国长滩讯】2026年7月26日,全球规模最大的电子设计自动化(EDA)行业盛会——DAC 2026在美国加利福尼亚州长滩市开幕。本届大会以“AI For EDA”为核心议题,全球主要EDA厂商均在会上展示AI智能体…

作者头像 李华
网站建设 2026/7/29 5:21:20

STM32 FSMC/FMC外部存储器控制器原理与应用详解

1. 从“为什么需要FSMC/FMC”说起如果你刚开始接触STM32,尤其是那些带屏幕、带SRAM、带NAND Flash的“大”项目,你可能会被一个叫FSMC或者FMC的外设搞得一头雾水。数据手册上那一大堆寄存器、时序图,看起来复杂得让人想放弃。别急&#xff0c…

作者头像 李华
网站建设 2026/7/29 5:20:28

上海系统门窗哪家技术强

随着上海家装及公建市场对系统门窗需求的持续攀升,系统门窗已成为封阳台、阳光房搭建和住宅性能升级的核心品类。上海地处亚热带季风气候区,年降雨量充沛且夏季多台风极端天气,这对门窗的耐候性、防渗水性提出了更高要求。本次推荐的5家系统门…

作者头像 李华
网站建设 2026/7/29 5:20:10

【C++重载操作符与转换】下标操作符

在 C 编程里,操作符重载是一项强大的特性,它能够让我们自定义类的行为,使其操作更符合直觉和业务需求。其中,下标操作符 [] 的重载尤为重要,它使得我们可以像访问数组元素一样访问自定义类对象的元素,极大地…

作者头像 李华
网站建设 2026/7/29 5:17:56

STM32 ADC配置与实战:从原理到多通道采集与滤波优化

1. 项目概述:从模拟到数字的桥梁在嵌入式开发的世界里,我们常常需要和现实世界的物理量打交道,比如温度、压力、光照强度或者电池电压。这些物理量在传感器处理后,通常以连续变化的模拟电压信号形式呈现。然而,我们手中…

作者头像 李华
网站建设 2026/7/29 5:13:28

国产RISC-V MCU移植Arduino生态实战:从工具链到核心库的完整指南

1. 项目概述:当国产RISC-V MCU遇上经典生态最近在捣鼓一块国产的Ch32V305开发板,这芯片用的是沁恒微电子的RISC-V内核,性能不错,价格也香。但官方给的开发环境是基于MounRiver Studio的,虽然功能齐全,但用惯…

作者头像 李华