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

 

posted @ 2023-05-11 01:18  上官梦舞  阅读(261)  评论(0编辑  收藏  举报