RT-Thread论坛
直播中

三心四意

8年用户 807经验值
私信 关注

RT-Thread 4.1.1的rt_event_recv无故返回是怎么回事?

rt_event_recv无故返回


首先建立了 static 的事件集 _evt


做了一个工作线程,会依照收到的事件在休止和运行两个状态之间往复。另外有控制线程发出事件。


工作线程在休止状态是这样等待事件:


err = rt_event_recv(_evt,EVT_RUN,
                    RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,
                    RT_WAITING_FOREVER,&flags);
EVT_RUN 由控制线程经函数发出。等到了,一轮作业后,发出回馈事件 EVT_2 给控制线程,进入运行状态。在运行状态是这样等待事件:


err = rt_event_recv(_evt,EVT_3|EVT_4|EVT_STOP,
                    RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,
                    timeout,&flags);
等待同时做其他工作。EVT_3 和 EVT_4 由中断发出但不改变状态。接收到控制线程发出 EVT_STOP 后,一轮工作后会清除 EVT_2 并发出 EVT_6 给控制线程作为回馈:


rt_event_recv(_evt,EVT_2,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,0,RT_NULL);
rt_event_send(_evt,EVT_6);
之后会回到休止状态,用上面的方式等待 EVT_RUN. 但是却发觉 rt_event_recv() 在没有 EVT_RUN 的情况下返回了。


曾经把等待和清除事件分开来做,看清除前的状态,发觉 err 是 RT_EOK,但 _evt.set 却是 0x0。


RT-Thread版本是 4.1.1,编译是用 ENV 1.3.5 的 gcc,有什么情况会出现这种现象?有没有办法绕过去?谢谢。

回帖(1)

夏日余晖

2024-2-19 16:40:44
我这边按照你的流程写了个简单demo,运行4.1.1,没有发现有什么问题。
按照你的说明,我理解的EVT2是对Running的ACK;EVT6是对Stop的ACK。
下方的代码中:

  • worker线程等待EVT_RUN;然后发送EVT2,修改状态为TRUE;然后等待EVT3,EVT4和EVT Stop,其中,等到EVT Stop后发送EVT6。

  • controller线程发出EVT Run,等待EVT2,等待EVT6;

  • int_sim用于模拟你的中断,发出EVT3,EVT4和EVT Stop。

在你的代码中,为什么控制线程等待EVT2需要将timeout设置为0?我的模拟代码中设置为FOREVER。

  • #include

  • #define DBG_TAG "main"
  • #define DBG_LVL DBG_LOG
  • #include

  • #define EVT_RUN  (1<<0)
  • #define EVT_STOP (1<<1)
  • #define EVT_2   (1<<2)
  • #define EVT_3   (1<<3)
  • #define EVT_4   (1<<4)
  • #define EVT_6   (1<<6)

  • void worker_entry(void *arg);
  • void controller_entry(void *arg);
  • void int_sim_entry(void *arg);


  • static struct rt_event evt;
  • int main(void)
  • {
  •     rt_thread_t tid;
  •     rt_event_init(&evt, "event", RT_IPC_FLAG_FIFO);

  •     tid = rt_thread_create("worker", worker_entry, RT_NULL, 2048, 15, 0);
  •     if(tid) {
  •         LOG_D("worker startup");
  •         rt_thread_startup(tid);
  •     }

  •     tid = rt_thread_create("controller", controller_entry, RT_NULL, 2048, 14, 0);
  •     if(tid) {
  •         LOG_D("controller startup");
  •         rt_thread_startup(tid);
  •     }

  •     tid = rt_thread_create("int_sim", int_sim_entry, RT_NULL, 2048, 11, 0);
  •     if(tid) {
  •         LOG_D("demo_int startup");
  •         rt_thread_startup(tid);
  •     }

  •     return RT_EOK;
  • }

  • void worker_entry(void *arg)
  • {
  •     rt_err_t err;
  •     rt_uint32_t flags;
  •     rt_bool_t state_run = RT_FALSE;

  •     while(1) {
  •         err = rt_event_recv(&evt,EVT_RUN,
  •                             RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,
  •                             RT_WAITING_FOREVER,&flags);
  •         LOG_I("State - RUNNING       , flags = %d", flags);
  •         state_run = RT_TRUE;

  •         rt_event_send(&evt, EVT_2);

  •         while(RT_TRUE == state_run) {
  •             err = rt_event_recv(&evt,EVT_3|EVT_4|EVT_STOP,
  •                                 RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,
  •                                 1000,&flags);
  •             if (err == RT_EOK) {
  •                 switch(flags) {
  •                 case EVT_3:
  •                     LOG_D("State - RUNNING EVT_3 , flags = %d",flags);
  •                     break;
  •                 case EVT_4:
  •                     LOG_D("State - RUNNING EVT_4 , flags = %d",flags);
  •                     break;
  •                 case EVT_STOP:
  •                     LOG_I("State - STOP Received , flags = %d",flags);
  •                     rt_event_send(&evt,EVT_6);
  •                     state_run = RT_FALSE;
  •                     break;
  •                 default:
  •                     LOG_D("State - Unknown       , flags = %d", flags);
  •                 }
  •             } else{
  •                 LOG_D("Timeout");
  •             }
  •         }
  •     }
  • }

  • void controller_entry(void *arg)
  • {
  •     rt_uint32_t flags;

  •     while(1)
  •     {
  •         rt_event_send(&evt,EVT_RUN);

  •         rt_event_recv(&evt,EVT_2,
  •                             RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,
  •                             RT_WAITING_FOREVER,&flags);
  •         LOG_I("State - Run Ack       , flags = %d",flags);
  •         rt_event_recv(&evt,EVT_6,
  •                             RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,
  •                             RT_WAITING_FOREVER,&flags);
  •         LOG_I("State - Stop Ack      , flags = %d",flags);
  •     }
  • }

  • void int_sim_entry(void *arg)
  • {
  •     rt_uint32_t count = 0;
  •     while(++count)
  •     {
  •         if(0 == (count %2) )
  •         {
  •             rt_event_send(&evt, EVT_3);
  •         }
  •         else
  •         {
  •             rt_event_send(&evt, EVT_4);
  •         }

  •         if(count == 20)
  •         {
  •             rt_event_send(&evt, EVT_STOP);
  •             count = 0;
  •         }
  •         rt_thread_delay(1000);
  •     }

  • }




举报

更多回帖

发帖
×
20
完善资料,
赚取积分