FreeRTOS软件定时器

FreeRTOS的软件定时器提供单次和周期性定时功能,允许在设定时间后执行回调函数。定时器类型包括单次定时器和周期定时器,分别在达到定时周期后执行一次或连续执行回调。软件定时器的配置、创建、开启、停止和复位等功能详细介绍了如何使用这些定时器。示例中展示了创建周期和单次定时器的方法。

1.软件定时器:

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器
调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,
简而言之,当定时器的定时周期到了以后就会执行回调函数。

2.软件定时器功能:

单次定时器:(例如定时1S,当定时时间到了之后执行一次回调函数,然后定时器停止运行。需要手动重新启动。)
周期定时器:(例如定时1S,每当定时时间到了之后执行一次回调函数,然后定时器停止运行。自动重新启动。)
复位软件定时器:提供了一种思路,例如设置当LCD背光打开后,如果5S之内唤醒键没有被按下则自动熄灭。如果5S内任何时刻被按下了,从按下这个时刻其再亮5S。

3.软件定时器配置:

# define configUSE_TIMERS  1          // 设置为1 时候,定时器服务任务会在启动FreeRTOS调度器时候自动创建。
#define configTIMER_TASK_PRIORITY     //设置软件定时器服务任务的任务优先级,可以为 0~( configMAX_PRIORITIES-1)。
#define configTIMER_QUEUE_LENGTH      //此宏用来设置定时器命令队列的队列长度。
#define configTIMER_TASK_STACK_DEPTH  //此宏用来设置定时器服务任务的任务堆栈大小,单位为字,不是字节!,对于 STM32 来说一个字是 4 字节。由于定时器服务任务中会执行定时器的回调函数,因此任务堆栈的大小一定要根据定时器的回调函数来设置。

4.软件定时器函数:

复位软件定时器:

函数名 原型 功能</
### FreeRTOS 软件定时器的使用方法 FreeRTOS软件定时器是一种轻量级的任务替代方案,主要用于实现一次性或周期性的事件触发功能[^1]。它通过操作系统内核管理时间片分配,因此无需依赖特定硬件资源即可运行。 #### 创建和配置软件定时器 创建一个软件定时器需要调用 `xTimerCreate` 函数。该函数允许指定定时器名称、超时时间、自动重载标志以及回调函数等参数。以下是其定义: ```c TimerHandle_t xTimerCreate( const char *pcTimerName, // 定时器的名字(调试用途) TickType_t xTimerPeriodInTicks, // 定时器的时间间隔(单位:ticks) UBaseType_t uxAutoReload, // 是否自动重新加载 (pdTRUE 或 pdFALSE) void *pvTimerID, // 用户自定义数据传递给回调函数 TimerCallbackFunction_t pxCallback// 定时器到期后的回调函数指针 ); ``` - **`uxAutoReload` 参数**决定了定时器是一次性还是周期性工作模式。如果设置为 `pdTRUE`,则每次到期后会自动重启;如果是 `pdFALSE`,那么只会在第一次到期时触发回调。 #### 启动与停止定时器 一旦创建好定时器实例之后,可以利用下面两个 API 来启动或者暂停它们: - 使用 `xTimerStart(TimerHandle_t xTimer, TickType_t xBlockTime)` 开始计时; - 停止正在运行中的某个定时器可调用 `xTimerStop(TimerHandle_t xTimer, TickType_t xBlockTime)` 方法。 另外还有其他一些辅助操作比如改变现有活动对象属性值之类的接口可供选用。 #### 示例代码展示如何运用这些概念构建简单的应用程序逻辑结构如下所示: ```c #include "FreeRTOS.h" #include "task.h" #include "timers.h" /* Callback function prototype */ void vTimerCallback( TimerHandle_t xTimer ); int main(void){ /* Create a software timer with auto-reload enabled and assign callback function */ TimerHandle_t xMyTimer = xTimerCreate("OneShot", // Name of the timer. pdMS_TO_TICKS(500),// Period/Timespan in ticks. pdFALSE, // One-shot mode. NULL, // No ID used. vTimerCallback); // Function to call when expired. if(xMyTimer != NULL){ /* Start the created one shot timer. Block indefinitely until successful.*/ if( xTimerStart(xMyTimer, portMAX_DELAY ) == pdPASS ){ printf("Successfully started my one-time timer.\n"); } } /* Start scheduler after setting up all tasks & timers...*/ vTaskStartScheduler(); } /* Implementation of user-defined callback routine invoked upon expiration event occurrence within context switching mechanism provided by OS kernel itself! */ void vTimerCallback( TimerHandle_t xTimer ){ static uint8_t counter=0; ++counter; printf("%d times called since initialization.",counter); } ``` 此例子展示了怎样建立单发型软体计时装置及其相应的处理流程设计思路[^1].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值