Freertos定时器API介绍

  • 定时器API介绍
    1.定时器回调函数
 typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); 
 void TestCallback(TimerHandle_t xTimer)	
 {
     printf("test timer");
 }

2.定时器创建函数xTimerCreate

#define TICK_MS  125
参数分别为,定时器名称,定时时间,是否重复启用,定时器编号(通常是1)和回调函数
TimerHandle_t   timer_handle = xTimerCreate((const char*		)"timer creare",
                                                        (TickType_t			)(TICK_MS/portTICK_PERIOD_MS)),
                                                        (UBaseType_t		)pdTRUE,
                                                        (void*				)1,
                                                        (TimerCallbackFunction_t)TestCallback);

3.定时器启动xTimerStart

返回值是pdPASS或者pdFAIL
参数为定时器的句柄和阻塞时间(几个tick值)
 xTimerStart(timer_handle ,3);

4.定时器关闭xTimerStop

返回值是pdPASS或者pdFAIL
参数为定时器的句柄和阻塞时间(几个tick值)
 xTimerStop(timer_handle ,3);
### FreeRTOS 定时器的使用方法 #### 头文件引入 为了在项目中使用 FreeRTOS定时器功能,需先包含相应的头文件 `timers.h`。这是实现定时器功能的基础[^1]。 ```c #include "timers.h" ``` #### 配置选项 启用 FreeRTOS 软件定时器的前提是在配置文件 `FreeRTOSConfig.h` 中将宏定义 `configUSE_TIMERS` 设置为 1。此设置确保在初始化任务调度器时自动创建软件定时器的任务 `prvTimerTask()`[^3]。 ```c #define configUSE_TIMERS 1 ``` #### 创建定时器 可以通过两种方式创建定时器:动态分配和静态分配。以下是两者的具体实现: ##### 动态定时器 通过函数 `xTimerCreate()` 可以动态地创建一个定时器对象。该函数返回的是指向 `TimerHandle_t` 类型的对象指针。 ```c TimerHandle_t xTimer = xTimerCreate( "OneShotTimer", /* 名字 */ pdMS_TO_TICKS(500), /* 周期时间 (单位: ticks) */ pdFALSE, /* 是否自动重载 */ (void *)0, /* 计时器 ID */ vTimerCallback /* 回调函数 */ ); ``` 上述代码片段展示了如何创建一个单次触发的定时器,其中回调函数将在指定的时间间隔后被调用。 ##### 静态定时器 如果希望减少堆内存的使用,可以采用静态分配的方式创建定时器。这需要预先声明存储空间并传递给 `xTimerCreateStatic()` 函数。 ```c static StaticTimer_t xTimerBuffer; TimerHandle_t xTimer = xTimerCreateStatic( "StaticTimer", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, vTimerCallback, &xTimerBuffer ); ``` 这里展示了一个周期性的定时器实例,它会在每秒触发一次回调函数。 #### 启动与停止定时器 一旦创建好定时器,就可以利用以下 API 来控制它的运行状态: - **启动定时器** ```c if (xTimerStart(xTimer, portMAX_DELAY) != pdPASS) { // 错误处理逻辑 } ``` - **重新启动定时器** ```c if (xTimerReset(xTimer, portMAX_DELAY) != pdPASS) { // 错误处理逻辑 } ``` - **停止定时器** ```c if (xTimerStop(xTimer, portMAX_DELAY) != pdPASS) { // 错误处理逻辑 } ``` 这些操作均支持阻塞模式(即等待直到成功完成),参数中的 `portMAX_DELAY` 表示最长可能的阻塞时间[^2]。 #### 删除定时器 当不再需要某个定时器时,应显式删除以释放资源。 ```c if (xTimerDelete(xTimer, portMAX_DELAY) != pdPASS) { // 错误处理逻辑 } ``` #### 示例程序 下面给出一段完整的示例代码,演示了如何使用 FreeRTOS 定时器来定期打印消息到串口。 ```c #include "stdio.h" #include "FreeRTOS.h" #include "task.h" #include "timers.h" // 定义回调函数 void vTimerCallback(TimerHandle_t pxTimer) { printf("Timer expired!\n"); } int main(void) { TimerHandle_t xPeriodicTimer; // 初始化硬件和其他外设... // 创建一个周期性定时器 xPeriodicTimer = xTimerCreate( "PeriodicTimer", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, vTimerCallback ); if (xPeriodicTimer == NULL) { printf("Failed to create timer.\n"); } else { if (xTimerStart(xPeriodicTimer, portMAX_DELAY) != pdPASS) { printf("Failed to start timer.\n"); } } // 开始任务调度器 vTaskStartScheduler(); for (;;); // 不应该到达此处 return 0; } ``` #### 调试技巧 调试过程中常见的问题是定时器未按预期工作。此时可以从以下几个方面入手排查: - 确认 `configUSE_TIMERS` 已正确定义; - 检查是否正确设置了超时时间和回调函数; - 查看是否有足够的栈空间分配给定时器服务任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值