FreeRTOS(4):软件定时器、中断管理

news2025/1/15 22:57:32

目录

一、延时函数

延时函数分类

vTaskDelay 与 HAL_Delay 的区别

二、软件定时器

什么是定时器?

软件定时器优缺点

软件定时器原理

软件定时器相关配置

单次定时器和周期定时器

1. 创建软件定时器

2. 开启软件定时器

3. 停止软件定时器

4. 复位软件定时器

5. 更改软件定时器定时时间

实操

实验需求

cubeMX配置

代码实现

三、中断管理

中断定义

中断优先级

相关注意

实操

实验需求

cubeMX配置

代码实现


一、延时函数

延时函数分类

        相对延时:vTaskDelay

        绝对延时:vTaskDelayUntil

 

vTaskDelay 与 HAL_Delay 的区别

vTaskDelay 作用是让任务阻塞,任务阻塞后,RTOS系统调用其它处于就绪状态的优先级最高的任务来执行。

HAL_Delay 一直不停的调用获取系统时间的函数,直到指定的时间流逝然后退出,故其占用了全部CPU时间。

二、软件定时器

什么是定时器?

简单可以理解为闹钟,到达指定一段时间后,就会响铃。

STM32 芯片自带硬件定时器,精度较高,达到定时时间后会触发中断,也可以生成 PWM 、输入捕获、输出比较,等等,功能强大,但是由于硬件的限制,个数有限。

软件定时器也可以实现定时功能,达到定时时间后可调用回调函数,可以在回调函数里处理信息。

软件定时器优缺点

优点:

        1. 简单、成本低;

        2. 只要内存足够,可创建多个;

缺点:

        精度较低,容易受中断影响。在大多数情况下够用,但对于精度要求比较高的场合不建议使用。

软件定时器原理

定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务任务来提供的。

在调用函数 vTaskStartScheduler() 开启任务调度器的时候,会创建一个用于管理软件定时器的任务,这个任务就叫做软件定时器服务任务。

        1. 负责软件定时器超时的逻辑判断

        2. 调用超时软件定时器的超时回调函数

        3. 处理软件定时器命令队列

FreeRTOS提供了很多定时器有关的API函数,这些API函数大多都使用FreeRTOS的队列发送命令给定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给FreeRTOS的软件定时器使用的,用户不能直接访问!

软件定时器相关配置

软件定时器有一个定时器服务任务和定时器命令队列,这两个东西肯定是要配置的,相关的配置也是放到文件FreeRTOSConfig.h中的,涉及到的配置如下:

1、configUSE_TIMERS

        如果要使用软件定时器的话宏configUSE_TIMERS一定要设置为1,当设置为1的话定时器服务任务就会在启动FreeRTOS调度器的时候自动创建。

2、configTIMER_TASK_PRIORITY

        设置软件定时器服务任务的任务优先级,可以为0~(configMAX_PRIORITIES-1)。优先级一定要根据实际的应用要求来设置。如果定时器服务任务的优先级设置的高的话,定时器命令队列中的命令和定时器回调函数就会及时的得到处理。

3、configTIMER_QUEUE_LENGTH

        此宏用来设置定时器命令队列的队列长度。

4、configTIMER_TASK_STACK_DEPTH

        此宏用来设置定时器服务任务的任务堆栈大小。

单次定时器和周期定时器

单次定时器: 只超时一次,调用一次回调函数。可手动再开启定时器;

周期定时器: 多次超时,多次调用回调函数。

软件定时器相关 API 函数

函数描述
xTimerCreate()动态方式创建软件定时器
xTimerCreateStatic()静态方式创建软件定时器
xTimerStart()开启软件定时器定时
xTimerStop()停止软件定时器定时
xTimerReset()复位软件定时器定时
xTimerChangePeriod()更改软件定时器的定时超时时间
xTimerStartFromISR()在中断中开启软件定时器定时
xTimerStopFromISR()在中断中停止软件定时器定时
xTimerResetFromISR()在中断中复位软件定时器定时
xTimerChangePeriodFromISR()在中断中更改定时超时时间

1. 创建软件定时器

TimerHandle_t xTimerCreate
                    ( const char * const pcTimerName,
                        const TickType_t xTimerPeriod,
                        const UBaseType_t uxAutoReload,
                        void * const pvTimerID,
                        TimerCallbackFunction_t pxCallbackFunction );

参数:

pcTimerName:软件定时器名称

xTimerPeriodInTicks:定时超时时间,单位:系统时钟节拍。

