FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-7:软件定时器)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。

注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。

后续文章会同时发表在个人博客(jason1016.club)、CSDN;

视频会发布在bilibili(UID:399951374)

一、概念(干啥用的)

不调用硬件定时器资源,用软件模拟定时器,但是只能起到计时作用,也没有定时器外设准

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数

软件定时器的回调函数是在定时器服务任务中执行的,所以一定不能在回调函数中调用任何会阻塞任务的 API 函数!比如,定时器回调函数中千万不能调用 vTaskDelay()、vTaskDelayUnti(),还有一些访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

二、原理(他是怎么工作的)

定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务(或 Daemon)任务来提供的。FreeRTOS 提供了很多定时器有关的 API 函数,这些 API 函数大多都使用 FreeRTOS的队列发送命令给定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给FreeRTOS 的软件定时器使用的,用户不能直接访问!

三、配置

/***************************************************************************************************************/
/*                                FreeRTOS与软件定时器有关的配置选项                                            */
/***************************************************************************************************************/
#define configUSE_TIMERS                        1                               //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY                (configMAX_PRIORITIES-1)        //软件定时器优先级
#define configTIMER_QUEUE_LENGTH                5                               //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH            (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小

四、软件定时器的类型

单次定时器

定时器回调函数就执行一次

周期定时器

一旦启动以后就会在执行完回调函数以后自动的重新启动

五、软件定时器的操作函数

1、复位软件定时器

有时候我们可能会在定时器正在运行的时候需要复位软件定时器,复位软件定时器的话会重新计算定时周期到达的时间点,这个新的时间点是相对于复位定时器的那个时刻计算的,并不是第一次启动软件定时器的那个时间点。

//任务级复位软件定时器
BaseType_t xTimerReset( TimerHandle_t xTimer,        //xTimer: 要复位的软件定时器的句柄。
                        TickType_t xTicksToWait )    //xTicksToWait: 设置阻塞时间,调用函数 xTimerReset ()开启软件定时器其实就是向定时器命令队列发送一条 tmrCOMMAND_RESET 命令,既然是向队列发送消息,那肯定会涉及到入队阻塞时间的设置。
/*返回值:
    pdPASS: 软件定时器复位成功,其实就是命令发送成功。
    pdFAIL: 软件定时器复位失败,命令发送失败*/
    
//中断级复位软件定时器
aseType_t xTimerResetFromISR( TimerHandle_t xTimer,                    //xTimer: 要复位的软件定时器的句柄。
                              BaseType_t * pxHigherPriorityTaskWoken );//pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:
    pdPASS: 软件定时器复位成功,其实就是命令发送成功。
    pdFAIL: 软件定时器复位失败,命令发送失败。*/

2、创建软件定时器

//动态方法
TimerHandle_t xTimerCreate( const char * const pcTimerName,             //pcTimerName: 软件定时器名字,名字是一串字符串,用于调试使用。
                            TickType_t xTimerPeriodInTicks,             //xTimerPeriodInTicks : 软件定时器的定时器周期, 单位是时钟节拍数。可以借助portTICK_PERIOD_MS 将 ms 单位转换为时钟节拍数。举个例子,定时器的周期为 100 个时钟节拍的话,那么 xTimerPeriodInTicks 就为100,当定时器周期为 500ms 的时候 xTimerPeriodInTicks 就可以设置为(500/ portTICK_PERIOD_MS)。
                            UBaseType_t uxAutoReload,                   //uxAutoReload: 设置定时器模式,单次定时器还是周期定时器?当此参数为 pdTRUE的时候表示创建的是周期定时器。如果为 pdFALSE 的话表示创建的是单次定时器。
                            void * pvTimerID,                           //pvTimerID: 定时器 ID 号,一般情况下每个定时器都有一个回调函数,当定时器定时周期到了以后就会执行这个回调函数。但是 FreeRTOS 也支持多个定时器共用同一个回调函数,在回调函数中根据定时器的 ID 号来处理不同的定时器。
                            TimerCallbackFunction_t pxCallbackFunction )//pxCallbackFunction: 定时器回调函数,当定时器定时周期到了以后就会调用这个函数。
/*返回值:
    NULL: 软件定时器创建失败。
    其他值: 创建成功的软件定时器句柄。*/

