FreeRTOS学习--56讲 软件定时器

软件定时器:

        用户可自定义定时器的周期,当指定时间到达后调用回调函数,用户在回调函数中处理信息

硬件定时器:
        芯片自带的定时器模块,精度高,能触发中断,用户在中断服务函数中处理信息

软件定时器特点:

        a.在调用函数vTaskStartScheduler()开启任务调度器的时候,会创建一个用于管理软件定时器的任务,这个任务就叫做软件定时器服务任务。软件定时器服务任务,主要负责软件定时器超时的逻辑判断、调用超时软件定时器的超时回调函数以及处理软件定时器命令队列。且回调函数中不能有延时阻塞之类的函数vTaskDelay()vTaskDelayUntil()等

        b.软件定时器刚创建的时候属于休眠态,需要激活才能变为运行态,休眠态其回调函数不会被执行

使用软件定时器的条件:

        a.在FreeRTOSConfig.h中把configCSE_TIMERS置1

        b.configTIMER_TASK_PRIORITY设为31,就是把服务任务的优先级设为最高

        c.configTIMER_QUEUE_LENGTH设为5,把命令队列长度设为5,能接收多个命令

动态创建软件定时器        xTimerCreate()
TimerHandle_t xTimerCreate(
                 const char * const                 pcTimerName,
                 const TickType_t                   xTimerPeriodInTicks,
                 const UBaseType_t              uxAutoReload,
                 void * const                           pvTimerID,
                 TimerCallbackFunction_t      pxCallbackFunction);
 参数:
 软件定时器名,定时器超时时间(系统时钟节拍),定时器模式(pdTRUE 周期定时器,pdFALSE 单次定时器),软件定时器ID(用于多个软件定时器公用一个超时回调函数),软件定时器超时回调函数
 返回值:NULL 软件定时器创建失败,其他值 软件定时器创建成功,返回其句柄

开启软件定时器            xTimerStart()
BaseType_t xTimerStart(TimerHandle_t    xTimer,const TickType_t    xTicksToWait)
参数:待开启软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 开启成功,pdFAIL 开启失败

停止软件定时器            xTimerStop()
BaseType_t xTimerStop(TimerHandle_t   xTimer,const TickType_t   xTicksToWait);
参数:待停止软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 停止成功,pdFAIL 停止失败

复位软件定时器            xTimerReset()
BaseType_t xTimerReset(TimerHandle_t xTimer,const TickType_t xTicksToWait);
参数:待复位软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 复位成功,pdFAIL 复位失败

更改软件定时器的定时超时时间            
BaseType_t xTimerChangePeriod(TimerHandle_t xTimer,const TickType_t xNewPeriod,const TickType_t xTicksToWait);
参数:待更改软件定时器的句柄,新的定时超时时间,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 复位成功,pdFAIL 复位失败

删除软件定时器        
BaseType_t xTimerDelete(TimerHandle_t xTimer,const TickType_t xTicksToWait);
参数:待删除软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 删除成功,pdFAIL 删除失败

软件定时器实验

