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,一经查实,立即删除!

相关文章

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

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

​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. 声…

[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运动项目推荐系统-计算机毕业设计推荐

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

论文润色优化讨论部分 PaperBERT

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

方差分析实例

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

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

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

漏刻有时数据可视化Echarts组件开发(44)提示框组件与返回多边形

CSS样式表 #lock_box {padding: 0;margin: 0;height: 100%;width: 100%;}.tipsBox {background: transparent url("images/tipsbg.png") top center no-repeat;width: 260px;height: 203px;box-shadow: none;}.tipsBox > p:first-child {padding-left: 35px;font…

git的安装及使用

git的安装及使用 git的安装 官网地址:https://git-scm.com/download/win 在任何位置输入bash或sh,进入git 设置用户名邮箱。 git config --global user.name “wfyfly” git config --global user.email 2423217861qq.com 查看配置信息 git config --list --globa…

C++核心编程思路(1):①程序的内存模型②引用的作用

文章目录 前言一、不同的存储类型变量,会被存储在什么区?①const修饰的局部变量放在栈区,全局变量放在只读数据区。②static修饰的全局和局部变量都放在静态区(即数据区中的一个小区) 二、栈区1.如果在函数A中定义了一…

2019年AMC8数学竞赛真题的典型考点和详细解析

从战争中学习战争。 对于2024年1月19日的AMC8竞赛,最后一个月的时间如何备考和冲刺取得更好的成绩?很多高分考生的经验是刷真题,查漏补缺。那么如何提高刷真题的效率呢?使用六分成长独家制作的在线真题集练习是个不错的方式&…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(四)linux安装Mysql

1.切换到你需要安装mysql的路径 cd /root/usr/ 2.在线安装 安装网上的安装方式都有很多,可以自己百度一下 我们这里是自己搭建测试环境,可以直接选择在线安装,命令如下:yum install mysql-server, 但是我失败了 ┭┮…

【C++11特性篇】C++11中新增的initializer_list——初始化的小利器(2)

前言 大家好吖,欢迎来到 YY 滴C11系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.探究std::initializer_list是什么…