1. 代码
void rt_thread_usr1_entry(void *parameter)
{
/* set LED2 pin mode to output */
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED2_PIN, PIN_HIGH);
rt_thread_mdelay(2000);
rt_pin_write(LED2_PIN, PIN_LOW);
rt_thread_mdelay(3000);
}
}
int main(void)
{
rt_thread_init(&usr1_thread,
USR1_THREAD_NAME,
rt_thread_usr1_entry,
RT_NULL,
&usr1_thread_stack[0],
sizeof(usr1_thread_stack),
RT_USR1_THREAD_PRIO,
20);
rt_thread_startup(&usr1_thread);
/* set LED1 pin mode to output */
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED1_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_mdelay(600);
}
}
2. list_timer结果
3. 解释
usr1 0x0000012c 0x00000dad activated one shot
0x0000012c: 300个时钟周期,即处于rt_thread_mdelay(3000);
main 0x00000032 0x00000d17 activated one shot
0x00000032: 50个时钟周期,即处于rt_thread_mdelay(500);
4.增加软定时器
//usrtimer.c
#include <rtthread.h>
/* 定时器的控制块 */
static struct rt_timer timer1;
static struct rt_timer timer2;
static int cnt = 0;
/* 定时器 1 超时函数 */
static void timeout1(void* parameter)
{
rt_kprintf("periodic timer is timeout\n");
/* 运行 10 次 */
if (cnt++>= 9)
{
rt_timer_stop(&timer1);
}
}
/* 定时器 2 超时函数 */
static void timeout2(void* parameter)
{
rt_kprintf("one shot timer is timeout\n");
}
int timer_static_sample(void)
{
/* 初始化定时器 */
rt_timer_init(&timer1,
"timer1", /* 定时器名字是 timer1 */
timeout1, /* 超时时回调的处理函数 */
RT_NULL, /* 超时函数的入口参数 */
100, /* 定时长度,以 OS Tick 为单位,即 10 个 OS Tick */
RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */
rt_timer_init(&timer2,
"timer2", /* 定时器名字是 timer2 */
timeout2, /* 超时时回调的处理函数 */
RT_NULL, /* 超时函数的入口参数 */
300, /* 定时长度为 30 个 OS Tick */
RT_TIMER_FLAG_ONE_SHOT); /* 单次定时器 */
/* 启动定时器 */
rt_timer_start(&timer1);
rt_timer_start(&timer2);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(timer_static_sample, timer_static sample);
5. MSH命令开启软件定时器
msh > timer_static_sample
timer_static_sample()会执行,timer1和timer2会开始工作。输入list_timer,发现多了timer1、timer2