//freertos_demo.c#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS******************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"/************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO      1
#define START_TASK_STACK_SIZE 128
TaskHandle_t  start_task_handler;
void start_task(void * pvParameters);/* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/#define TASK1_PRIO      2
#define TASK1_STACK_SIZE 128
TaskHandle_t  task1_handler;void task1(void* pv);void time1_callback(TimerHandle_t pxTimer);     //申明单次定时器1void time2_callback(TimerHandle_t pxTimer);     //申明周期定时器2
/***************************************************************************************//*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{    xTaskCreate((TaskFunction_t    )    start_task,         //创建开始任务(char*             )    "start_task", (unsigned portSHORT)    START_TASK_STACK_SIZE, (void *            )    NULL, (portBASE_TYPE     )    START_TASK_PRIO, (TaskHandle_t*     )    &start_task_handler );vTaskStartScheduler();
}TimerHandle_t timer1_handle = 0;        //定义单次定时器
TimerHandle_t timer2_handle = 0;        //定义周期定时器
void start_task(void* pvPara)
{taskENTER_CRITICAL();         //进入临界区//创建单次定时器timer1_handle = xTimerCreate( "timer1", 1000,pdFALSE,(void*)1,time1_callback);//定时器名字,超时周期,单次定时器,ID,回调函数//创建周期定时器timer2_handle = xTimerCreate( "timer2", 1000,pdTRUE,(void*)2,time2_callback);//定时器名字,超时周期,周期定时器,ID,回调函数xTaskCreate((TaskFunction_t    )    task1,              //创建任务一(char*             )    "task1", (unsigned portSHORT)    TASK1_STACK_SIZE, (void *            )    NULL, (portBASE_TYPE     )    TASK1_PRIO, (TaskHandle_t*     )    &task1_handler );vTaskDelete(NULL);              //删除start_task任务taskEXIT_CRITICAL();            //退出临界区
}//任务一 按键扫描并控制软件定时器
void task1(void* pv)
{uint8_t key = 0;while(1){key = key_scan(0);if(key == KEY0_PRES){xTimerStart(timer1_handle,portMAX_DELAY);    //开启定时器1xTimerStart(timer2_handle,portMAX_DELAY);    //开启定时器2}else if(key == KEY1_PRES){xTimerStop(timer1_handle,portMAX_DELAY);   //暂停定时器1xTimerStop(timer2_handle,portMAX_DELAY);   //暂停定时器2}vTaskDelay(10);}
}//time1的超时回调函数
void time1_callback(TimerHandle_t pxTimer)
{static uint32_t timer = 0;      //加静态是避免每次进入都初始化一遍printf("time1的允许次数:%d\r\n",++timer);
}//time2的超时回调函数
void time2_callback(TimerHandle_t pxTimer)  //注意里面不能有延时阻塞函数
{static uint32_t timer = 0;      //加静态是避免每次进入都初始化一遍printf("time2的允许次数:%d\r\n",++timer);
}

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

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

相关文章

BIT-666 的 2023 年度总结

<<< 年度总结 >>> <<< 年度数据 >>> ◆ 发博情况 ◆ 学习成就 ◆ 代码提交 ◆ 博文表现 <<< 年度创作 >>> ◆ LLM - LLaMA2 <<< 年度风景 >>> ◆ 春 - 中关村软件园 - 百望山 ◆ 夏 - 乌兰…

Python开发一个电商平台历史价格查询软件

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境介绍: python 3.8 pycharm 专业版 第三方模块使用 requests ——> 发送 HTTP 请求 execjs ——> 用来执行JavaScript代码 pyecharts ——> 生成…

《微信小程序开发从入门到实战》学习六十五

6.4 交互API 6.4.5 页面滚动API 使用wx.pageScrollTo接口可使页面自动滚动到目标位置。该接口介绍Object参&#xff0c;该参支持属性如下所示&#xff1a; scrollTop&#xff1a;必填&#xff0c;滚动到页面的目标位置&#xff0c;单位为px duration&#xff1a;滚动动画的…

视频美颜sdk是什么?美颜sdk贴纸技术详解

如今&#xff0c;贴纸技术作为视频美颜的一个创新分支&#xff0c;为用户提供了更加丰富多彩的互动体验。本文将深入探讨视频美颜SDK中的贴纸技术&#xff0c;揭示其技术原理、应用场景以及未来发展趋势。 一、贴纸技术的背后&#xff1a;图像处理与人脸识别 这一步骤是实现贴…

关于IDEA中Git版本回滚整理

Git分区理解 git的版本回滚本质上就是回滚不同的分区&#xff0c;所以咱们有必要简单了解一下git的分区。git在本地有三大分区&#xff1a;暂存区、工作区、版本库。 暂存区: add后的代码&#xff0c;绿色。 **工作区&#xff1a;**正在编写&#xff0c;还未add的部分&#…

【Vue】事件修饰符详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)

文章目录 &#x1f354;Bean的获取&#x1f384;注入IOC容器对象⭐代码实现&#x1f6f8;根据bean的名称获取&#x1f6f8;根据bean的类型获取&#x1f6f8;根据bean的名称和类型获取 &#x1f384;Bean的作用域⭐代码实现&#x1f388;注意 &#x1f384;第三方Bean⭐代码实现…

设计模式-对象池模式

设计模式专栏 模式介绍模式特点应用场景对象池模式和工厂模式的区别代码示例Java实现对象池模式Python实现对象池模式 对象池模式在spring中的应用 模式介绍 对象池模式是一种创建型设计模式&#xff0c;它将对象预先创建并初始化后放入一个池中&#xff0c;以供其他对象使用。…

vue大屏-列表自动滚动vue-seamless-scroll

vue大屏-列表自动滚动vue-seamless-scroll vue-seamless-scroll的官方文档地址&#xff1a;https://chenxuan0000.github.io/vue-seamless-scroll/zh/guide/ 具体效果可到官方文档那里查看。 1、下载依赖 npm install vue-seamless-scroll --save2、使用例子 <template…

IDEA 2022.2 安装教程

1.下载2020.3版本IDEA 链接&#xff1a;https://pan.baidu.com/s/1IFK8VRjT7vM2VM75ToveGQ?pwd176m 提取码&#xff1a;176m 2.安装 下载完成后&#xff0c;双击exe安装包&#xff0c;出现IDEA安装欢迎首页&#xff1a; 3.将 ja - netfiltet 文件复制到idea安装目录附件 …

云上攻防--云服务对象存储(域名接管)弹性计算(元数据泄露)

云上攻防–云服务&&对象存储(域名接管)&&弹性计算(元数据泄露) 目录标题 云上攻防--云服务&&对象存储(域名接管)&&弹性计算(元数据泄露)对象存储权限配置错误域名接管AK/SK泄漏&#xff1a; 弹性计算元数据泄露加固措施 对象存储 各个厂商对于…

纯CSS实现马里奥效果,回忆一下童年吧

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

init_appium_and_devices 的实现思路分析

一、前置说明 总体目录:《从 0-1 搭建企业级 APP 自动化测试框架》上节回顾:在 使用 fixture 机制重构 appium_helloworld 一节中,预留了一个待实现的 fixture init_appium_and_devices 。本节目标:分析 init_appium_and_devices 的实现思路。@pytest.fixture(scope="…

竞赛保研 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

【每日一题】LeetCode206.反转链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1示例2示例3提示 2. 思路3.代码 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1…

【笔记】Spring的事务是如何回滚的/Spring的事务管理是如何实现的

Spring的事务是如何回滚的/Spring的事务管理是如何实现的 数据库&#xff08;Spring事务&#xff09; 1、建立连接、开启事务&#xff08;准备工作&#xff09; 2、进行sql操作&#xff08;业务逻辑&#xff09; 3、执行成功&#xff0c;则commit&#xff1b; 执行失败&#x…

spellman高压发生器电源维修XRV450PN4500 NY1059

Spellman高压电源X射线发生器维修XRV系列常见维修型号&#xff1a;XRV160N1800, XRV160N3000, XRV160P4000, XRV160P6000/208V 3o, XRV225N3000, XRV225N6000/208V 3o, XRV225P4000, XRV350PN4500, XRV450PN4500。 Spellman所拥有的变频器架构可以使高压电源获得高利用率的效率…

为什么设计制造行业需要数据加密?

设计制造行业是一个涉及多种技术、工艺、材料和产品的广泛领域&#xff0c;它对经济和社会的发展有着重要的影响。然而&#xff0c;随着数字化、智能化和网络化的发展&#xff0c;设计制造行业也面临着越来越多的数据安全风险&#xff0c;如数据泄露、数据篡改、数据窃取等。这…

TSINGSEE青犀智能分析网关V4人体行为检测算法在视频监控中的应用

旭帆科技智能分析网关的算法十分繁多&#xff0c;其中可分为人体事件、车辆事件、环境事件、行为检测、着装检测等等&#xff0c;可覆盖绝大多数场景&#xff0c;如智慧校园、智慧工地、智慧景区等&#xff0c;今天小编就TSINGSEE青犀智能分析网关的行为检测算法和大家进行研讨…

Python 为UnityAndroid端自动化接入Tradplus广告SDK

Python 为UnityAndroid端自动化接入Tradplus广告SDK Tradplus介绍常规接入进入Android开发文档选择渠道配置生成接入代码人工依赖下载官网同版本的 Unity插件 使用自动化工具接入首次 你需要打两个标记来定位运行工具 控制台会列出最新的十个Tradplus版本 任选其一然后拖入项目…