semaphore_sample.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright (c) 2006-2022, 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. #ifdef rt_align
  22. rt_align(RT_ALIGN_SIZE)
  23. #else
  24. ALIGN(RT_ALIGN_SIZE)
  25. #endif
  26. static char thread1_stack[1024];
  27. static struct rt_thread thread1;
  28. static void rt_thread1_entry(void *parameter)
  29. {
  30. static rt_uint8_t count = 0;
  31. while (1)
  32. {
  33. if (count <= 100)
  34. {
  35. count++;
  36. }
  37. else
  38. return;
  39. /* count每计数10次,就释放一次信号量 */
  40. if (0 == (count % 10))
  41. {
  42. rt_kprintf("thread1 release a dynamic semaphore.\n");
  43. rt_sem_release(dynamic_sem);
  44. }
  45. }
  46. }
  47. #ifdef rt_align
  48. rt_align(RT_ALIGN_SIZE)
  49. #else
  50. ALIGN(RT_ALIGN_SIZE)
  51. #endif
  52. static char thread2_stack[1024];
  53. static struct rt_thread thread2;
  54. static void rt_thread2_entry(void *parameter)
  55. {
  56. static rt_err_t result;
  57. static rt_uint8_t number = 0;
  58. while (1)
  59. {
  60. /* 永久方式等待信号量,获取到信号量,则执行number自加的操作 */
  61. result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);
  62. if (result != RT_EOK)
  63. {
  64. rt_kprintf("thread2 take a dynamic semaphore, failed.\n");
  65. rt_sem_delete(dynamic_sem);
  66. return;
  67. }
  68. else
  69. {
  70. number++;
  71. rt_kprintf("thread2 take a dynamic semaphore. number = %d\n", number);
  72. }
  73. }
  74. }
  75. /* 信号量示例的初始化 */
  76. int semaphore_sample()
  77. {
  78. /* 创建一个动态信号量,初始值是0 */
  79. dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_PRIO);
  80. if (dynamic_sem == RT_NULL)
  81. {
  82. rt_kprintf("create dynamic semaphore failed.\n");
  83. return -1;
  84. }
  85. else
  86. {
  87. rt_kprintf("create done. dynamic semaphore value = 0.\n");
  88. }
  89. rt_thread_init(&thread1,
  90. "thread1",
  91. rt_thread1_entry,
  92. RT_NULL,
  93. &thread1_stack[0],
  94. sizeof(thread1_stack),
  95. THREAD_PRIORITY, THREAD_TIMESLICE);
  96. #ifdef RT_USING_SMP
  97. /* 绑定线程到同一个核上,避免启用多核时的输出混乱 */
  98. rt_thread_control(&thread1, RT_THREAD_CTRL_BIND_CPU, (void*)0);
  99. #endif
  100. rt_thread_startup(&thread1);
  101. rt_thread_init(&thread2,
  102. "thread2",
  103. rt_thread2_entry,
  104. RT_NULL,
  105. &thread2_stack[0],
  106. sizeof(thread2_stack),
  107. THREAD_PRIORITY - 1, THREAD_TIMESLICE);
  108. #ifdef RT_USING_SMP
  109. /* 绑定线程到同一个核上,避免启用多核时的输出混乱 */
  110. rt_thread_control(&thread2, RT_THREAD_CTRL_BIND_CPU, (void*)0);
  111. #endif
  112. rt_thread_startup(&thread2);
  113. return 0;
  114. }
  115. /* 导出到 msh 命令列表中 */
  116. MSH_CMD_EXPORT(semaphore_sample, semaphore sample);