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); } }
usr1 0x0000012c 0x00000dad activated one shot
0x0000012c: 300个时钟周期,即处于rt_thread_mdelay(3000);
main 0x00000032 0x00000d17 activated one shot
0x00000032: 50个时钟周期,即处于rt_thread_mdelay(500);
//usrtimer.c
#include/* 定时器的控制块 */ 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);
msh > timer_static_sample
timer_static_sample()会执行,timer1和timer2会开始工作。输入list_timer,发现多了timer1、timer2