FreeRTOS---------软件定时器

定时器,是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率。类似生活中的闹钟,我们可以设置闹钟每天什么时候响, 还能设置响的次数,是响一次还是每天都响。

 软件定时器是当设定一个定时时间,当达到设定的时间之后就会执行指定的功能函数,而这个功能函数就叫做回调函数。也就是说回调函数的两次执行间隔叫做定时器的定时周期。

回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

警告不能在回调函数中调用任何会阻塞任务的API函数 !比如,定时器回调函数中不能调佣vTaskDelay()、vTaskDelayUnti(),还有一些访问队列或者信号量的非零阻塞时间的API函数。


软件定时器和硬件定时器

总之,软件定时器主要是用于定时触发或者是周期性执行的触发功能,从很多特种描述看,感觉是用软件模拟了一个定时中断ISR。软件定时器由Free RTOS内核实现并控制。 它们不需要硬件支持,也与硬件定时器或硬件计数器无关。

定时器硬件定时器软件定时器之分:

  1. 硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯 片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。
  2. 软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基 础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定 时器也是类似的。 使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中 处理信息;而使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的 函数(也称超时函数/回调函数,为了统一,下文均用回调函数描述),在回调函数中处理信息。

FreeRTOS操作系统提供软件定时器功能,软件定时器的使用相当于扩展了定时器的数 量,允许创建更多的定时业务。

FreeRTOS软件定时器功能上支持:

  •  裁剪:能通过宏关闭软件定时器功能。
  •  软件定时器创建。
  •  软件定时器启动。
  •  软件定时器停止。
  •  软件定时器复位。
  •  软件定时器删除。

FreeRTOS提供的软件定时器支持单次模式和周期模式,单次模式和周期模式的定时时 间到之后都会调用软件定时器的回调函数,用户可以在回调函数中加入要执行的工程代码。


单次模式:当用户创建了定时器并启动了定时器后,定时时间到了,只执行一次回调 函数之后就                      将该定时器进入休眠状态,不再重新执行。要想再次执行,必须重新启动它。

周期模式:这个定时器会按照设置的定时时间循环执行回调函数,直到用户将定时器删除。

                  周期定时器根据设定的时间周期的执行的。它一旦启动以后,每执行一次完一次回调                      函数以后定时器会自动重启,回调函数会周期性的执行。

                  周期定时器相当于单片机硬件定时器中配置为自动重装定时器。

应用场景

在很多应用中,我们需要一些定时器任务,硬件定时器受硬件的限制,数量上不足以 满足用户的实际需求,无法提供更多的定时器,那么可以采用软件定时器来完成,由软件 定时器代替硬件定时器任务。但需要注意的是软件定时器的精度是无法和硬件定时器相比 的,而且在软件定时器的定时过程中是极有可能被其它中断所打断,因为软件定时器的执 行上下文环境是任务。所以,软件定时器更适用于对时间精度要求不高的任务,一些辅助型的任务。

在操作系统中,通常软件定时器以系统节拍周期为计时单位。系统节拍是系统的心跳 节拍,表示系统时钟的频率,就类似人的心跳,1s 能跳动多少下,系统节拍配置为 configTICK_RATE_HZ,该宏在 FreeRTOSConfig.h 中有定义,默认是 1000。那么系统的时 钟节拍周期就为1ms(1s跳动1000下,每一下就为1ms)。

软件定时器的所定时数值必须 是这个节拍周期的整数倍,例如节拍周期是 10ms,那么上层软件定时器定时数值只能是 10ms,20ms,100ms 等,而不能取值为 15ms。由于节拍定义了系统中定时器能够分辨的 精确度,系统可以根据实际系统CPU的处理能力和实时性需求设置合适的数值,系统节拍周期的值越小,精度越高,但是系统开销也将越大,因为这代表在 1秒中系统进入时钟中 断的次数也就越多。

使用条件

 FreeRTOS软件定时器是一个可选的不属于freeRTOS内核的功能,因此要在FreeRTOS中使用软件定时器的话,需要在配置文件freeRTOSConfig.h中添加如下所示的4个宏:

