RT-Thread

系统提供的软件定时器可以为我们提供无限个定时器使用,但定时时间必须是系统节拍的整数倍。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");
}


本当にほしかったのはこういうブログだったんだ

コメント:



(画像の文字列を入力して下さい)

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019/12/02 (月) 12:35:41 (504d)