platformSystem.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. #include "platformSystem.h"
  2. #include "RyanMqttPlatform.h"
  3. /**
  4. * @brief 申请内存
  5. *
  6. * @param size
  7. * @return void*
  8. */
  9. void *platformMemoryMalloc(size_t size)
  10. {
  11. return rt_malloc(size);
  12. }
  13. /**
  14. * @brief 释放内存
  15. *
  16. * @param ptr
  17. */
  18. void platformMemoryFree(void *ptr)
  19. {
  20. rt_free(ptr);
  21. }
  22. /**
  23. * @brief ms延时
  24. *
  25. * @param ms
  26. */
  27. void platformDelay(uint32_t ms)
  28. {
  29. rt_thread_mdelay(ms);
  30. }
  31. uint32_t platformUptimeMs(void)
  32. {
  33. #if (RT_TICK_PER_SECOND == 1000)
  34. return (uint32_t)rt_tick_get();
  35. #else
  36. // 已经不能提供精准的ms了
  37. rt_tick_t tick = rt_tick_get();
  38. return (uint32_t)(((uint64_t)tick * 1000 + RT_TICK_PER_SECOND - 1) / RT_TICK_PER_SECOND);
  39. #endif
  40. }
  41. /**
  42. * @brief 打印字符串函数,可通过串口打印出去
  43. *
  44. * @param str
  45. * @param strLen
  46. */
  47. void platformPrint(char *str, uint16_t strLen)
  48. {
  49. rt_kputs(str);
  50. }
  51. /**
  52. * @brief 初始化并运行线程
  53. *
  54. * @param userData
  55. * @param platformThread
  56. * @param name
  57. * @param entry
  58. * @param param
  59. * @param stackSize
  60. * @param priority
  61. * @return RyanMqttError_e
  62. */
  63. RyanMqttError_e platformThreadInit(void *userData, platformThread_t *platformThread, const char *name,
  64. void (*entry)(void *), void *const param, uint32_t stackSize, uint32_t priority)
  65. {
  66. platformThread->thread = rt_thread_create(name, // 线程name
  67. entry, // 线程入口函数
  68. param, // 线程入口函数参数
  69. stackSize, // 线程栈大小
  70. priority, // 线程优先级
  71. 10); // 线程时间片
  72. if (NULL == platformThread->thread)
  73. {
  74. return RyanMqttNoRescourceError;
  75. }
  76. rt_thread_startup(platformThread->thread);
  77. return RyanMqttSuccessError;
  78. }
  79. /**
  80. * @brief 销毁自身线程
  81. *
  82. * @param userData
  83. * @param platformThread
  84. * @return RyanMqttError_e
  85. */
  86. RyanMqttError_e platformThreadDestroy(void *userData, platformThread_t *platformThread)
  87. {
  88. rt_thread_delete(platformThread->thread);
  89. rt_schedule();
  90. return RyanMqttSuccessError;
  91. }
  92. /**
  93. * @brief 开启线程
  94. *
  95. * @param userData
  96. * @param platformThread
  97. * @return RyanMqttError_e
  98. */
  99. RyanMqttError_e platformThreadStart(void *userData, platformThread_t *platformThread)
  100. {
  101. rt_thread_resume(platformThread->thread);
  102. rt_schedule();
  103. return RyanMqttSuccessError;
  104. }
  105. /**
  106. * @brief 挂起线程
  107. *
  108. * @param userData
  109. * @param platformThread
  110. * @return RyanMqttError_e
  111. */
  112. RyanMqttError_e platformThreadStop(void *userData, platformThread_t *platformThread)
  113. {
  114. rt_thread_suspend(platformThread->thread);
  115. rt_schedule(); // rtthread挂起线程后应立即调用线程上下文切换函数
  116. return RyanMqttSuccessError;
  117. }
  118. /**
  119. * @brief 互斥锁初始化
  120. *
  121. * @param userData
  122. * @param platformMutex
  123. * @return RyanMqttError_e
  124. */
  125. RyanMqttError_e platformMutexInit(void *userData, platformMutex_t *platformMutex)
  126. {
  127. rt_mutex_init(&platformMutex->mutex, "mqttMutex", RT_IPC_FLAG_PRIO);
  128. return RyanMqttSuccessError;
  129. }
  130. /**
  131. * @brief 销毁互斥锁
  132. *
  133. * @param userData
  134. * @param platformMutex
  135. * @return RyanMqttError_e
  136. */
  137. RyanMqttError_e platformMutexDestroy(void *userData, platformMutex_t *platformMutex)
  138. {
  139. rt_mutex_detach(&platformMutex->mutex);
  140. return RyanMqttSuccessError;
  141. }
  142. /**
  143. * @brief 阻塞获取互斥锁
  144. *
  145. * @param userData
  146. * @param platformMutex
  147. * @return RyanMqttError_e
  148. */
  149. RyanMqttError_e platformMutexLock(void *userData, platformMutex_t *platformMutex)
  150. {
  151. rt_mutex_take(&platformMutex->mutex, RT_WAITING_FOREVER);
  152. return RyanMqttSuccessError;
  153. }
  154. /**
  155. * @brief 释放互斥锁
  156. *
  157. * @param userData
  158. * @param platformMutex
  159. * @return RyanMqttError_e
  160. */
  161. RyanMqttError_e platformMutexUnLock(void *userData, platformMutex_t *platformMutex)
  162. {
  163. rt_mutex_release(&platformMutex->mutex);
  164. return RyanMqttSuccessError;
  165. }
  166. /**
  167. * @brief 临界区初始化
  168. *
  169. * @param userData
  170. * @param platformCritical
  171. * @return RyanMqttError_e
  172. */
  173. RyanMqttError_e platformCriticalInit(void *userData, platformCritical_t *platformCritical)
  174. {
  175. return RyanMqttSuccessError;
  176. }
  177. /**
  178. * @brief 销毁临界区
  179. *
  180. * @param userData
  181. * @param platformCritical
  182. * @return RyanMqttError_e
  183. */
  184. RyanMqttError_e platformCriticalDestroy(void *userData, platformCritical_t *platformCritical)
  185. {
  186. return RyanMqttSuccessError;
  187. }
  188. /**
  189. * @brief 进入临界区
  190. *
  191. * @param userData
  192. * @param platformCritical
  193. * @return RyanMqttError_e
  194. */
  195. RyanMqttError_e platformCriticalEnter(void *userData, platformCritical_t *platformCritical)
  196. {
  197. platformCritical->level = rt_hw_interrupt_disable();
  198. return RyanMqttSuccessError;
  199. }
  200. /**
  201. * @brief 退出临界区
  202. *
  203. * @param userData
  204. * @param platformCritical
  205. * @return RyanMqttError_e
  206. */
  207. RyanMqttError_e platformCriticalExit(void *userData, platformCritical_t *platformCritical)
  208. {
  209. rt_hw_interrupt_enable(platformCritical->level);
  210. return RyanMqttSuccessError;
  211. }