主要知识点

重要知识点:

1:精度不够(误差在ms左右),而硬件的定时器的精度在ns级别

2:理解一个tick所表示的时间(这个时间并不是固定不变的,取决于系统节拍,宏定义为configTICK_RATE_HZ

3:回调函数的要求是快进快出(与中断函数有着类似的规定)

                        4:创建后,别忘记打开定时器,默认新创建的定时器是关闭状态的

任务类型函数和中断类型任务函数区别

我们知道很多函数都有两种类型,一个是任务中使用的类型,一个是中断中使用的类型,两者的区别在于什么?这个就需要看函数源代码了,这里举例软件定时器的打开函数(中断和非中断)

#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken )xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR,
( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )#define xTimerStart( xTimer, xTicksToWait )
xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START,
( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )

区别在于阻塞时间为0,其实中断使用的函数就是不能阻塞,那如果阻塞了怎么办

pxHigherPriorityTaskWoken 表示的意思是这个命令在中断中使用

中断阻塞会发生什么?举例-创建定时器3在定时器3中延时5s,看LED0会正常闪烁吗?

其实肯定不会的,中断里阻塞只能中断打断,任务无法打断,导致某些任务无法正常执行。

因此中断里面的代码是有讲究的

配置定时器的时候,当我们使用的是APB1的时候,你需要知道时钟频率为多少,这个可以调试得知 ,看寄存器、或者keil里面的示波器

配置分频系数的寄存器为RCC_CFGR

软件定时器的单次模式下,执行完一次后,系统会自动删除此定时器并且回收资源

需要注意的问题:

                                1:优先级(需要设定高点,好让它更快响应,优先级的设定是一个很讲究的事情),默认是31,新创建的软件定时器默认优先级为31

                                2:快进快出不允许阻塞

                                3:堆栈大小设定(默认是空闲的2倍,如果检测的时候发现不够,需要加)

                                4:定时器的通信是依赖于队列(因此存在消息队列长度,这个长度表示什么?需要分析源码)

                                5:软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的 API 函数。如:vTaskDelay() ;访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

                                6:下图知,默认创建的优先级为31,队列长度为5,堆栈大小为2倍的空闲任务

软件定时器的优先级是属于任务的优先级,说明软件定时器的过程是会被打断的,会被中断打断

软件定时器的运行机制:有一个主任务管理者我们创建的定时器,创建的定时器会分配内存空间。当定时器一旦创建并且启动,该定时器会被挂在列表中,并且确定唤醒时间,把唤醒时间按照小的在列表前面,只需要知道最小的即可,那样就不需要一个一个查了(先排好顺序)

prvTimerTask管理着我们创建的所有定时器,功能为:负责软件定时器超时的逻辑判断 、调用超时软件定时器的超时回调函数 、处理软件定时器命令队列

前面我们知道,软件定时器有一个参数是ID,用于一个回调函数分配给多个软件定时器的时候区分不同的软件定时器,如何使用呢? --努力了一下,发现不会

软件定时器的成功创建和打开是在任务调度后进行的

如何很好的理解软件定时器中函数的阻塞时间? 

你可以这么理解,你在寝室叫A去开会,但是A去上厕所了,你就需要等,等了一段时间后,你走了,同样的A不知道去开会

因此:类似于你打开的定时器,然后写函数stop定时器,但是这个定时器在规定的时间并没有执行stop,原因就是CPU被其他任务或者中断占了(相当于上厕所),阻塞时间是指由于队列中数据满了,因此stop这个命令如果在阻塞时间内没被放在队列的话,那么此命令就会失败,解决的话可以把队列长度加大,但是加大了,就需要更多时间了

有时候因为函数的阻塞时间设定错误,导致某些命令定时器并没有执行,你需要避免这种问题,如何避免?--遇到再说吧,纸上谈兵,不现实,这个需要经验

软件定时器函数

主要函数

函数

描述

xTimerCreate()

动态方式创建软件定时器

xTimerCreateStatic()

静态方式创建软件定时器

xTimerStart()

开启软件定时器定时

xTimerStartFromISR()

在中断中开启软件定时器定时

xTimerStop()

停止软件定时器定时

xTimerStopFromISR()

在中断中停止软件定时器定时

xTimerReset()

复位软件定时器定时

xTimerResetFromISR()

在中断中复位软件定时器定时

xTimerChangePeriod()

更改软件定时器的定时超时时间

xTimerChangePeriodFromISR()

在中断中更改定时超时时间

xTimerIsTimerActive

BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer );
查询软件定时器是否处于活动或休眠状态。如果出现以下情况,定时器将处于休眠状态:已创建但尚未启动,或这是一个尚未重启的过期的一次性计时器。定时器是在休眠状态下创建的。 xTimerStart()、 xTimerReset()、 xTimerStartFromISR()、 xTimerResetFromISR()、 xTimerChangePeriod() 以及 xTimerChangePeriodFromISR() API 函数都可以用于将定时器转换为活动状态。参数:
xTimer      被查询的定时器。
Returns:
如果定时器处于休眠状态,将返回 pdFALSE。 如果定时器处于活动状态,将返回 pdFALSE 以外的值。
用法示例:/* This function assumes xTimer has alreadybeen created. */void vAFunction( TimerHandle_t xTimer ){/* or more simply and equivalently"if( xTimerIsTimerActive( xTimer ) )" */if( xTimerIsTimerActive( xTimer ) != pdFALSE ){/* xTimer is active, do something. */}else{/* xTimer is not active, do something else. */}}

