RTX51 Tiny os_wait的使用
RTX51 Tiny 有三个延时代码
这里讲os_wait2
char os_wait2 ( unsigned char event_sel, /* events to wait for */ unsigned char ticks); /* timer ticks to wait */
使用方法, 系统的systick为1ms
//串口任务
void task_uart(void) _task_ UART_TASK_PRIO { PrintSysInfo();//输出系统信息 UART_RxStart(); while(1) { os_wait2(K_TMO|K_SIG, 200);//要么有别的任务把我就绪,要么等了200个心跳既200ms,才会继续向下运行 if (RX1.Sta) { SendBytes(RX1.Buff, RX1.Cnt); locksn = 3;//给开锁任务发消息 os_set_ready(LOCK_TASK_PRIO);//赶紧处理消息 UART_RxStart(); } if (TX1.Cnt) { SendBytes(TX1.Buff, TX1.Cnt); memset(TX1.Buff, 0, TX1.Cnt); TX1.Cnt = RESET; } SendString("timeout\r\n"); } }
//定时器处理接收超时
void TIM4_Int(void) interrupt 20 { if (RX1.OverTime) { RX1.OverTime--; if (RX1.OverTime==0) { RX1.Sta = SET;//串口接收数据超时,需要处理现在收到的数据 os_set_ready(UART_TASK_PRIO);//设置任务状态就绪 } } }
//锁控任务
void task_lock(void) _task_ LOCK_TASK_PRIO { while (1) { os_wait2(K_SIG,0);//平时就等着 if (locksn)//如果被其他任务唤醒,看看是否有信息需要处理 { Lock_Set(locksn, OPEN); os_wait2(K_TMO, 200); Lock_Set(locksn, CLOSE); locksn = 0;
} } }
效果
1、串口任务没有收到数据的时候会200ms发送一次timeout
2、串口收到数据lock3,将收到的数据返回,并给lock任务发送开锁信息
3、开锁任务处理信息,开200ms后关闭并,告诉串口任务需要发送信息
4、在开锁在执行的那200ms,串口任务继续在运行,输出了两次timeout
5、开锁完成后,串口任务收到了开锁任务的信息,发送rxok