FreeRTOS-软件定时器

更新时间:2023-07-15 20:45:48 阅读: 评论:0

FreeRTOS-软件定时器
-软件定时器
⼀般来说,每个MCU都会有定时器,这些都属于硬件定时器,但是有些时候硬件定时器可能会不够⽤,FreeRTOS提供了软件定时器,并且当内存⾜够的时候,软件定时器可以设置很多歌,当然,相⽐于硬件定时器,软件定时器精度和功能上都会稍差些,但是在⼀些对精度等条件要求不⾼的场合中⾜够了。
在使⽤软件定时器时,可以设置⼀段时间,经过⼀段时间后,系统就会⾃动调⽤软件定时器所对应的回调函数,但是要注意的是,因为软件定时器回调函数是在定时器服务任务中执⾏的(当做任务主体的⼀部分),所以在软件定时器回调函数中⼀定不要调⽤任何会阻塞任务的API函数。
软件定时器配置
实际上,软件定时器也是基于FreeRTOS中的队列来完成各项操作的,这个队列叫做定时器命令队列,定时器命令队列是提供给FreeRTOS的软件定时器使⽤的,⽤户不能直接访问。
在使⽤软件定时器前,也需要做⼀些相应的配置,软件定时器的配置主要有四部分。
1. configUSE_TIMERS 如果要使⽤软件定时器的话要设置该宏为1,在启动调度器的时候就会⾃动创建软件定时器任务
2. configTIMER_TASK_PRIORITY 软件定时器优先级,这⾥决定了软件定时器回调函数的优先级
3. configTIMER_QUEUE_LENGTH 软件定时器队列长度,决定了能够创建多少个软件定时器
4. configTIMER_TASK_STACK_DEPTH 软件定时器任务堆栈⼤⼩
此外,软件定时器还可以设置为单次定时器和周期定时器,当设置为单次定时器时,定时器启动后,当定时时间到达后,就会调⽤⼀次回调函数,调⽤完毕后定时器就会停⽌,当需要定时器再次启动时就需要复位定时器,然后定时器再经过定时周期后调⽤回调函数。周期定时器则当开启后就会周期性的调⽤回调函数。
因为定时器回调函数是根据任务上下⽂切换来调⽤的,所以定时器的精度取决于系统的时钟节拍,当系统时钟节拍周期越⼩,则定时器精度越⾼,相应地,系统开销也就越⼤。
相关API
在本章不会重点分析定时器相关API的源码。只是将定时器API函数的使⽤⽅法作⼀个讲述。
xTimerCreate()
函数功能:动态创建定时器
函数声明:TimerHandle_t xTimerCreate( const char * const pcTimerName,const TickType_t xTimerPeriodInTicks,const UBaType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction )
输⼊参数pcTimerName:定时器名
输⼊参数xTimerPeriodInTicks:定时器定时周期
输⼊参数uxAutoReload:是否设置为周期定时器,pdTRUE为周期定时器,pdFALSE为单次定时器
输⼊参数pvTimerID:设置定时器ID,不同ID定时器可能会有相同的定时器名,所以设置不同ID加以区分
输⼊参数pxCallbackFunction:定时器回调函数,该函数需要⽤户⾃定义海耶斯
返回参数TimerHandle_t:定时器句柄
xTimerRet()
函数功能:复位定时器,如果是单次定时器,当调⽤⼀次关闭后,调⽤该函数可以重新打开函数声明:
xTimerRet(xTimer, xTicksToWait )输⼊参数xTimer: 复位定时器句柄输⼊参数xTicksToWait:定时器复位阻塞时间,因为复位定时器时本质是向队列发送消息,所以肯定会涉及到阻塞时间返回参数pdFAIL或pdTRUR,返回pdFAIL是说明定时器复位失败xTimerStart()函数功能:开启定时器函数声明:xTimerStart( xTimer, xTicksToWait )输⼊参数xTimer: 开启定时器句柄输⼊参数xTicksToWait:定时器复位阻塞时间,因为开启定时器时本质是向队列发送消息,所以肯定会涉及到阻塞时间返回参数pdFAIL或pdTRUR,返回pdFAIL是说明定时器开启失败xTimerStop()函数功能:停⽌定时器函数声明: xTimerStop(xTimer, xTicksToWait )输⼊参数xTimer: 停⽌定时器句柄输⼊参数xTicksToWait:定时器停⽌阻塞时间,因为停⽌定时器时本质是向队列发送消息,所以肯定会涉及到阻塞时间返回参数pdFAIL或pdTRUR,返回pdFAIL是说明定时器停⽌失败
同样地,这些函数也有相应的中断级API,功能与上⾯任务级的类似,这⾥就不展开叙述了。下⾯给出⼀个⽤法⽰例。⽤法⽰例定时器相关初始化代码如下
实验⽬的:通过按键控制软件定时器的开启与关闭,创建两个定时器,在回调函数中记录定时器调⽤次数
按键部分代码如下
#define  TIMER1_PERIOD  1000#define  TIMER1_ID      1
TimerHandle_t Timer1_Handler ;
#define  TIMER2_PERIOD  3000
#define  TIMER2_ID      2
TimerHandle_t Timer2_Handler ;
BaType_t err ;
Timer1_Handler = xTimerCreate ((char  *)"Timer1",
(TickType_t )TIMER1_PERIOD ,
(UBaType_t ) pdTRUE ,
(void  *)TIMER1_ID ,
(TimerCallbackFunction_t ) Timer1_CallBack );
if  (Timer1_Handler == NULL )
{
printf ("Timer1 Creat Failed\r\n");
}
el
{
err = xTimerStart (Timer1_Handler ,10);
if  (err != pdTRUE )
{
printf ("Timer1 Start Failed\r\n");
}
}
Timer2_Handler = xTimerCreate ((char  *)"Timer2",
(TickType_t )TIMER2_PERIOD ,
(UBaType_t )pdFALSE ,
(void  *)    TIMER2_ID ,
(TimerCallbackFunction_t ) Timer2_CallBack );
if  (Timer2_Handler == NULL )
{
printf ("Timer2 Creat Failed\r\n");
}
el
{钓鱼作文400字
err = xTimerStart (Timer2_Handler ,10);
if  (err != pdTRUE )
{
printf ("Timer1 Start Failed\r\n");
}
}
u8 keyFlag =0;
void  key_task (void * pvParameters )
{
BaType_t err ;
while (1)
{
if  (Key_Scan (KEY1_GPIO_PORT ,KEY1_GPIO_PIN ) == KEY_ON )微信支付密码
if((keyFlag&0x01)==0x01)
keyFlag &=~(0x01<<0);
el
keyFlag |=(0x01<<0);
if((keyFlag&0x01)==0x01)
{
err =xTimerStart(Timer1_Handler,0);
if(err != pdTRUE )
{
printf("Timer1 Start Failed\r\n");
}
el
{
printf("Timer1 Start!!\r\n");
}
}
el
{
err =xTimerStop(Timer1_Handler,0);
if(err != pdTRUE )
{
printf("Timer1 Stop Failed\r\n");
}
el
{
printf("Timer1 Stop!!\r\n");
}
}
}
if(Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)== KEY_ON) {
if((keyFlag&0x02)==0x02)
babyboss
keyFlag &=~(0x01<<1);
el
keyFlag |=(0x01<<1);
if((keyFlag&0x02)==0x02)
{
xTimerStart(Timer2_Handler,0);
printf("Timer2 Start!!\r\n");
}
el
{张著
xTimerRet(Timer2_Handler,0);
printf("Timer2 Ret!!\r\n");
}
}
泰式火锅vTaskDelay(10);
}
}关于感恩的画
定时器回调函数代码如下
{
static int count1 =0;
count1++;
LED0 =~LED0;
printf("timer1 Call Back %d\r\n",count1);
}
void Timer2_CallBack(TimerHandle_t xTimer)
{
static int count2 =0;
count2++;
LED1 =~LED1;
做辣椒酱
printf("timer2 Call Back %d\r\n",count2);
}

本文发布于:2023-07-15 20:45:48,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1082793.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   软件   队列   回调   任务
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图