STM32与Freertos入门(五)任务案例

1、实现功能

通过两个按键任务分别控制不同的点灯案例

创建 4 个任务:在点灯任务的基础上在创建两个按键任务:
Task_led:间隔 500ms 闪烁 LE1;
Task_led2:间隔 1000ms 闪烁 LED2;
Task_key:如果 Task_led存在,则按下 KEY 后删除 Task_led,否则创建 Task_led;
Task_key2:如果 Task_led2正常运行,则按下 KEY2 后挂起 Task_led2,否则恢复 Task_led2

2、CubeMX配置

2.1 GPIO初始化

2.2 任务建立

 3、KEIL 5代码编写

3.1 main.h初始化

#define LED_ON   HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET)
#define LED_OFF	 HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET)
#define LED2_ON	 HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET)
#define LED2_OFF HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET)
#define key      HAL_GPIO_ReadPin(key_GPIO_Port,key_Pin)
#define key2     HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)

 3.2 功能实现

 任务1:

void StartTask_led(void const * argument)
{/* USER CODE BEGIN StartTask_led *//* Infinite loop */for(;;){LED_ON;osDelay(500);LED_OFF;osDelay(500);}/* USER CODE END StartTask_led */
}

 任务2:

void StartTask_led2(void const * argument)
{/* USER CODE BEGIN StartTask_led2 *//* Infinite loop */for(;;){LED2_ON;osDelay(1000);LED2_OFF;osDelay(1000);}/* USER CODE END StartTask_led2 */
}

 任务3:

void StartTask_key(void const * argument)
{/* USER CODE BEGIN StartTask_key *//* Infinite loop */for(;;){if(key==0){ osDelay(20);if(key==0){printf("key按下\r\n");if(Task_ledHandle == NULL){osThreadDef(Task_led, StartTask_led, osPriorityNormal, 0, 128);Task_ledHandle = osThreadCreate(osThread(Task_led), NULL);if(Task_ledHandle != NULL){printf("task_1成功\r\n");}}else{printf("detele\r\n");osThreadTerminate(Task_ledHandle);Task_ledHandle = NULL;}}while(key==0);}osDelay(10);}/* USER CODE END StartTask_key */
}

 任务4:

void StartTask_key2(void const * argument)
{/* USER CODE BEGIN StartTask_key2 */static int flag = 0;/* Infinite loop */for(;;){if(key2==0){ osDelay(20);if(key2==0){printf("key2按下\r\n");if(flag == 0){osThreadSuspend(Task_led2Handle);printf("任务2以暂停\r\n");flag=1;}else{osThreadResume(Task_led2Handle);printf("任务2恢复\r\n");flag=0;}}while(key2==0);}osDelay(10);}	/* USER CODE END StartTask_key2 */
}

 整个freertos.c代码如下:

