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

news2024/12/23 18:36:17

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.coloradmin.cn/o/1314995.html

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

相关文章

为了吃鸡苦练狙击,避免坑队友自己造一个狙击游戏!

引言 一文教会你造一个简易的狙击游戏。 说到狙击,相信大家都不陌生,无论是影视作品还是网络游戏,都经常能看到狙击枪的身影,最深刻的是它能够从百里之外,一枪爆头。 本文将介绍如何在Cocos Creator中造一个简易的狙…

Jenkins Pipeline 脚本优化实践:从繁琐到简洁

引言 在持续集成的过程中,Jenkins Pipeline 是非常关键的一环。它定义了如何自动编译、测试和部署代码。随着项目的不断发展,Pipeline 的复杂性也在不断上升,这就需要我们持续优化 Pipeline 脚本,以提高代码的可读性和维护性。本…

最好的猫粮排行榜前十名有哪些牌子?盘点好的主食冻干猫粮前五名牌子

现在很多猫咪因为吃了不好的猫粮,出现了各种问题,甚至有的还发生了悲剧,让猫主人心疼又无奈。要解决这个问题,选择一款健康又安全的主食冻干猫粮是非常关键的。优质的主食冻干猫粮不仅在配方上要健康,营养配比也要科学…

【深度学习】注意力机制(二)

本文介绍一些注意力机制的实现,包括EA/MHSA/SK/DA/EPSA。 【深度学习】注意力机制(一) 【深度学习】注意力机制(三) 目录 一、EA(External Attention) 二、Multi Head Self Attention 三、…

26 redis 中 replication/cluster 集群中的主从复制

前言 我们这里首先来看 redis 这边实现比较复杂的 replication集群模式 我们这里主要关注的是 redis 这边的主从同步的相关实现 这边相对比较简单, 我们直接基于 cluster集群模式 进行调试 主从命令同步复制 比如这里 master 是 redis_7002, slave 是 redis_7005 然后 这…

打开软木塞,我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上,这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗,你喜欢喝的那瓶香槟酒可能根本不是香槟,而是汽酒?你不是唯一一个认…

6个超好用的小众图片素材网站,高清、免费,值得收藏~

推荐几个超好用的图片素材网站,免费下载,还可以商用,建议收藏哦~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 我推荐过很多次的设计素材网站,除了设计类素材,还有很多自媒体可以用到的高清图片、背景…

最好的猫粮排行榜前十名有哪些品牌?质量好的主食冻干猫粮分享

为什么越来越多人推荐冻干猫粮喂养呢?主食冻干猫粮究竟是最适应猫饮食习惯的喂养方式还是消费陷阱? 作为一个6年的宠物营养师,我以前接触过很多不同品种的猫咪,一只健康又漂亮的猫咪从表面上就能看出来!体型匀称刚好、…

大模型落地,向量数据库到底能做什么?

▼最近直播超级多,预约保你有收获 今晚直播:《AI编程向量数据库架构设计案例实践》 —1— 大模型的“数据局限性” 数据局限对企业做 LLM 大模型带来的影响,可归结为以下三点: 第一点:对数据的管理和运维。随着文本、…

LeetCode(63)旋转链表【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 旋转链表 1.题目 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2&…

深入理解LightGBM

1. LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#…

python初试二

连接数据库 Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。 在Linux终端下启动mysql: $mysql -u root -p 在MySQL中创立Django项目的数据库: …

【数据结构和算法】判断子序列

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:双指针 三、代码 3.1 方法一:双指针 3.1.1 Java易懂版:…

Cosmopolitan Libc:让 C 语言一次构建、随处运行 | 开源日报 No.109

jart/cosmopolitan Stars: 12.9k License: ISC Cosmopolitan Libc 使 C 成为一种构建一次运行在任何地方的语言,就像 Java 一样,但它不需要解释器或虚拟机。相反,它重新配置了标准 GCC 和 Clang 以输出符合 POSIX 标准的多语言格式&#xff…

VS Code连接远程Linux服务器调试C程序

1.在 VS Code 上安装扩展 C/C 2.通过 VS Code 连接远程 Linux 服务器 3.通过 VS Code 在远程 Linux 服务器上安装扩展 C/C 4.打开远程 Linux 服务器上的文件夹 【注】本文以 /root/ 为例。 5.创建项目文件夹,并在项目文件夹下创建C程序 6.按 F5,选…

数据挖掘任务一般流程

数据挖掘是从大量数据中提取有价值信息的过程。它涉及多个步骤,每一步都对整个数据挖掘过程至关重要。以下是数据挖掘任务的一般流程: 业务理解: 确定业务目标。评估当前情况。定义数据挖掘问题。制定一个初步计划来达到这些目标。 数据理…

JVM的类的生命周期

目录 前言 1. 加载(Loading): 2. 验证(Verification): 3. 准备(Preparation): 4. 解析(Resolution): 5. 初始化(Ini…

解决ES伪慢查询

一、问题现象 服务现象 服务接口的TP99性能降低 ES现象 YGC:耗时极其不正常, 峰值200次,耗时7sFULL GC:不正常,次数为1但是频繁,STW 5s慢查询:存在慢查询5 二 解决过程 1、去除干扰因素 从现象上看应用是由于某种…

从零开始:前端架构师的基础建设和架构设计之路

文章目录 一、引言二、前端架构师的职责三、基础建设四、架构设计思想五、总结《前端架构师:基础建设与架构设计思想》编辑推荐内容简介作者简介目录获取方式 一、引言 在现代软件开发中,前端开发已经成为了一个不可或缺的部分。随着互联网的普及和移动…

算法通关第十九关-青铜挑战理解动态规划

大家好我是苏麟 , 今天聊聊动态规划 . 动态规划是最热门、最重要的算法思想之一,在面试中大量出现,而且题目整体都偏难一些对于大部人来说,最大的问题是不知道动态规划到底是怎么回事。很多人看教程等,都被里面的状态子问题、状态…