event_example.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /**
  2. * RT-Thread RuiChing
  3. *
  4. * COPYRIGHT (C) 2024-2025 Shanghai Real-Thread Electronic Technology Co., Ltd.
  5. * All rights reserved.
  6. *
  7. * The license and distribution terms for this file may be
  8. * found in the file LICENSE in this distribution.
  9. */
  10. #include <rtthread.h>
  11. #include <rtdef.h>
  12. #define THREAD_PRIORITY 9
  13. #define THREAD_TIMESLICE 5
  14. #define EVENT_FLAG3 (1 << 3)
  15. #define EVENT_FLAG5 (1 << 5)
  16. static struct rt_event event;
  17. rt_align(RT_ALIGN_SIZE) static char ev_thread1_stack[4096];
  18. static struct rt_thread ev_thread1;
  19. rt_align(RT_ALIGN_SIZE) static char ev_thread2_stack[4096];
  20. static struct rt_thread ev_thread2;
  21. static void thread1_recv_event(void *param)
  22. {
  23. rt_uint32_t e;
  24. if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
  25. RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
  26. &e) == RT_EOK)
  27. {
  28. rt_kprintf("thread1: OR recv event 0x%x\n", e);
  29. }
  30. rt_kprintf("thread1: delay 1s to prepare the second event\n");
  31. rt_thread_mdelay(1000);
  32. if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
  33. RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
  34. &e) == RT_EOK)
  35. {
  36. rt_kprintf("thread1: AND recv event 0x%x\n", e);
  37. }
  38. rt_event_detach(&event);
  39. rt_kprintf("thread1 leave.\n");
  40. }
  41. static void thread2_send_event(void *param)
  42. {
  43. rt_kprintf("thread2: send event3\n");
  44. rt_event_send(&event, EVENT_FLAG3);
  45. rt_thread_mdelay(200);
  46. rt_kprintf("thread2: send event5\n");
  47. rt_event_send(&event, EVENT_FLAG5);
  48. rt_thread_mdelay(200);
  49. rt_kprintf("thread2: send event3\n");
  50. rt_event_send(&event, EVENT_FLAG3);
  51. rt_kprintf("thread2 leave.\n");
  52. }
  53. int event_example(void)
  54. {
  55. rt_err_t result;
  56. result = rt_event_init(&event, "event", RT_IPC_FLAG_PRIO);
  57. if (result != RT_EOK)
  58. {
  59. rt_kprintf("init event failed.\n");
  60. return -1;
  61. }
  62. rt_thread_init(&ev_thread1, "thread1", thread1_recv_event, RT_NULL,
  63. &ev_thread1_stack[0], sizeof(ev_thread1_stack), THREAD_PRIORITY - 1,
  64. THREAD_TIMESLICE);
  65. rt_thread_startup(&ev_thread1);
  66. rt_thread_init(&ev_thread2, "thread2", thread2_send_event, RT_NULL,
  67. &ev_thread2_stack[0], sizeof(ev_thread2_stack), THREAD_PRIORITY,
  68. THREAD_TIMESLICE);
  69. rt_thread_startup(&ev_thread2);
  70. return 0;
  71. }
  72. MSH_CMD_EXPORT(event_example, event_example);