/* USER CODE BEGIN Header */
/********************************************************************************* File Name          : freertos.c* Description        : Code for freertos applications******************************************************************************* @attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables *//* USER CODE END Variables */
osThreadId Task_ledHandle;
osThreadId Task_led2Handle;
osThreadId Task_keyHandle;
osThreadId Task_key2Handle;/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes *//* USER CODE END FunctionPrototypes */void StartTask_led(void const * argument);
void StartTask_led2(void const * argument);
void StartTask_key(void const * argument);
void StartTask_key2(void const * argument);void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) *//* GetIdleTaskMemory prototype (linked to static allocation support) */
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;*ppxIdleTaskStackBuffer = &xIdleStack[0];*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;/* place for user code */
}
/* USER CODE END GET_IDLE_TASK_MEMORY *//*** @brief  FreeRTOS initialization* @param  None* @retval None*/
void MX_FREERTOS_Init(void) {/* USER CODE BEGIN Init *//* USER CODE END Init *//* USER CODE BEGIN RTOS_MUTEX *//* add mutexes, ... *//* USER CODE END RTOS_MUTEX *//* USER CODE BEGIN RTOS_SEMAPHORES *//* add semaphores, ... *//* USER CODE END RTOS_SEMAPHORES *//* USER CODE BEGIN RTOS_TIMERS *//* start timers, add new ones, ... *//* USER CODE END RTOS_TIMERS *//* USER CODE BEGIN RTOS_QUEUES *//* add queues, ... *//* USER CODE END RTOS_QUEUES *//* Create the thread(s) *//* definition and creation of Task_led */osThreadDef(Task_led, StartTask_led, osPriorityNormal, 0, 128);Task_ledHandle = osThreadCreate(osThread(Task_led), NULL);/* definition and creation of Task_led2 */osThreadDef(Task_led2, StartTask_led2, osPriorityBelowNormal, 0, 128);Task_led2Handle = osThreadCreate(osThread(Task_led2), NULL);/* definition and creation of Task_key */osThreadDef(Task_key, StartTask_key, osPriorityNormal, 0, 128);Task_keyHandle = osThreadCreate(osThread(Task_key), NULL);/* definition and creation of Task_key2 */osThreadDef(Task_key2, StartTask_key2, osPriorityNormal, 0, 128);Task_key2Handle = osThreadCreate(osThread(Task_key2), NULL);/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... *//* USER CODE END RTOS_THREADS */}/* USER CODE BEGIN Header_StartTask_led */
/*** @brief  Function implementing the Task_led thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_StartTask_led */
void StartTask_led(void const * argument)
{/* USER CODE BEGIN StartTask_led *//* Infinite loop */for(;;){LED_ON;osDelay(500);LED_OFF;osDelay(500);}/* USER CODE END StartTask_led */
}/* USER CODE BEGIN Header_StartTask_led2 */
/**
* @brief Function implementing the Task_led2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask_led2 */
void StartTask_led2(void const * argument)
{/* USER CODE BEGIN StartTask_led2 *//* Infinite loop */for(;;){LED2_ON;osDelay(1000);LED2_OFF;osDelay(1000);}/* USER CODE END StartTask_led2 */
}/* USER CODE BEGIN Header_StartTask_key */
/**
* @brief Function implementing the Task_key thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask_key */
void StartTask_key(void const * argument)
{/* USER CODE BEGIN StartTask_key *//* Infinite loop */for(;;){if(key==0){ osDelay(20);if(key==0){printf("key按下\r\n");if(Task_ledHandle == NULL){osThreadDef(Task_led, StartTask_led, osPriorityNormal, 0, 128);Task_ledHandle = osThreadCreate(osThread(Task_led), NULL);if(Task_ledHandle != NULL){printf("task_1成功\r\n");}}else{printf("detele\r\n");osThreadTerminate(Task_ledHandle);Task_ledHandle = NULL;}}while(key==0);}osDelay(10);}/* USER CODE END StartTask_key */
}/* USER CODE BEGIN Header_StartTask_key2 */
/**
* @brief Function implementing the Task_key2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask_key2 */
void StartTask_key2(void const * argument)
{/* USER CODE BEGIN StartTask_key2 */static int flag = 0;/* Infinite loop */for(;;){if(key2==0){ osDelay(20);if(key2==0){printf("key2按下\r\n");if(flag == 0){osThreadSuspend(Task_led2Handle);printf("任务2以暂停\r\n");flag=1;}else{osThreadResume(Task_led2Handle);printf("任务2恢复\r\n");flag=0;}}while(key2==0);}osDelay(10);}	/* USER CODE END StartTask_key2 */
}/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application *//* USER CODE END Application */

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索计算机视觉的无限可能

计算机视觉(CV)是人工智能领域的一个热门分支,它涉及到从图像和视频中提取信息,理解其内容,并执行各种任务。在这个博客中,我们将深入探讨计算机视觉的原理、应用和最新技术。 一、计算机视觉简介 计算机…

【Java系列】详解多线程(三)—— 线程安全(上篇)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一…

go-zero开发入门之网关往rpc服务传递数据2

go-zero 的网关服务实际是个 go-zero 的 API 服务,也就是一个 http 服务,或者说 rest 服务。http 转 grpc 使用了开源的 grpcurl 库,当网关需要往 rpc 服务传递额外的数据,比如鉴权数据的时候,通过 http 的 header 进行…

​SQL (关系型) 数据库-fastapi集成

SQL (关系型) 数据库 - FastAPI FastAPI不需要你使用SQL(关系型)数据库。 但是您可以使用任何您想要的关系型数据库。 在这里,让我们看一个使用着SQLAlchemy的示例。 您可以很容易地将SQLAlchemy支持任何数据库,像: PostgreSQLMySQLSQLi…

vue3 setup语法糖写法基本教程

前言 官网地址:Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)下面只讲Vue3与Vue2有差异的地方,一些相同的地方我会忽略或者一笔带过与Vue3一同出来的还有Vite,但是现在不使用它,等以后会有单独的教程使用。目前仍旧使用v…

eNSP小实验(ACL和NAT)