3、开启软件定时器

//任务级开启软件定时器
BaseType_t xTimerStart( TimerHandle_t xTimer,     //xTimer: 要开启的软件定时器的句柄。
                        TickType_t xTicksToWait ) //xTicksToWait: 设置阻塞时间,调用函数 xTimerStart()开启软件定时器其实就是向定时器命令队列发送一条 tmrCOMMAND_START 命令,既然是向队列发送消息,那肯定会涉及到入队阻塞时间的设置。
/*返回值:
    pdPASS: 软件定时器开启成功,其实就是命令发送成功。
    pdFAIL: 软件定时器开启失败,命令发送失败。*/
    
//中断级开启软件定时器
BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,                    //xTimer: 要开启的软件定时器的句柄。
                               BaseType_t * pxHigherPriorityTaskWoken );//pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:
    pdPASS: 软件定时器开启成功,其实就是命令发送成功。
    pdFAIL: 软件定时器开启失败,命令发送失败。*/

4、停止软件定时器

//任务级停止软件定时器
BaseType_t xTimerStop ( TimerHandle_t xTimer,     //xTimer: 要停止的软件定时器的句柄。
                        TickType_t xTicksToWait ) //xTicksToWait: 设置阻塞时间,调用函数 xTimerStop()停止软件定时器其实就是向定时器命令队列发送一条 tmrCOMMAND_STOP 命令,既然是向队列发送消息,那肯定会涉及到入队阻塞时间的设置。
/*返回值:
    pdPASS: 软件定时器停止成功,其实就是命令发送成功。
    pdFAIL: 软件定时器停止失败,命令发送失败。*/
    
//中断级停止软件定时器
BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,                    //xTimer: 要停止的软件定时器句柄。
                              BaseType_t * pxHigherPriorityTaskWoken );//pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:
    pdPASS: 软件定时器停止成功,其实就是命令发送成功。
    pdFAIL: 软件定时器停止失败,命令发送失败。*/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python大数据考题

Python大数据考题: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要…

CDA一级备考思维导图

CDA一级备考思维导图 第一章 数据分析概述与职业操守1、数据分析概念、方法论、角色2、数据分析师职业道德与行为准则3、大数据立法、安全、隐私 CDA一级复习备考资料共计七个章节,如需资料,请留言,概览如下图: 第一章 数据分析…

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别?Spring AOP中的动态代理如何理解 Spring 中的代理?解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知:什么是切面 Aspe…

【数据结构】堆(C语言)

今天我们来学习堆,它也是二叉树的一种(我滴神树!) 目录 堆的介绍:堆的代码实现:堆的结构体创建:堆的初始化:堆的销毁:堆的push:堆的pop:判空 &am…

OpenCV简介及安装

前言 因为最近想做图像处理、人脸检测/识别之类的相关开发,所以就开始补OpenCV的相关知识,便开个专栏用于记录学习历程和在学习过程中遇到的一些值得注意的重点和坑。 学习过程基本上也是面向官方文档和Google。 简介 OpenCV(开源的计算机视觉库)是基于…

十大排序之归并排序(详解)

文章目录 🐒个人主页🏅算法思维框架📖前言: 🎀归并排序 时间复杂度O(n*logn)🎇1. 算法步骤思想🎇2、动画演示🎇3.代码实现 🐒个人主页 🏅算法思维框架 &#…

渗透测试【一】:渗透测试常见问题

渗透测试【一】:渗透测试常见问题 1、问题清单2、问题现象及解决办法2.1、点击劫持2.2、用户枚举2.3、Springboot未授权访问2.4、Swagger未授权访问2.5、Host头注入2.6、任意文件上传2.7、敏感路径泄露2.8、跨域资源共享2.9、Spring Cloud Gateway RCE2.10、Content…

vsVode C++开发远程虚拟机工程配置

在使用VS Code进行C/C的开发过程中,有三个至关重要的配置文件,分别是 tasks.json, launch.json 和 c_cpp_properties.json 1. tasks.json tasks.json 是在 vscode 中辅助程序编译的模块,可以代你执行类似于在命令行输入 “gcc hello.c -o h…

文件搜索工具HoudahSpot mac中文版特点

