semaphore_dynamic.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <rtthread.h>
  2. #include "tc_comm.h"
  3. static rt_sem_t sem;
  4. static void thread_entry(void* parameter)
  5. {
  6. rt_err_t result;
  7. rt_tick_t tick;
  8. /* get current tick */
  9. tick = rt_tick_get();
  10. /* take a semaphore for 10 OS Tick */
  11. result = rt_sem_take(sem, 10);
  12. if (result == -RT_ETIMEOUT)
  13. {
  14. if (rt_tick_get() - tick != 10)
  15. {
  16. tc_done(TC_STAT_FAILED);
  17. rt_sem_delete(sem);
  18. return;
  19. }
  20. rt_kprintf("take semaphore timeout");
  21. }
  22. else
  23. {
  24. tc_done(TC_STAT_FAILED);
  25. rt_sem_delete(sem);
  26. return;
  27. }
  28. /* release semaphore one time */
  29. rt_sem_release(sem);
  30. result = rt_sem_take(sem, RT_WAITING_FOREVER);
  31. if (result != RT_EOK)
  32. {
  33. tc_done(TC_STAT_FAILED);
  34. rt_sem_delete(sem);
  35. return;
  36. }
  37. /* testcase passed */
  38. tc_done(TC_STAT_PASSED);
  39. /* delete semaphore */
  40. rt_sem_delete(sem);
  41. }
  42. int semaphore_dynamic_init()
  43. {
  44. rt_thread_t tid;
  45. sem = rt_sem_create("sem", 0, RT_IPC_FLAG_FIFO);
  46. if (sem == RT_NULL)
  47. {
  48. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  49. return 0;
  50. }
  51. tid = rt_thread_create("test",
  52. thread_entry, RT_NULL,
  53. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  54. if (tid != RT_NULL)
  55. rt_thread_startup(tid);
  56. else
  57. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  58. return 0;
  59. }
  60. #ifdef RT_USING_TC
  61. int _tc_semaphore_dynamic()
  62. {
  63. semaphore_dynamic_init();
  64. return 30;
  65. }
  66. FINSH_FUNCTION_EXPORT(_tc_semaphore_dynamic, a dynamic semaphore test);
  67. #else
  68. int rt_application_init()
  69. {
  70. semaphore_dynamic_init();
  71. return 0;
  72. }
  73. #endif