一.ACL 实验目的:过滤流量,然后匹配规划后,判断该流量通过或拒绝 1.拓扑图 2.配置 基本ACL 其它同理配置 R1 [Huawei]sys R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]dis th [V200R003C00] # interface GigabitEthernet0/0/0 # return…

[Verilog] Verilog 基本格式和语法

主页: 元存储博客 全文 3000 字 文章目录 1. 声明格式1.1 模块声明1.2 输入输出声明1.3 内部信号声明1.4 内部逻辑声明1.5 连接声明1.6 数据类型声明1.7 运算符和表达式1.8 控制结构 2. 书写格式2.1 大小写2.2 换行2.3 语句结束符2.4 注释2.5 标识符2.6 关键字 1. 声…

面试经典150题(21-26)

leetcode 150道题 计划花两个月时候刷完,今天(第十二天《天数乱了》)完成了6道(21-26)150: 21.(28. 找出字符串中第一个匹配项的下标) 题目描述: 给你两个字符串 haystack 和 needle ,请你在 haystack 字…

[RTOS移植]--STM32F767移植RTThread

文章目录 通过STM32cube创建一个工程选择要移植的RTOS源下载到本地如果没有重启软件选择对应配置后续补充 通过STM32cube创建一个工程 选择要移植的RTOS源 下载到本地 如果没有重启软件 选择对应配置 Build started: Project: STM32F767 *** Using Compiler V5.06 update 7 (b…

淘宝类目信息API接口获取淘宝商品分类信息API调用说明(含APIkey密钥)

cat_get-获得淘宝分类详情 item_cat_get-获得淘宝商品类目 公共参数 名称类型必须描述keyString是调用key(点此获取)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_…

Redis-数据结构

参考资料 极客时间Redis(亚风) Redis数据结构 SDS sds(Simple Dynamic String) 字符串接结构体: struct --attribute_- ((-_packed__)) sdshdr8{uint8_t len;/* buf已保祥的字符串字节数,不包含结束标示*/uint8_t alloc&#…

ArrayList和LinkedList区别

目录 一、性质不同 二、作用不同 三、特点不同 一、性质不同 1、arraylist:ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本。 2、linkedlist:LinkedList 是一个继承于AbstractSequentialList的双向链表。 二、作…

Hadoop分布式配置小白篇(附加各阶段问题解决方式)

看的黑马的课,记录一下配置步骤 目录 1.VMware安装: 方法1: 方法2: 2.创建虚拟机 1.ISO镜像文件获取(CentOS): 2.创建(简略步骤) 3.克隆虚拟机(克隆伪…

nodejs+vue+微信小程序+python+PHP运动项目推荐系统-计算机毕业设计推荐

运动项目推荐系统的整体架构确定以后,再来看运动项目推荐系统的主要功能模块图。整体的功能模块包括前台和后台,前台只要实现了注册用户功能,主要的页面,包括首页,体育资讯,体育项目,公告信息等…

爬虫框架beautifulsoup详解

CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。 lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM的,会载入整个文档&#xff0…

论文润色优化讨论部分 PaperBERT

大家好,今天来聊聊论文润色优化讨论部分,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:论文润色优化讨论部分――提升论文深度与影响力的关键…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring中自动装配和中注解

第一章 Spring中自动装配【基于XML】 1.1 Spring中提供两种装配方式 手动装配自动装配 1.2 Spring自动装配语法及规则 在bean标签中添加属性:Autowire即可 byName:对象中属性名称与容器中的beanId进行匹配,如果属性名与beanId数值一致&…

复盘理解/实验报告梳理 数据结构PTA实验一

新系列!!! 由于要写数据结构实验,所以我需要重新梳理一下我前面写过的实验题,顺便写一个综合性较强的博文,针对实验报告中的“调试过程”内容进行复盘,方便复习。 一、约瑟夫环 此题内容是对于…

方差分析实例

目录 方差分析步骤 相关概念 基本思想 随机误差 系统误差 组内方差 组间方差 方差的比较 方差分析的前提 1.每个总体都应服从正态分布 2.各个总体的方差必须相同 3.观察值是独立的 原假设成立 备择假设成立 单因素方差分析 提出假设 检验的统计量 水平的均值…

基于JSP+Servlet+Mysql的建设工程监管信息

基于JSPServletMysql的建设工程监管信息 一、系统介绍二、功能展示1.企业信息列表2.录入项目信息3.项目信息列表 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServlet的建设工程监管信息 项目架构:B/S架构 开发语言:…