semaphore_sample.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-24 yangjie the first version
  9. */
  10. /*
  11. * 程序清单:信号量例程
  12. *
  13. * 该例程创建了一个动态信号量,初始化两个线程,线程1在count每计数10次时,
  14. * 发送一个信号量,线程2在接收信号量后,对number进行加1操作
  15. */
  16. #include <rtthread.h>
  17. #define THREAD_PRIORITY 25
  18. #define THREAD_TIMESLICE 5
  19. /* 指向信号量的指针 */
  20. static rt_sem_t dynamic_sem = RT_NULL;
  21. ALIGN(RT_ALIGN_SIZE)
  22. static char thread1_stack[1024];
  23. static struct rt_thread thread1;
  24. static void rt_thread1_entry(void *parameter)
  25. {
  26. static rt_uint8_t count = 0;
  27. while(1)
  28. {
  29. if(count <= 100)
  30. {
  31. count++;
  32. }
  33. else
  34. return;
  35. /* count每计数10次,就释放一次信号量 */
  36. if(0 == (count % 10))
  37. {
  38. rt_kprintf("t1 release a dynamic semaphore.\n" );
  39. rt_sem_release(dynamic_sem);
  40. }
  41. }
  42. }
  43. ALIGN(RT_ALIGN_SIZE)
  44. static char thread2_stack[1024];
  45. static struct rt_thread thread2;
  46. static void rt_thread2_entry(void *parameter)
  47. {
  48. static rt_err_t result;
  49. static rt_uint8_t number = 0;
  50. while(1)
  51. {
  52. /* 永久方式等待信号量,获取到信号量,则执行number自加的操作 */
  53. result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);
  54. if (result != RT_EOK)
  55. {
  56. rt_kprintf("t2 take a dynamic semaphore, failed.\n");
  57. rt_sem_delete(dynamic_sem);
  58. return;
  59. }
  60. else
  61. {
  62. number++;
  63. rt_kprintf("t2 take a dynamic semaphore. number = %d\n" ,number);
  64. }
  65. }
  66. }
  67. /* 信号量示例的初始化 */
  68. int semaphore_sample()
  69. {
  70. /* 创建一个动态信号量,初始值是0 */
  71. dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_FIFO);
  72. if (dynamic_sem == RT_NULL)
  73. {
  74. rt_kprintf("create dynamic semaphore failed.\n");
  75. return -1;
  76. }
  77. else
  78. {
  79. rt_kprintf("create done. dynamic semaphore value = 0.\n");
  80. }
  81. rt_thread_init(&thread1,
  82. "thread1",
  83. rt_thread1_entry,
  84. RT_NULL,
  85. &thread1_stack[0],
  86. sizeof(thread1_stack),
  87. THREAD_PRIORITY, THREAD_TIMESLICE);
  88. rt_thread_startup(&thread1);
  89. rt_thread_init(&thread2,
  90. "thread2",
  91. rt_thread2_entry,
  92. RT_NULL,
  93. &thread2_stack[0],
  94. sizeof(thread2_stack),
  95. THREAD_PRIORITY-1, THREAD_TIMESLICE);
  96. rt_thread_startup(&thread2);
  97. return 0;
  98. }
  99. /* 导出到 msh 命令列表中 */
  100. MSH_CMD_EXPORT(semaphore_sample, semaphore sample);