stm32裸机开发下利用MultiTimer多任务时间片询

news2024/10/6 12:23:51

stm32裸机开发下利用MultiTimer多任务时间片询


  • 📌MultiTimerGithub地址:https://github.com/0x1abin/MultiTimer
  • ✨这是一个类似Arduino平台上的Ticker库,如需阅读懂源码,起码需要有链表知识的储备,如果仅仅只是拿来使用,那就忽略具体实现的方法。

📑MultiTimer简介

MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更优雅更便捷地管理程序的时间触发时序。

⛳使用注意事项说明

  1. 定时器的时钟频率直接影响定时器的精确度,尽可能采用1ms/5ms/10ms这几个精度较高的tick;
  2. 定时器的回调函数内不应执行耗时操作,否则可能因占用过长的时间,导致其他定时器无法正常超时;
  3. 由于定时器的回调函数是在 MultiTimerYield() 内执行的,需要注意栈空间的使用不能过大,否则可能会导致栈溢出。

基于stm32f103,使用stm32cubemx配置的工程案例

  • 🔖为了省事,直接将其驱动文件分别拷贝到项目MultiTimer_Task\Core\IncMultiTimer_Task\Core\Src下。
  • 🌿在所创建好的工程中添加源文件(MultiTimer.c),右键其文件属性-设置为c源文件
    在这里插入图片描述

在这里插入图片描述

  • 🌿main.c程序示例代码
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @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 "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "MultiTimer.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
MultiTimer timer1;//创建任务对象
MultiTimer timer2;
MultiTimer timer3;
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint64_t PlatformTicksGetFunc(void)
{
    return (uint64_t)HAL_GetTick();
}
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void exampleTimer1Callback(MultiTimer* timer, void* userData)
{
    //回调函数1
    printf("[TASK1] Timer:%p callback-> %s.\r\n",  timer, (char*)userData);
    MultiTimerStart(timer, 1000, exampleTimer1Callback, userData);
    HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
}

void exampleTimer2Callback(MultiTimer* timer, void* userData)
{
    //回调函数2
    printf("[TASK2] Timer:%p callback-> %s.\r\n", timer, (char*)userData);
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}

void exampleTimer3Callback(MultiTimer* timer, void* userData)
{
    //回调函数3
    printf("[TASK3] Timer:%p callback-> %s.\r\n", timer, (char*)userData);
    MultiTimerStart(timer, 4567, exampleTimer3Callback, userData);//初始化并启动Timer
    HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_6);
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    /* USER CODE BEGIN 2 */
    MultiTimerInstall(PlatformTicksGetFunc);
    MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer");
    MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer");
    MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer");
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while(1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        MultiTimerYield();
    }
    /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /** Initializes the RCC Oscillators according to the specified parameters
    * in the RCC_OscInitTypeDef structure.
    */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }

    /** Initializes the CPU, AHB and APB buses clocks
    */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                                  | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        Error_Handler();
    }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
    /* USER CODE BEGIN Error_Handler_Debug */
    /* User can add his own implementation to report the HAL error return state */
    __disable_irq();
    while(1)
    {
    }
    /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
    /* USER CODE BEGIN 6 */
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

  • 📜串口调试信息输出:
    在这里插入图片描述

📚示例工程源码

  • 🏳‍🌈基于STM32CubeMX配置的stm32f103vc工程示例代码
链接: https://pan.baidu.com/s/1KbhfdzvpuUklwqboo3bAZQ
提取码: bfkb

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

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

相关文章

docker学习笔记(二)

目录 启动Docker ​编辑 建立 Docker 用户 ​编辑 测试 Docker 是否正常工作 卸载Docker Docker镜像加速器配置 配置镜像 检查加速器是否生效 如何在Linux中的.json文件下保存并退出 如果我是使用vi操作进来的&#xff0c;我该如何保存并退出呢&#xff1f; 如何在Li…

3 步集成 Terraform + 极狐GitLab CI ,实现基础设施自动化管理

本文来自&#xff1a;极狐GitLab 开发者社区 作者&#xff1a;KaliArch 利用极狐GitLab CI 实现基础设施编排自动化后&#xff0c;用户就可以使用极狐GitLab 进行基础设施管理&#xff1a;提交基础设施变更后&#xff0c;会触发 MR 进行极狐GitLab CI 流水线执行&#xff0c;从…

电视盒子什么牌子好?数码小编分享2023热销电视盒子排行榜

整理私信的时候有朋友希望我能分享电视盒子排行榜&#xff0c;对不了解电视盒子什么牌子好的朋友们来说&#xff0c;选购电视盒子时很容易踩雷&#xff0c;因此我根据各大电商平台的销量数据整理了最新热销电视盒子排行榜&#xff0c;对电视盒子感兴趣的朋友们可以了解一下。 ●…

时序预测 | Python实现AR、ARMA、ARIMA时间序列预测

时序预测 | MATLAB实现VAR和GARCH时间序列预测 目录 时序预测 | MATLAB实现VAR和GARCH时间序列预测预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Python实现AR、ARMA、ARIMA时间序列预测 模型原理 AR、ARMA、ARIMA都是常用的时间序列预测方法,它们的主要区别在…

功能优化升级,添加更丰富的刷题练习设置|会员权益、答题后显示数据、切题按钮、进入小组必设昵称、小组统计筛选条件、考试排行榜、优化缓存机制

土著刷题微信小程序v1.14&#xff0c;主要是针对用户在使用期间提的一些优化建议&#xff0c;经过评估后进行优化升级的一次版本&#xff0c;下面将逐条介绍一下这一版的优化点。 01 会员权益页面 通过对用户提出的问题进行归纳总结&#xff0c;部分用户在购买VIP时&#xff0c…