pdMS_TO_TICKS() 可用于将以毫秒为单位指定的时间转换为以 tick 为单位指定的时间。

uxAutoReload:定时器模式, pdTRUE:周期定时器, pdFALSE:单次定时器

pvTimerID:软件定时器 ID,用于多个软件定时器公用一个超时回调函数

pxCallbackFunction:软件定时器超时回调函数

返回值:

成功:定时器句柄

失败:NULL

2. 开启软件定时器

BaseType_t xTimerStart( TimerHandle_t xTimer,TickType_t xBlockTime );

参数:

        xTimer:待开启的软件定时器的句柄

        xTickToWait:发送命令到软件定时器命令队列的最大等待时间

返回值:

        pdPASS:开启成功

        pdFAIL:开启失败

3. 停止软件定时器

BaseType_t xTimerStop( TimerHandle_t xTimer,TickType_t xBlockTime );

参数与返回值同上。

4. 复位软件定时器

BaseType_t xTimerReset( TimerHandle_t xTimer,TickType_t xBlockTime );

参数与返回值同上。

该功能将使软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新

定时。

5. 更改软件定时器定时时间

BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
                               TickType_t xNewPeriod,
                               TickType_t xBlockTime );

xNewPeriod:新的定时超时时间,单位:系统时钟节拍。

其余参数与返回值同上。

实操

实验需求

创建两个定时器:

定时器1,周期定时器,每1秒打印一次 liangxu shuai

定时器2,单次定时器,启动后 2 秒打印一次 laochen shuai

cubeMX配置

 周期定时器

 单次定时器

 

自动生成两个回调函数

 

代码实现

//两种都可以
    osTimerStart(myTimer01Handle,1000);
    xTimerChangePeriod(myTimer01Handle,pdMS_TO_TICKS(1000),0); 
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
	osTimerStart(myTimer01Handle,1000);
	osTimerStart(myTimer02Handle,2000);
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

/* Callback01 function */
void Callback01(void const * argument)
{
  /* USER CODE BEGIN Callback01 */
	printf("111111111\r\n");
  /* USER CODE END Callback01 */
}

/* Callback02 function */
void Callback02(void const * argument)
{
  /* USER CODE BEGIN Callback02 */
	printf("22222222\r\n");
  /* USER CODE END Callback02 */
}

三、中断管理

中断定义

请参考 51 及 STM32 中断相关课程。

中断优先级

任何中断的优先级都大于任务!

在我们的操作系统,中断同样是具有优先级的,并且我们也可以设置它的优先级,但是他的优先级并不是从 015 ,默认情况下它是从 515 ,0~4 这 5 个中断优先级不是 FreeRTOS 控制的(5是取决于 configMAX_SYSCALL_INTERRUPT_PRIORITY)。

相关注意

1. 在中断中必需使用中断相关的函数;

2. 中断服务函数运行时间越短越好。

实操

实验需求

创建一个队列及一个任务,按下按键 KEY1 触发中断,在中断服务函数里向队列里发送数据,任务则阻塞接收队列数据。 

cubeMX配置

代码实现

 

stm32f1xx_it.c

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "cmsis_os.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern osMessageQId myQueue01Handle;
/* USER CODE END PV */

/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	static uint32_t snd = 1;
	xQueueSendFromISR(myQueue01Handle,&snd,NULL);
}
/* USER CODE END 1 */

 freertos.c

