定时器的概念
定时器用于根据系统时启动特定的函数,执行相应的任务。FreeRTOS的定时器可以配置启动一次或者间隔一定时间执行。
当然,定时器的实现是基于RTOS心跳机制与任务列表的。这意味着其API可以任何RTOS托管下的程序段调用(而中断不行),包括定时器关联的的回调函数。
FreeRTOS提供了间隔执行定时器的运行时序:

API Description ※ 定时器不能在中断中使用
**①****创建定时器 **osTimerNew()
定时器的类型分为单次(One-time )和多次执行(periodic),在创建时进行配置;其中多次执行时序见上图;单次唤起一次后自动停止,需要用户手动再次启动。而多次执行则间隔指定时间就会执行一次,直至用户停止。
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);/*
创建一个定时器,并绑定相应的回调函数 @retval 定时器的ID; 创建失败返回NULL
@param void(* osTimerFunc_t)(void *argument) //这是回调函数的格式,例:
-void Timer1_Callback(void *arg); //arg contains various type of variables.
func -回调函数的地址,即函数名
type -定时器类型(单次或间隔型): osTimerOnce -执行单次 osTimerPeriodic -多次执行
*argument -传递给回调函数的参数;传入地址;缺省填 (void*)0即可
*/
②启动定时器 osTimerStart()
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks);/*
启动定时器并指定时间间隔. 指定的回调函数在经过本函数指定的ticks后第一次被调用。
@param:
id -定时器ID
ticks -间隔时间 (单位心跳数)
@retval:
osOK -成功
osErrorISR -在中断中调用而出错
osErrorParameter: parameter timer_id is either NULL or invalid or ticks is incorrect.
osErrorResource: the timer is in an invalid state.
*/
③停止定时器 osTimerStop()
停止定时器的效果从下一次唤醒开始(回调函数停止自己定时器的情况)
osStatus_t osTimerStop (osTimerId_t timer_id);/*
停止指定的定时器
@retval
osOK
osErrorISR
osErrorParameter: parameter timer_id is either NULL or invalid.
osErrorResource: the timer is not running (you can only stop a running timer).
*/
④查询定时器启动状态osTimerIsRunning()
uint32_t osTimerIsRunning (osTimerId_t timer_id);/*
@retval
0 U -未启动、中断中调用、未创建
!0 -已启动
*/
⑤删除定时器 osTimerDelete()
回调函数可以删除调用自己的定时器。
删除后定时器id值变为NULL,可以再调用 osTimerNew() 为其创建新的定时器
osStatus_t osTimerDelete (osTimerId_t timer_id);/*
删除定时器并清理其资源。
@retval:
osOK: the specified timer has been deleted.
osErrorISR: osTimerDelete cannot be called from interrupt service routines.
osErrorParameter: parameter timer_id is either NULL or invalid.
osErrorResource: the timer is in an invalid state.
*/
示例
void Timer_Callback (void *arg); // prototype for timer callback function
uint32_t exec; // argument for the timer call back function
void TimerStop_example (void) {
osTimerId_t id; // timer id
osStatus_t status; // function return status
// Create periodic timer
exec = 1U;
id = osTimerNew(Timer_Callback, osTimerPeriodic, &exec, NULL);
osTimerStart(id, 1000U); // start timer
:
status = osTimerStop(id); // stop timer
if (status != osOK) {
// Timer could not be stopped
}
;
osTimerStart(id, 1000U); // start timer again
;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
定时器
+关注
关注
23文章
3373浏览量
124569 -
RTOS
+关注
关注
25文章
870浏览量
123218 -
FreeRTOS
+关注
关注
14文章
499浏览量
67250 -
串口中断
+关注
关注
0文章
67浏览量
14668
发布评论请先 登录
相关推荐
热点推荐
转:第19章 FreeRTOS定时器组
(Daemon任务)19.3 使用软件定时器组注意事项19.4 定时器组API函数19.5 实验例程说明19.6总结19.1定时器组介绍 FreeRTOS软件
发表于 09-03 13:13
freeRTOS中的软定时器的定时时间,创建定时器后有办法修改吗?
请教大家,freeRTOS中的软定时器的定时时间,创建定时器后有没有办法修改呢?我的想法是 程序里有个循环,循环里改改定时器的时间。但是貌似
发表于 07-19 08:03
基于STM32定时器实现毫秒延时函数
STM32定时器包含基本定时器、通用定时器和高级定时器,其中TIM6和TIM7是STM32当中的基本定时器,作为初学者,先从最基本的学起最容
发表于 10-12 15:54
•2.6w次阅读
STM32基于cubeMX实现定时器点灯
Cortex M3内核当中的定时器,它并不属于芯片厂商的外设,也就是说使用ARM内核的不同厂商,都拥有基本结构相同的系统定时器。主要目的是给RTOS提供时钟节拍做时间基准。基本定时器:TIM6、TIM7。通用
发表于 11-23 18:21
•19次下载
SysTick 定时器
的SysTick定时器来实现延时,可以不占用系统定时器,节约资源。由于SysTick是在CPU核内部实现的,跟MCU外设无关,因此它的代码可以在不同厂家之间移植。本 章 将 使用系统滴
发表于 12-05 14:51
•9次下载
freeRTOS软件定时器的使用
freeRTOS中加入了软件定时器这个功能组件,是一个可选的、不属于freeRTOS内核的功能,由定时器服务(其实就是一个定时器任务)来提供
什么是软件定时器?软件定时器的实现原理
软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的
定时器设计实现
返回ITimer类型的共享指针。其中ITimer类中定义了start和stop方法,用于启动或停止当前定时器。 TimerManager还有一个内部类TimerMessageQueue用于实现定
如何实现一个软件定时器?
在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件
FreeRTOS的定时器设计实现
评论