#define configUSE_TIMERS				1		//使能软件定时器
#define configTIMER_TASK_PRIORITY		7		//软件定时器的优先级
#define configTIMER_QUEUE_LENGTH		10		//软件定时器的队列长度
#define configTIMER_TASK_STACK_DEPTH	(configMINIMAL_STACK_SIZE * 5)		//软件定时器的堆栈空间大小(单位是字)


软件定时器函数接口讲解

软件定时器创建函数xTimerCreate()

TimerHandle_t Swtmr1_Handle =NULL;  


Swtmr1_Handle=xTimerCreate((const char*		)"AutoReloadTimer",
                            (TickType_t			)1000,/* 定时器周期 1000(tick) */
                            (UBaseType_t		)pdTRUE,/* 周期模式 */
                            (void*				  )1,/* 为每个计时器分配一个索引的唯一ID */
                            (TimerCallbackFunction_t)Swtmr1_Callback); 



//第三个参数是pdTRUE为周期模式,是pdFALSE为单次模式,周期模式到达周期执行一次任务,单次模式到达周期执行一次任务,再次到达周期不再执行任务。


static void Send_Task(void* parameter)
{	 
 
  while (1)
  { 
		
    if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )
    {  
			xTimerStart(Swtmr1_Handle,0);	//开启周期定时器
     
    } 
		if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON )
    {  
		
      xTimerStop(Swtmr1_Callback,0);
				
    } 
		
    vTaskDelay(20);/* 延时20个tick */
  }
}

//按键控制开启和关闭定时器

                                                              软件定时器使用例程

xTimerCreate()用于创建一个软件定时器,并返回一个句柄。要想使用该函数函数必须 在 头 文件FreeRTOSConfig.h 中把宏 configUSE_TIMERS 和 configSUPPORT_DYNAMIC_ALLOCATION 均 定义为1 (configSUPPORT_DYNAMIC_ALLOCATION 在 FreeRTOS.h 中默认定义为 1),并且需 要把FreeRTOS/source/times.c 这个 C文件添加到工程中。

软件定时器在创建成功后是处于休眠状态的,可以使用 xTimerStart()、xTimerReset()、 xTimerStartFromISR() 、 xTimerResetFromISR() 、 xTimerChangePeriod() 和 xTimerChangePeriodFromISR()这些函数将其状态转换为活跃态。


软件定时器启动函数

xTimerStart()           在任务中启动定时器

xTimerStart()函数就是可以让处于休眠的定时器开始工作。

xTimerStartFromISR()         在中断中启动定时器

当然除在任务启动软件定时器之外,还有在中断中启动软件定时器的函数 xTimerStartFromISR()。xTimerStartFromISR()是函数xTimerStart()的中断版本,用于启动一 个先前由函数xTimerCreate() / xTimerCreateStatic()创建的软件定时器。

软件定时器停止函数

xTimerStop()               在任务中停止定时器

xTimerStop() 用于停止一个已经启动的软件定时器

xTimerStopFromISR()              在中断中停止软件定时器

xTimerStopFromISR()是函数 xTimerStop()的中断版本,用于停止一个正在运行的软件 定时器,让其进入休眠态

软件定时器删除函数xTimerDelete()

xTimerDelete()用于删除一个已经被创建成功的软件定时器,删除之后就无法使用该定 时器,并且定时器相应的资源也会被系统回收释放。要想使函数xTimerStop()必须在头文 件FreeRTOSConfig.h中把宏configUSE_TIMERS定义为1


在任务中复位定时器

在中断中复位定时器

查询定时器是否已经开始运行

BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer )

查询定时器以查看它是活动的还是休眠的。如果出现以下情况,计时器将处于休眠状态:

  1. 已创建但未启动。
  2. 已过期的计时器尚未重新启动。

返回值:
pdFALSE,没有运行。其他值,运行。

以上就是对FreeRTOS软件定时器功能的讲解。

前行途中,祝一路顺风!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值