xTimerDelete

 BaseType_t xTimerDelete( TimerHandle_t xTimer,TickType_t xBlockTime );

xTimerDelete() 可删除以前使用 xTimerCreate() API 函数创建的定时器

xTimerReset

BaseType_t xTimerReset( TimerHandle_t xTimer,TickType_t xBlockTime );

正在重置/启动/重新启动的定时器的句柄

pvTimerGetTimerID

 void *pvTimerGetTimerID( TimerHandle_t xTimer );

返回分配给软件计时器的 ID。

软件定时器框架代码

void Create_SoftTimer(   const char * const pcTimerName,const TickType_t xTimerPeriodInTicks,const UBaseType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction,TimerHandle_t   SoftwareTimer_Handler )
{BaseType_t xReturn ;SoftwareTimer_Handler =  xTimerCreate( pcTimerName,(TickType_t) xTimerPeriodInTicks,(UBaseType_t) uxAutoReload,(void *) pvTimerID,(TimerCallbackFunction_t) pxCallbackFunction );if(SoftwareTimer_Handler != NULL ){xReturn = xTimerStart( SoftwareTimer_Handler, 0 );   //新创建的,剩余未启动}else{
#if ERROR_TESTprintf("%s create is fail\r\n",pcTimerName);
#endif   }}
/*
* @brief       创建软件定时器
*/
void Create_Timer0_Task(void)
{
Create_SoftTimer("TIMER0",(TickType_t) TIMER0_XTICK, (UBaseType_t) pdTRUE, (void *) 1,(TimerCallbackFunction_t) Timer0_CallbackFunction,( TimerHandle_t ) SoftwareTimer0_Handler );}

FreeRTOS-软件定时器篇相关推荐

  1. FreeRTOS 软件定时器使用

    FreeRTOS 的软件定时器工作模式有两种:单次触发 和 自动重载. 1. 主要功能函数介绍 官方API文档:FreeRTOS 软件定时器 API文档 最为常用的函数有: // 创建软件定时器,返回 ...

  2. FreeRTOS软件定时器 | FreeRTOS十三

    目录 说明: 一.定时器简介 1.1.定时器 1.2.软件定时器 1.3.硬件定时器 1.4.FreeRTOS软件定时器 1.5.软件定时器服务任务作用 1.6.软件定时器的命令队列 1.7.软件定时 ...

  3. freeRTOS — 软件定时器的使用

    freeRTOS中加入了软件定时器这个功能组件,是一个可选的.不属于freeRTOS内核的功能,由定时器服务(其实就是一个定时器任务)来提供. 软件定时器是当设定一个定时时间,当达到设定的时间之后就会 ...

  4. FreeRTOS软件定时器 基于STM32

    文章目录 一·.软件定时器的基本概念 二.软件定时器应用场景 三.软件定时器的精度 四.软件定时器的运作机制 五.软件定时器函数接口讲解 1.软件定时器创建函数 xTimerCreate() 2.软件 ...

  5. FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件,是一个可选的.不属于freeRTOS内核的功能,由定时器服务任务(其实就是一个定时器任务)来提供. 软件定时器是当设定一个定时时间,当达到设定的时间之后 ...

  6. FreeRtos软件定时器复习

    一.基础概念 概念解析:定时器分为硬与软定,硬件定时器到达定时时间自动触发中断服务函数,使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的函数(也称超时函数/回调函数,为了统一,下文均 ...

  7. STM32cubeMX配置FreeRTOS软件定时器

    文章目录 前言 1.软件定时器概述 一.软件定时器特性 二.使用cubeMX生成软件定时器 三.代码讲解 总结 前言 本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器. 1 ...

  8. FreeRTOS 软件定时器

    系统节拍配置宏 configTICK_RATE_HZ, 即1S能跳动多少下, 软件定时器的运作机制. FreeRTOS 采用两个定时器列表维护软件定时器, pxCurrentTimerList 与 p ...

  9. freeRtos学习笔记 (6)软件定时器

    freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...

  10. FreeRTOS源码分析与应用开发06:软件定时器

    目录 1. 概述 1.1 软件定时器 & 硬件定时器 1.2 软件定时器精度 1.3 单次模式 & 周期模式 2. 软件定时器组件 2.1 定时器任务 2.2 定时器列表 2.3 定时 ...

最新文章

  1. 网站首页设计你都规划了哪些重点呢?
  2. Linux内核访问外设I O资源的方式
  3. Spark入门 - History Server配置使用
  4. 计算机硬件:关于CPU的12个硬核干货!
  5. GitHub动作简介
  6. 4安全框_压花玻璃与安全玻璃有哪些特点?玻璃隔断的介绍
  7. 吴裕雄--天生自然 PHP开发学习:MySQL 插入数据
  8. 目前效果最好、应用较广且比较成熟的语音识别模型是什么?
  9. Ubuntu虚拟机环境下安装Python3.6
  10. paip.java-asp-php-.net互相调用方法大总结
  11. WinForm中显示韩语,韩文
  12. Linux环境下搭建Java Web测试环境的具体步骤
  13. 战旗助手服务器代码,炉石盒子PC端人工智能战棋助手启用!
  14. 如何用python做软件导出cad_基于Python运用PyComCAD进行Autocad二次开发实例汇集
  15. 怎么删除win10系统的AdobeFlash
  16. 预见2022 | 吴晓波年终秀 附PPT
  17. linux编程 定时器,Linux 定时器编程
  18. 基于Spine动画的AVATAR换装系统优化
  19. oracle 电子书大全
  20. 美赛数据网站和学习资料

热门文章

  1. 高德地图坐标转换为具体地址
  2. [macOS]_[Shell]_[获取App的签名证书有效期]
  3. ubuntu编译ffmpeg并且demo测试
  4. 美国得州大停电是“人祸”,别想让光伏风电背锅!
  5. python语言打小数点_如何在python中打小数点-问答-阿里云开发者社区-阿里云
  6. HTML5-定制input元素
  7. 热爱生活热爱工作才是第一位的
  8. C#编程学习49:将数据写入到excel中
  9. 推荐:大文件查找,快速扫描,图像分析并清理硬盘垃圾文件的绝佳好工具!
  10. 从源码角度分析Android中的Binder机制的前因后果