HoudahSpot mac是一款文件搜索工具,它可以帮助用户快速准确地找到文件和文件夹,支持高级搜索和过滤,同时提供了多种视图和操作选项,方便用户进行文件管理和整理。 HoudahSpot mac软件特点 高级搜索和过滤功能:软件支持…

大数据项目--学习笔记

新零售项目介绍 1,行业背景介绍 一,百货商店 百货商店是世界商业史上第一个实行新销售方法的现代大量销售组织。其新型销售方法有: 1.顾客可以毫无顾忌地、自由自在地进出商店; 2.商品销售实行“明码标价…

antv/g6的学习总结

新建一个简单实例 1、使用命令行在项目目录下执行以下命令 cnpm install --save antv/g6 2、创建容器 <div id"mountNode"></div> 3、在需要用的 G6 的 JS 文件中导入 import G6 from antv/g6; 4、 数据准备 引入 G6 的数据源为 JSON 格式的对象。…

Linux shell编程学习笔记29:shell自带的 脚本调试 选项

Linux shell脚本的调试方法比较多&#xff0c;上次我们探讨和测试了shell内建命令set所提供的一些调试选项&#xff0c;其实 shell 本身也提供了一些调试选项。我们以bash为例来看看。 1 bash 的命令行帮助信息&#xff08;bash --help&#xff09; purleEndurer csdn ~ $ ba…

YOLOv5轻量化改进之mobilenetv3,更换mobilenetv3中的注意力机制。

目录 一、原理 二、代码 三、YOLOv5改进 一、原理 我们提出了基于互补搜索技术和新颖架构设计相结合的下一代mobilenet。MobileNetV3通过硬件网络架构搜索(NAS)和NetAdapt算法的结合来调整到移动电话cpu,然后通过新的架构进步进行改进。本文开始探索自动搜索算法和网络设计如…

Java王者荣耀小游戏

Background类 package LX;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\ASUS\\Desktop\\王者荣耀图片\\Map.jpg&…

【Spring整合MyBatis】Spring整合MyBatis的具体方法

在前面写的博客中&#xff0c;介绍了MyBatis通过配置方式和通过注解方式写的方法&#xff1a; 【Spring集成MyBatis】MyBatis诞生及代码快速入门&#xff08;非注解开发&#xff09;【Spring集成MyBatis】MyBatis的Dao层实现&#xff08;基于配置&#xff0c;非注解开发&#…

前端学习网站推荐

1.菜鸟教程&#xff08;程序员必备&#xff09;菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; 2.npm库 npm | Home 3.uniapp学习官网 uni-app官网 4.vue官网 快速上手 | Vue.js 5.ECharts图表 Apache ECharts 6.ES6学习 ES6 入门教程 7.Three.js学习 Three.js…

17. Python 数据库操作之MySQL和SQLite实例

目录 1. 简介2. 使用PyMySQL2. 使用SQLite 1. 简介 数据库种类繁多&#xff0c;每种数据库的对外接口实现各不相同&#xff0c;为了方便对数据库进行统一的操作&#xff0c;大部分编程语言都提供了标准化的数据库接口&#xff0c;用户不需要了解每种数据的接口实现细节&#x…

Python教程:DataFrame数据中使用resample计算月线平均值

在pandas库中&#xff0c;DataFrame可以使用resample()方法来对时间序列数据进行重采样。重采样是将原始数据按照指定的频率进行重新组织&#xff0c;以便进行更细粒度的分析或转换。下面是一个示例&#xff0c;演示如何使用resample()方法&#xff1a; # Author : 小红牛 # 微…

uiautomator2 无法连接 ATX-Agent

最近需要写个安卓自动项目&#xff0c;本身不想用appium 。主要是appium需要安装的依赖太多&#xff0c;一单换个环境又要配置新的环境。但是ATX-Agent装好之后怎么都连接不是。 报错信息如下&#xff1a; .........省略............ uiautomator2.exceptions.GatewayError: (…

解密 sqli靶场第一关:一步一步学习 SQL 注入技术

目录 一、判断是否存在注入点 二、构造类似?id1 --的语句 三、判断数据表中的列数 四、使用union联合查询 五、使用group_concat()函数 六、爆出数据库中的表名 七、爆出users表中的列名 八、爆出users表中的数据 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很…