【git】修改作者和提交者信息

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 修改git作者和提交者信息 1. 正文 1.1 前提 1.1.1 作者和提交者 作者就是我们git log看到的信息&#xff0c;如下&#xff1a; 其修改方式参考&…

linux应用编程

项目内容 开发板内部使用c语言调用硬件驱动实现各种测试功能&#xff0c;保存测试结果。 外部程序通过socket接口使用tcp协议与开发板通信进行信息传输&#xff0c; 最后使用python GUI构造一个界面按照测试顺序逐步显示出各个模块的测试结果 测试包括&#xff1a;485-232uart、…

(十四)地理数据库创建——进一步定义数据库②

&#xff08;十四&#xff09;地理数据库创建——进一步定义数据库② 目录&#xff08;接上篇&#xff09; &#xff08;十四&#xff09;地理数据库创建——进一步定义数据库② 4.创建注释类4.1建立注释类4.2产生连接要素注释 5.创建几何网络5.1几何网络概述5.2建立几何网络 6…

亿级大表毫秒关联,荔枝微课基于Apache Doris 统一实时数仓建设实践

本文导读&#xff1a; Apache Doris 助力荔枝微课构建了规范的、计算统一的实时数仓平台&#xff0c;目前 Apache Doris 已经支撑了荔枝微课内部 90% 以上的业务场景&#xff0c;整体可达到毫秒级的查询响应&#xff0c;数据时效性完成 T1 到分钟级的提升&#xff0c;开发效率更…

设备树的相关概念

.dts相当于.c DTS的源码文件 DTC工具相当于gcc编译器 将dts 编译成 dtb dtb相当于bin文件 或可执行文件 编译dtb 文件的方法 在linux内核文件夹中 make imx6ull-alientek-emmc.dtb在执行上述代码之前 要把 imx6ull-alientek-emmc.dtb删除 否则会提示已经存在 dts的结构 层层…

【Python文本处理】基于GPX文件的心率、速度、时间等参数更改

【Python文本处理】基于GPX文件的心率、速度、时间等参数更改 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;time 心率&#xff1a;heartrate 在不改变坐标和距离的情况下 缩短时间即可提高速度&#…

使用rsync和inotify实时备份CentOS服务器数据(详解)

简介 在日常运维中&#xff0c;确保服务器上的数据安全是至关重要的。数据丢失或损坏可能会导致灾难性后果&#xff0c;因此定期备份数据是一个明智的做法。本文LZ将向您展示如何使用 rsync 和 inotify-tools 工具在 CentOS 系统上设置实时备份&#xff0c;以确保您的数据始终…

Google I/O:谷歌AR看似不紧不慢,实则暗藏玄机

在今天举行的Google I/O大会上&#xff0c;尽管AI是全场最大的关注点&#xff0c;也还是有一系列AR相关技术和应用更新&#xff0c;比如&#xff1a;ARCore进行更新、推出新的Geospatial Creator等等。 ARCore面世已有5年时间&#xff0c;谷歌每年都在持续推动AR技术的发展。相…

Webpack 核心概念

文章目录 Webpack 核心概念概述安装webpack简单使用配置webpack.config.js配置package.json打包 核心概念modeentry 和 outputentry配置说明output配置说明配置单入口配置多入口 loader安装babel、babel-loader、core-js配置.babelrc配置webpack.config.js配置package.json编写…

【Linux】9. 习题①

2022-09-17_Linux环境与版本 1. 命令拓展(了解) linux查看cpu占用的命令是什么&#xff1f; A.top B.netstat C.free D.df 【答案解析】A 2022-09-24_Linux环境与版本 2. 命令拓展(了解) 以下哪个命令输出Linux内核的版本信息&#xff1a; A.uname -r B.vmstat C.sar D.sta…

wms仓库管理对企业的重要性

一、什么是wms仓库管理&#xff1f; WMS是仓库管理系统的缩写&#xff0c;它提供了一个可视化、智能化的平台&#xff0c;帮助公司进行仓库作业的管理和优化。WMS系统可以支持各种类型的仓库&#xff0c;包括零件、分销、批发、跨境电商等等&#xff0c;并提供多种功能&#xf…

如何查找下载外文文献,超强外文文献检索网站排名

英文文献哪里找&#xff0c;下面小编给大家推荐几个超强英文文献下载网站&#xff0c;推荐排名如下&#xff1a; 第4名&#xff1a;sci-hub 这个网站很多科研人都知道&#xff0c;优点是可以免费下载英文文献&#xff0c;缺点是网站不太稳定经常换域名&#xff0c;而且需要你明…

Zoho Desk获G2“2023年优秀软件”称号

备受瞩目的G2年度优秀软件评选结果终于在近期公布了。该奖项旨在表彰过去一年&#xff0c;在软件行业有突出亮点的厂商和产品。在今年的评选中&#xff0c;除了坚持过往满意度、市场占有率等评选维度&#xff0c;额外新增了英国、法国及德国三个地区的产品名单&#xff0c;还增…

5年测试被裁,去面试差点被问哭了······

我的个人背景非常简单&#xff0c;也可以说丝毫没有亮点。 学历普通&#xff0c;计算机专业二本毕业&#xff0c;毕业后出来就一直在一家小公司&#xff0c;岁月如梭细&#xff0c;算了下至今从事软件测试已经5年了&#xff0c;也点点点了五年&#xff0c;每天都是重复的工作&…

使用遗传算法解决一维下料问题(一、实现思路分析)

目录 一、前言 二、概念 三、术语定义 四、问题描述 五、实现思路 1、遗传算法 2、一维下料和遗传算法结合 六、下文预告 一、前言 三年前我就折腾过一维下料问题了&#xff0c;当时查遍百度、谷歌&#xff0c;阅尽硕博论文&#xff0c;最终采用自研算法解决了一维下料…