FreeRTOS教程——定时器(二)

news2024/9/27 17:31:21

Free RTOS定时器

一、概念

一、概论

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

2、编写回调函数的注意事项

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

3、定时器服务任务与队列

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

image-20221009182009010

二、最小工程

TimerHandle_t Timer_Handle1 ;    // 定时器句柄1
void TimerCallback1(TimerHandle_t callback);        // 周期定时器回调函数
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 
	delay_init();	    				//延时函数初始化	  
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
	KEY_Init();
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区	
		// 创建定时器1
    Timer_Handle1 =  xTimerCreate((const char *)"AutoReloadTimer1",
              (TickType_t) 1000,
							(UBaseType_t) pdTRUE,
							(void *) 1,
							(TimerCallbackFunction_t)TimerCallback1 );
    if(Timer_Handle1 == NULL)
    {
        printf("AutoReloadTimer1 Created Failed \r\n");
    }else{
        printf("AutoReloadTimer2 Created Success \r\n");
    }
  	xTimerStart(Timer_Handle1, 0);
		...
}
void TimerCallback1(TimerHandle_t callback){
		printf("LED0\r\n");
		LED0=!LED0;
}

三、常用函数和API

1、 xTimerReset()

复位一个软件定时器,此函数只能用在任务中,不能用于中断服务函数!此函数是一个宏, 真正执行的是函数 xTimerGenericCommand(),函数原型如下:

	BaseType_t xTimerReset( TimerHandle_t xTimer, 
TickType_t xTicksToWait )

参数:

  • xTimer: 要复位的软件定时器的句柄。
  • xTicksToWait: 设置阻塞时间,调用函数 xTimerReset ()开启软件定时器其实就是向定时器命 令队列发送一条 tmrCOMMAND_RESET 命令,既然是向队列发送消息,那 肯定会涉及到入队阻塞时间的设置。

返回值

  • pdPASS: 软件定时器复位成功,其实就是命令发送成功。
  • pdFAIL: 软件定时器复位失败,命令发送失败。

2、xTimerResetFromISR()

此函数是 xTimerReset()的中断版本,此函数用于中断服务函数中!此函数是一个宏,真正 执行的是函数 xTimerGenericCommand(),函数原型如下:

BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,
BaseType_t * pxHigherPriorityTaskWoken );

参数

  • xTimer: 要复位的软件定时器的句柄。

  • pxHigherPriorityTaskWoken:

返回值:pdPASS,

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

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

相关文章

switch分支结构

一. 简介switch结合case,能够判断一个变量或表达式与一系列值中的某个值是否相等,这里的每个值都被称为一个分支。switch语句在执行时,会先进行值的匹配,匹配成功时会进入到对应case语句。再根据是否有 break语句,判断…

手把手教你正确地创建并配置一个SpringBoot项目

文章目录1. 安装Spring Boot Helper插件2. 创建SpringBoot项目3. 配置SpringBoot项目4. 选择修改配置(选做)4.1 修改端口号4.2 其他自定义配置5. SpringBoot热部署本文主要是针对IDEA社区版用户的,如果你是专业版的用户,那么是可以…

RHCE第三天之ssh远程连接服务

