14.FreeRTOS软件定时器

01.初识freeRTOS
02.FreeRTOS的移植
03.FreeRTOS系统配置
04.FreeRTOS任务创建与删除
05.FreeRTOS任务挂起与恢复
06.FreeRTOS中断管理
07.FreeRTOS列表与列表项
08.FreeRTOS任务调度与任务切换
09.FreeRTOS时间片调度与任务相关函数
10.FreeRTOS队列操作
11.FreeRTOS信号量操作
12.FreeRTOS队列集和事件标志组
13.FreeRTOS任务通知
14.FreeRTOS软件定时器
15.FreeRTOS低功耗
16.FreeRTOS内存管理

14. FreeRTOS软件定时器

1. 软件定时器的简介

  • 硬件定时器与软件定时器:

    在这里插入图片描述

  • 软件定时器的优缺点:

    • 优点:
      • 硬件定时器数量有限,而软件定时器理论上只需有足够内存,就可以创建多个;
      • 使用简单、成本低。
    • 缺点:
      • 软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。 对于需要高精度要求的场合,不建议使用软件定时器。
  • FreeRTOS软件定时器的特点:

    • 可裁剪:软件定时器是可裁剪可配置的功能, 如果要使能软件定时器,需将configUSE_TIMERS 配置项配置成 1
    • 单次和周期:软件定时器支持设置成,单次定时器或周期定时器
  • 软件定时器服务任务:

    在这里插入图片描述

  • 软件定时器命令队列:

    在这里插入图片描述

  • 软件定时器的相关配置:

    在这里插入图片描述

    注意: 软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。

    所以,回调函数要尽快实行,不能进入阻塞状态,即不能调用那些会阻塞任务的 API 函数,如:vTaskDelay() ;访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

2. 软件定时器的状态

软件定时器共有两种状态:

  1. 休眠态:软件定时器可以通过其句柄被引用,但因为没有运行,所以其定时超时回调函数不会被执行;
  2. 运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用。

​ 新创建的软件定时器处于休眠状态 ,也就是未运行的!

3. 单次定时器和周期定时器

  • FreeRTOS 提供了两种软件定时器:
  1. 单次定时器:单次定时器一旦定时超时,只会执行一次其软件定时器超时回调函数,不会自动重新开启定时,不过可以被手动重新开启。

  2. 周期定时器:周期定时器一旦启动以后就会在执行完回调函数以后自动的重新启动 ,从而周期地执行其软件定时器回调函数。

    在这里插入图片描述

  • 软件定时器的状态转换图:

    在这里插入图片描述

4. 软件定时器结构体成员

在这里插入图片描述

5. 软件定时器相关API函数

  • 相关API函数

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

    在这里插入图片描述

  • 开启软件定时器API函数

    在这里插入图片描述

  • 停止软件定时器API函数

    在这里插入图片描述

  • 复位软件定时器API函数

    在这里插入图片描述

  • 更改软件定时器超时时间API函数

    在这里插入图片描述

6. 软件定时器实验

  • 创建任务:

    在这里插入图片描述

  • 软件定时器句柄和定义:

    //软件定时器句柄
    TimerHandle_t timer1_hanle = 0;
    TimerHandle_t timer2_hanle = 0;
    
    //软件定时器创建
    timer1_hanle = xTimerCreate("timer1", 1000, pdFALSE, (void *)1, timer1_callback);
    timer2_hanle = xTimerCreate("timer2", 1000, pdTRUE, (void *)2, timer2_callback);
    
  • 任务一:按键扫描并控制软件定时器:

    void task1(void* pvParamter)
    {
    	uint8_t key = 0;
    	
    	while(1)
    	{
    		key = key_scan(0);
    		
    		if(key == KEY0_PRES)
    		{
    			xTimerStart(timer1_hanle, portMAX_DELAY);
    			xTimerStart(timer2_hanle, portMAX_DELAY);
    		}
    		if(key == KEY1_PRES)
    		{
    			xTimerStop(timer1_hanle, portMAX_DELAY);
    			xTimerStop(timer2_hanle, portMAX_DELAY);
    		}
    		
    		vTaskDelay(10);![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/167e1f8ebbd74175b5b91af08fb3407a.png#pic_center)
    
    	}
    }
    
  • 软件定时器回调函数:

    void timer1_callback(TimerHandle_t pxTimer)
    {
    	static uint32_t timer = 0;
    	printf("timer1的运行次数:%d\r\n",++timer);
    }
    
    void timer2_callback(TimerHandle_t pxTimer)
    {
    	static uint32_t timer = 0;
    	printf("timer2的运行次数:%d\r\n",++timer);
    }
    
  • 实验结果:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值