platformSystem.c 4.6 KB

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