系统提供的软件定时器可以为我们提供无限个定时器使用,但定时时间必须是系统节拍的整数倍。RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_PER_SECOND 的定义来调整 HARD/SOFT_TIMER区别 †hard_timer中断服务程序不能被打断,soft_timer中断服务程序和线程一样参与任务的调度。 定时器也有两种创建方式:动态方式和静态方式。 大多数时间使用动态方式就可以了,他们的区别和进程类似,代码空间的分配方式不同,这篇文章主要使用动态方式进行实验。 相关函数介绍 †rt_timer_create †通过这个函数可以设置定时器的定时时间,超时函数入口和定时器模式等一些参数。 rt_timer_t rt_timer_create(const char* name, void (*timeout)(void* parameter), void* parameter, rt_tick_t time, rt_uint8_t flag); rt_timer_start †设置完成定时器的参数之后定时器不会立即启动,只有调用rt_timer_start函数之后定时器才开始计时。 rt_err_t rt_timer_start(rt_timer_t timer); rt_timer_stop †启动定时器以后,若想使它停止,可以使用下面的函数接口: rt_err_t rt_timer_stop(rt_timer_t timer); rt_timer_control †除了上述提供的一些编程接口, RT-Thread 也额外提供了定时器控制函数接口,以获取或设置更多定时器的信息。控制定时器函数接口如下: rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void* arg); #define RT_TIMER_CTRL_SET_TIME 0x0 /* 设 置 定 时 器 超 时 时 间 */ #define RT_TIMER_CTRL_GET_TIME 0x1 /* 获 得 定 时 器 超 时 时 间 */ #define RT_TIMER_CTRL_SET_ONESHOT 0x2 /* 设 置 定 时 器 为 单 次 定 时 器 */ #define RT_TIMER_CTRL_SET_PERIODIC 0x3 /* 设 置 定 时 器 为 周 期 型 定 时 器 */ 例子 †#include <rtthread.h> #include "LED.h" //LED_thread #define LED_priority 5 #define LED_timeslices 5 #define LED_SIZE 1024 static rt_thread_t LED_thread = RT_NULL; static void LED_enter(void *parameter); //timer1_thread static rt_timer_t timer1; static void timeout1(void *parameter); //timer2_thread static rt_timer_t timer2; static void timeout2(void *parameter); int main(void) { //创建USART线程 LED_thread=rt_thread_create("LED_thread", LED_enter, RT_NULL, LED_SIZE, LED_priority, LED_timeslices); if(LED_thread != RT_NULL) rt_thread_startup(LED_thread); timer1 = rt_timer_create("timer1",timeout1,RT_NULL,50,RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_SOFT_TIMER); /* 启 动 定 时 器 1 */ if (timer1 != RT_NULL) rt_timer_start(timer1); timer2 = rt_timer_create("timer2",timeout2,RT_NULL,500,RT_TIMER_FLAG_ONE_SHOT); /* 启 动 定 时 器 2 */ if (timer2 != RT_NULL) rt_timer_start(timer2); } static void LED_enter(void *parameter) { while (1) { rt_thread_mdelay(500); LED0=~LED0; } } rt_uint16_t count = 0; static void timeout1(void *parameter) { int arg=25; if(count==4) rt_timer_control(timer1 , RT_TIMER_CTRL_SET_TIME ,&arg); rt_kprintf("thread timer1 count: %d\r\n", count++); } static void timeout2(void *parameter) { rt_timer_stop(timer1); rt_kprintf("timer1 was stopped! \n"); } ウィジェット型CM動画配信サービス manna [マナ] コメント: |