文章目录一、连接加密技术简介二、SSH的工作过程三、 SSH远程连接服务配置四、SSH实验SSH(Secure Shell Protocol,安全的壳程序协议: 它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。ssh协议本身提供两个服务器功能&#…

爬虫学习-验证码识别

反爬机制:验证码,识别验证码图片中的数据,用于模拟登陆识别验证码的操作人工肉眼识别(不推荐)第三方自动识别(推荐)python第三方库:tesseract、ddddocr(7条消息) 小白都能轻松掌握,python最稳定的图片识别库…

探索用于NLP的Gensim库

Gensim的名字源自于"Generate Similar," 这个词是指Gensim可以用于生成类似的文本。这个词也可以被解释为"Generative Similarity," 表示Gensim可以用于生成相似的文本。Gensim是一个用于文本处理的库,可以用于计算文本之间的相似度,以及生成类似的文本。…

实验四:ESP8266WIFI通讯实验

本实验开发板基于:GD32F103我们首先需要看一下原理图 根据原理图可以看到,ESP8266是通过PA2 PA3这个串口进行通讯,PA13是控制它的复位,从芯片手册中可以看到PA2PA3是串口1,PA2是串口1的发送,PA3是串口1的接…

时间序列分析之ARIMA预测

预备知识 时间序列分析原理 时间序列分析之auto_arima自动调参 一、定义 ARIMA模型(Autoregressive Integrated Moving Average model),差分整合移动平均自回归模型,又称整合移动平均自回归模型,时间序列预测分析方法之一。 ARIMA(p,d,q){A…

Go语言设计与实现 -- Channel

稍微需要注意一点的用法 类型断言 type dog struct {Name stringColor string }func main() {allChan : make(chan any, 10)allChan <- dog{Name: "lxy", Color: "yellow"}// 如果你这么写代码的话&#xff0c;你虽然拿到了一条狗&#xff0c;但是你…

Map遍历方法及效率

在大学的时候记得学过通过迭代器进行Map的遍历&#xff0c;但是从参加工作后&#xff0c;基本都是通过for循环遍历&#xff0c;没用过迭代器&#xff0c;于是去了解了Map的几种遍历方法并通过运行测试各自的速度。 注意&#xff1a;这里只讲通过遍历同时能过获取key和value的遍…

Imaging组件格式转换,Imaging图像转换

Imaging组件格式转换,Imaging图像转换 Imaging是一个.NET组件&#xff0c;它提供了一种加载、编辑和保存图片的简单方法。图像处理允许文件格式转换和图像转换(调整大小、裁剪或旋转以及翻转)。 使用GemBox.Imageing&#xff0c;您将获得一个快速可靠的组件&#xff0c;它易于使…

聊聊帮助别人这件事--爱摸鱼的美工(10)

聊聊帮助别人这件事 曾经我是一个不懂拒绝的人 有时帮助别人是本性的善良 有时内心也感觉是被迫而已 不快乐为什么还要做&#xff1f; 后来&#xff0c;我减少了无用社交 后来&#xff0c;我脸皮厚了学会了拒绝 才发现&#xff0c;恰如其分的帮助 让自己和别人都舒服 才发现&am…

【微服务】Nacos配置管理

文章目录统一配置管理在nacos中添加配置文件从微服务拉取配置配置热更新方式一方式二配置共享配置共享的优先级Nacos集群搭建集群结构图搭建集群统一配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 当微服务部署的实例越来越多&#xff0c;达到数十、…

慎用BeanUtils,性能真的拉跨

1 背景 之前在专栏中讲过“不推荐使用属性拷贝工具”&#xff0c;推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。 不推荐的主要理由是&#xff1a; 有些属性拷贝工具性能有点差 有些属性拷贝工具有“BUG” 使用属性拷贝工具容易存在一些隐患&#…

xxx.nginx转发+OpenResty(nginx升级版)_web服务器+lua

看上图&#xff0c;点开图发现图片空白不是网卡了&#xff0c;是内容有点多&#xff0c;缩小图片&#xff08;放大指定位置&#xff09;后食用。&#x1f601;内容分为三部分&#xff1a;nginx转发OpenResty(nginx升级版)_web服务器lua测试1.nginx转发1.1.搭建nginx 略&#xf…

【B样条曲线:计算系数】

对这篇文章的翻译&#xff0c;仅学习。 B样条曲线&#xff1a;计算系数 尽管de Boor的算法是计算b样条曲线上对应于给定u的点的标准方法&#xff0c;但我们在许多情况下确实需要这些系数(例如&#xff0c;曲线插值和逼近)。我们将举例说明一种简单的方法。 给定一条由n1个控制…

【PyQt】PyQt的缺陷及意外退出的可能原因

1 背景 最近在软件项目中比较深入的用到了 Qt GraphicsView Framework。PyQt 作为 Qt 的非官方Python绑定库&#xff08;Qt的官方Python绑定库是PySide&#xff09;总是出现很多意外崩溃/Bug&#xff0c;并且很难调试和追踪。 2 问题 软件项目中需要自定义 QGraphicsItem &a…

初识Cocos Creator

1.1 Cocos 不同时期与产品刚接触Cocos家族的时候&#xff0c;会有很多个Cocos的版本与分支&#xff0c;比如Cocos2d, Cocos2d-x, Cocos Creator 1.x, Cocos Creator 2.x, Cocos Cretor3D, Cocos Creator 3.x, CocosDashboard, 等我们先把Cocos 的主要产品脉络梳理一遍。对啦&am…

人体reid数据集

mars数据集 参考&#xff1a;https://blog.csdn.net/qq_34132310/article/details/83869605 整个Mars数据的大小大概有6.3G。 bbox_train文件夹中&#xff0c;有625个子文件夹&#xff08;代表着625个行人id&#xff09;&#xff0c;共包含了8298个小段轨迹&#xff08;track…

联合证券|战略新兴产业火了,高增长低估值股曝光

导读&#xff1a;2022年&#xff0c;A股商场值得记载的前史性大事件不断。这一年&#xff0c;A股商场上市公司数量正式打破5000家&#xff0c;战略新兴产业上市公司数量打破2500家&#xff0c;占比初次打破50%大关。这一年&#xff0c;A股商场顶住杂乱的外部环境因素&#xff0…

Pytorch介绍与基本使用

前言Pytorch是torch的python版本&#xff0c;是由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程&#xff0c;根据我在网上的了解&#xff0c;相比于Tensorflow&#xff0c;Pytorch简介易用。一、为什么选择Pytorch简…