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