event_simple.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * 程序清单:事件例程
  3. *
  4. * 这个程序会创建3个动态线程及初始化一个静态事件对象
  5. * 一个线程等于事件对象上以接收事件;
  6. * 一个线程定时发送事件 (事件3)
  7. * 一个线程定时发送事件 (事件5)
  8. */
  9. #include <rtthread.h>
  10. #include "tc_comm.h"
  11. /* 指向线程控制块的指针 */
  12. static rt_thread_t tid1 = RT_NULL;
  13. static rt_thread_t tid2 = RT_NULL;
  14. static rt_thread_t tid3 = RT_NULL;
  15. /* 事件控制块 */
  16. static struct rt_event event;
  17. /* 线程1入口函数 */
  18. static void thread1_entry(void *param)
  19. {
  20. rt_uint32_t e;
  21. while (1)
  22. {
  23. /* receive first event */
  24. if (rt_event_recv(&event, ((1 << 3) | (1 << 5)),
  25. RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
  26. RT_WAITING_FOREVER, &e) == RT_EOK)
  27. {
  28. rt_kprintf("thread1: AND recv event 0x%x\n", e);
  29. }
  30. rt_kprintf("thread1: delay 1s to prepare second event\n");
  31. rt_thread_delay(10);
  32. /* receive second event */
  33. if (rt_event_recv(&event, ((1 << 3) | (1 << 5)),
  34. RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  35. RT_WAITING_FOREVER, &e) == RT_EOK)
  36. {
  37. rt_kprintf("thread1: OR recv event 0x%x\n", e);
  38. }
  39. rt_thread_delay(5);
  40. }
  41. }
  42. /* 线程2入口函数 */
  43. static void thread2_entry(void *param)
  44. {
  45. while (1)
  46. {
  47. rt_kprintf("thread2: send event1\n");
  48. rt_event_send(&event, (1 << 3));
  49. rt_thread_delay(10);
  50. }
  51. }
  52. /* 线程3入口函数 */
  53. static void thread3_entry(void *param)
  54. {
  55. while (1)
  56. {
  57. rt_kprintf("thread3: send event2\n");
  58. rt_event_send(&event, (1 << 5));
  59. rt_thread_delay(20);
  60. }
  61. }
  62. int event_simple_init()
  63. {
  64. /* 初始化事件对象 */
  65. rt_event_init(&event, "event", RT_IPC_FLAG_FIFO);
  66. /* 创建线程1 */
  67. tid1 = rt_thread_create("t1",
  68. thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */
  69. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  70. if (tid1 != RT_NULL)
  71. rt_thread_startup(tid1);
  72. else
  73. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  74. /* 创建线程2 */
  75. tid2 = rt_thread_create("t2",
  76. thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */
  77. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  78. if (tid2 != RT_NULL)
  79. rt_thread_startup(tid2);
  80. else
  81. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  82. /* 创建线程3 */
  83. tid3 = rt_thread_create("t3",
  84. thread3_entry, RT_NULL, /* 线程入口是thread3_entry, 入口参数是RT_NULL */
  85. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  86. if (tid3 != RT_NULL)
  87. rt_thread_startup(tid3);
  88. else
  89. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  90. return 0;
  91. }
  92. #ifdef RT_USING_TC
  93. static void _tc_cleanup()
  94. {
  95. /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
  96. rt_enter_critical();
  97. /* 删除线程 */
  98. if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE)
  99. rt_thread_delete(tid1);
  100. if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE)
  101. rt_thread_delete(tid2);
  102. if (tid3 != RT_NULL && tid3->stat != RT_THREAD_CLOSE)
  103. rt_thread_delete(tid3);
  104. /* 执行事件对象脱离 */
  105. rt_event_detach(&event);
  106. /* 调度器解锁 */
  107. rt_exit_critical();
  108. /* 设置TestCase状态 */
  109. tc_done(TC_STAT_PASSED);
  110. }
  111. int _tc_event_simple()
  112. {
  113. /* 设置TestCase清理回调函数 */
  114. tc_cleanup(_tc_cleanup);
  115. event_simple_init();
  116. /* 返回TestCase运行的最长时间 */
  117. return 100;
  118. }
  119. /* 输出函数命令到finsh shell中 */
  120. FINSH_FUNCTION_EXPORT(_tc_event_simple, a simple event example);
  121. #else
  122. /* 用户应用入口 */
  123. int rt_application_init()
  124. {
  125. event_simple_init();
  126. return 0;
  127. }
  128. #endif