/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
	static uint32_t rev = 0;
  /* Infinite loop */
  for(;;)
  {
		if(xQueueReceive(myQueue01Handle,&rev,portMAX_DELAY) == pdTRUE)
		{
			printf("rev = %d \r\n",rev);
		}
		
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

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

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

相关文章

【剑指 Offer 27】二叉树的镜像

题目: 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 输入输出样例 思考1: 二叉树的镜像,就是交换二叉树的每个节点的左右结点 所…

应用在多媒体手机中的低功率立体声编解码器

多媒体手机一般是指可以录制或播放视频的手机。多媒体的定义是多种媒体的综合,一般是图像、文字、声音等多种结合,所以多媒体手机是可以处理和使用图像文字声音相结合的移动设备。目前流行的多媒体概念,主要是指文字、图形、图像、声音等多种…

【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能(2)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容,今天给大家带来的是有关链表的基本知识和各种接口功能的实现的第二部分。 好了,废话不…

Gitignore忽略文件

默认情况下,Git会监视我们项目中的所有内容,但是有些内容比如mode_modules中的内容,我们不希望他被Git所管理。 我们可以在我们项目目录中添加一个 .gitignore 文件来设置那些需要git忽略的文件。

Burpxss自动化测试工具validator配置和使用教程

一、配置教程 下载Phantomjs: http://phantomjs.org/download.html 下载xss.js https://github.com/nVisium/xssValidator 将xss.js和phantomjs.exe放在一起 利用phantomjs运行xss.js C:\xss>phantomjs.exe xss.js Bapp store里搜索xss validator,然后安装它 安…

基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式

更多功能看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 这里给大家提供一种…

node.js系列-常见问题处理方案(持续更新)

问题1:nodejs 如何使用 atob、btoa 解决方案(base64与uint8array转换),btoa和atob在nodejs中应该怎么写? 浏览器中我们可以这样使用: btoa(123456) MTIzNDU2 atob(MTIzNDU2) 123456node.js中实现方案 con…

国内GitHub加速访问工具-Fetch GitHub Hosts

一、工具介绍 Fetch GitHub Hosts是一款开源跨平台的国内GitHub加速访问工具,主要为解决研究及学习人员访问 Github 过慢或其他问题而提供的 Github Hosts 同步工具。 项目原理:是通过部署此项目本身的服务器来获取 github.com 的 hosts,而…

LeetCode //C - 289. Game of Life

289. Game of Life According to Wikipedia’s article: “The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970.” The board is made up of an m x n grid of cells, where each cell…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报

天气(自然现象) 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象,即某瞬时内大气中各种气象要素(如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

Gogs Git windos服务搭建指南

Gogs Git服务器搭建指南 背景: 近期在Linux 麒麟 v10 系统上开发;为了团队协同编程;选用了Git服务器;之前在windos开始时候使用的visualSVN server; visualSVN server从4.x.x.x开始收费;限制15个开发者用户&#xff…

带头循环双向链表详解

目录 一、什么是带头循环双向链表? 1.特点: 2.优点: 二、实现接口 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口实现 2.1函数创建新节点 2.2打印链表内容 2.3尾插新节点 2.4头插新节点 2.5头删节点 2.6尾删…

Vue3_04_ref 函数和 reactive 函数

ref 函数 声明变量时&#xff0c;赋值的值要写在 ref() 函数中修改变量时&#xff0c;变量名.value xxx在模板中使用时可以省略掉 .value&#xff0c;直接使用变量名即可 <template><h1>一个人的信息</h1><h2>姓名&#xff1a;{{name}}</h2><…

pjsip、pjsua2+bcg729 windows下编译java版本

文章目录 简要说明流程步骤 简要说明 基本参考的这里 https://docs.pjsip.org/en/latest/get-started/windows/build_instructions.html#building-the-projects 我这里主要是为了生成pjsua2.dll 用于在java下调用。 其中 libbcg729.dll 是通过vcpkg来进行安装。 pjsip使用vs2…

【Autoresizing案例03-通过代码设置Autoresizing Objective-C语言】

一、通过代码实现Autoresizing 1.好,那么,接下来,我们就给大家看一下,怎么来通过代码实现Autoresizing, 好,那么,接下来,我们为什么要说这个通过代码,实现Autoresizing, 那么,注意,我们能通过我们的storyboard来操作,就不要通过代码来实现, 以后的趋势,就是苹…

使用Git在GitHub上部署静态页面

在GitHub中&#xff0c;我们可以将自己的静态页面部署到GitHub中&#xff0c;它会给我们提供一个地址使得我们的页面变成一个真正的网站&#xff0c;可以供用户访问。 一、在GitHub下创建仓库 二、将项目部署到GitHub上 1. 初始化Git仓库 2. 提交代码 3. 关联远程仓库 在Gi…

Vulnhub: BlueMoon: 2021靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.174 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.174 80端口目录爆破&#xff0c;发现文件&#xff1a;hidden_text gobuster dir -u http://192.168.111.174 -w /usr/sha…

二重积分1

目录 二重积分 二重积分的性质 ​编辑 中值定理 二重积分的计算 方法1&#xff1a;利用直角坐标计算 方法2&#xff1a;利用极坐标进行计算 适用于极坐标的二重积分的特征 对称性和奇偶性的应用 题目 例题1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#x…

【Spring框架】Spring AOP

目录 什么是AOP&#xff1f;AOP组成Spring AOP 实现步骤Spring AOP实现原理JDK Proxy VS CGLIB 什么是AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理。⽐如…