semaphore_buffer_worker.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include <rtthread.h>
  2. #include "tc_comm.h"
  3. static rt_sem_t sem;
  4. static rt_thread_t t1, worker;
  5. #define BUFFER_SIZE 256
  6. #define DATA_ITEM_SIZE 32
  7. static rt_uint8_t working_buffer[BUFFER_SIZE];
  8. static rt_uint16_t write_index, read_index;
  9. static void thread1_entry(void* parameter)
  10. {
  11. rt_err_t result;
  12. rt_uint16_t next_index;
  13. rt_uint8_t data[DATA_ITEM_SIZE];
  14. while (1)
  15. {
  16. /* take a semaphore */
  17. result = rt_sem_take(sem, RT_WAITING_FOREVER);
  18. if (result != RT_EOK)
  19. {
  20. tc_done(TC_STAT_FAILED);
  21. return;
  22. }
  23. /* read buffer */
  24. /* release semaphore */
  25. rt_sem_release(sem);
  26. }
  27. }
  28. static void worker_thread_entry(void* parameter)
  29. {
  30. rt_err_t result;
  31. rt_uint16_t next_index;
  32. rt_uint8_t data[DATA_ITEM_SIZE];
  33. while (1)
  34. {
  35. /* take a semaphore */
  36. result = rt_sem_take(sem, RT_WAITING_FOREVER);
  37. if (result != RT_EOK)
  38. {
  39. tc_done(TC_STAT_FAILED);
  40. return;
  41. }
  42. /* write buffer */
  43. /* release semaphore */
  44. rt_sem_release(sem);
  45. }
  46. }
  47. int semaphore_buffer_worker_init()
  48. {
  49. sem = rt_sem_create("sem", 0, RT_IPC_FLAG_FIFO);
  50. if (sem == RT_NULL)
  51. {
  52. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  53. return 0;
  54. }
  55. write_index = read_index = 0;
  56. t1 = rt_thread_create("t1",
  57. thread1_entry, RT_NULL,
  58. THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
  59. if (t1 != RT_NULL)
  60. rt_thread_startup(t1);
  61. else
  62. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  63. worker = rt_thread_create("worker",
  64. worker_thread_entry, RT_NULL,
  65. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  66. if (worker != RT_NULL)
  67. rt_thread_startup(worker);
  68. else
  69. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  70. return 0;
  71. }
  72. #ifdef RT_USING_TC
  73. static void _tc_cleanup()
  74. {
  75. /* lock scheduler */
  76. rt_enter_critical();
  77. /* delete t1, t2 and worker thread */
  78. rt_thread_delete(t1);
  79. rt_thread_delete(worker);
  80. tc_stat(TC_STAT_PASSED);
  81. /* unlock scheduler */
  82. rt_exit_critical();
  83. }
  84. int _tc_semaphore_buffer_worker()
  85. {
  86. /* set tc cleanup */
  87. tc_cleanup(_tc_cleanup);
  88. semaphore_buffer_worker_init();
  89. return 50;
  90. }
  91. FINSH_FUNCTION_EXPORT(_tc_semaphore_buffer_worker, two threads working on a buffer example);
  92. #else
  93. int rt_application_init()
  94. {
  95. semaphore_buffer_worker_init();
  96. return 0;
  97. }
  98. #endif