thread.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. /**
  2. * @file thread.h
  3. * Furi: Furi Thread API
  4. */
  5. #pragma once
  6. #include "base.h"
  7. #include "common_defines.h"
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. /** FuriThreadState */
  12. typedef enum {
  13. FuriThreadStateStopped,
  14. FuriThreadStateStarting,
  15. FuriThreadStateRunning,
  16. } FuriThreadState;
  17. /** FuriThreadPriority */
  18. typedef enum {
  19. FuriThreadPriorityNone = 0, /**< Uninitialized, choose system default */
  20. FuriThreadPriorityIdle = 1, /**< Idle priority */
  21. FuriThreadPriorityLowest = 14, /**< Lowest */
  22. FuriThreadPriorityLow = 15, /**< Low */
  23. FuriThreadPriorityNormal = 16, /**< Normal */
  24. FuriThreadPriorityHigh = 17, /**< High */
  25. FuriThreadPriorityHighest = 18, /**< Highest */
  26. FuriThreadPriorityIsr = 32, /**< Deffered Isr (highest possible) */
  27. } FuriThreadPriority;
  28. /** FuriThread anonymous structure */
  29. typedef struct FuriThread FuriThread;
  30. /** FuriThreadId proxy type to OS low level functions */
  31. typedef void* FuriThreadId;
  32. /** FuriThreadCallback Your callback to run in new thread
  33. * @warning never use osThreadExit in FuriThread
  34. */
  35. typedef int32_t (*FuriThreadCallback)(void* context);
  36. /** Write to stdout callback
  37. * @param data pointer to data
  38. * @param size data size @warning your handler must consume everything
  39. */
  40. typedef void (*FuriThreadStdoutWriteCallback)(const char* data, size_t size);
  41. /** FuriThread state change callback called upon thread state change
  42. * @param state new thread state
  43. * @param context callback context
  44. */
  45. typedef void (*FuriThreadStateCallback)(FuriThreadState state, void* context);
  46. /** Allocate FuriThread
  47. *
  48. * @return FuriThread instance
  49. */
  50. FuriThread* furi_thread_alloc();
  51. /** Allocate FuriThread, shortcut version
  52. *
  53. * @param name
  54. * @param stack_size
  55. * @param callback
  56. * @param context
  57. * @return FuriThread*
  58. */
  59. FuriThread* furi_thread_alloc_ex(
  60. const char* name,
  61. uint32_t stack_size,
  62. FuriThreadCallback callback,
  63. void* context);
  64. /** Release FuriThread
  65. *
  66. * @param thread FuriThread instance
  67. */
  68. void furi_thread_free(FuriThread* thread);
  69. /** Set FuriThread name
  70. *
  71. * @param thread FuriThread instance
  72. * @param name string
  73. */
  74. void furi_thread_set_name(FuriThread* thread, const char* name);
  75. /**
  76. * @brief Set FuriThread appid
  77. * Technically, it is like a "process id", but it is not a system-wide unique identifier.
  78. * All threads spawned by the same app will have the same appid.
  79. *
  80. * @param thread
  81. * @param appid
  82. */
  83. void furi_thread_set_appid(FuriThread* thread, const char* appid);
  84. /** Mark thread as service
  85. * The service cannot be stopped or removed, and cannot exit from the thread body
  86. *
  87. * @param thread
  88. */
  89. void furi_thread_mark_as_service(FuriThread* thread);
  90. /** Set FuriThread stack size
  91. *
  92. * @param thread FuriThread instance
  93. * @param stack_size stack size in bytes
  94. */
  95. void furi_thread_set_stack_size(FuriThread* thread, size_t stack_size);
  96. /** Set FuriThread callback
  97. *
  98. * @param thread FuriThread instance
  99. * @param callback FuriThreadCallback, called upon thread run
  100. */
  101. void furi_thread_set_callback(FuriThread* thread, FuriThreadCallback callback);
  102. /** Set FuriThread context
  103. *
  104. * @param thread FuriThread instance
  105. * @param context pointer to context for thread callback
  106. */
  107. void furi_thread_set_context(FuriThread* thread, void* context);
  108. /** Set FuriThread priority
  109. *
  110. * @param thread FuriThread instance
  111. * @param priority FuriThreadPriority value
  112. */
  113. void furi_thread_set_priority(FuriThread* thread, FuriThreadPriority priority);
  114. /** Set current thread priority
  115. *
  116. * @param priority FuriThreadPriority value
  117. */
  118. void furi_thread_set_current_priority(FuriThreadPriority priority);
  119. /** Get current thread priority
  120. *
  121. * @return FuriThreadPriority value
  122. */
  123. FuriThreadPriority furi_thread_get_current_priority();
  124. /** Set FuriThread state change callback
  125. *
  126. * @param thread FuriThread instance
  127. * @param callback state change callback
  128. */
  129. void furi_thread_set_state_callback(FuriThread* thread, FuriThreadStateCallback callback);
  130. /** Set FuriThread state change context
  131. *
  132. * @param thread FuriThread instance
  133. * @param context pointer to context
  134. */
  135. void furi_thread_set_state_context(FuriThread* thread, void* context);
  136. /** Get FuriThread state
  137. *
  138. * @param thread FuriThread instance
  139. *
  140. * @return thread state from FuriThreadState
  141. */
  142. FuriThreadState furi_thread_get_state(FuriThread* thread);
  143. /** Start FuriThread
  144. *
  145. * @param thread FuriThread instance
  146. */
  147. void furi_thread_start(FuriThread* thread);
  148. /** Join FuriThread
  149. *
  150. * @param thread FuriThread instance
  151. *
  152. * @return bool
  153. */
  154. bool furi_thread_join(FuriThread* thread);
  155. /** Get FreeRTOS FuriThreadId for FuriThread instance
  156. *
  157. * @param thread FuriThread instance
  158. *
  159. * @return FuriThreadId or NULL
  160. */
  161. FuriThreadId furi_thread_get_id(FuriThread* thread);
  162. /** Enable heap tracing
  163. *
  164. * @param thread FuriThread instance
  165. */
  166. void furi_thread_enable_heap_trace(FuriThread* thread);
  167. /** Disable heap tracing
  168. *
  169. * @param thread FuriThread instance
  170. */
  171. void furi_thread_disable_heap_trace(FuriThread* thread);
  172. /** Get thread heap size
  173. *
  174. * @param thread FuriThread instance
  175. *
  176. * @return size in bytes
  177. */
  178. size_t furi_thread_get_heap_size(FuriThread* thread);
  179. /** Get thread return code
  180. *
  181. * @param thread FuriThread instance
  182. *
  183. * @return return code
  184. */
  185. int32_t furi_thread_get_return_code(FuriThread* thread);
  186. /** Thread related methods that doesn't involve FuriThread directly */
  187. /** Get FreeRTOS FuriThreadId for current thread
  188. *
  189. * @param thread FuriThread instance
  190. *
  191. * @return FuriThreadId or NULL
  192. */
  193. FuriThreadId furi_thread_get_current_id();
  194. /** Get FuriThread instance for current thread
  195. *
  196. * @return FuriThread*
  197. */
  198. FuriThread* furi_thread_get_current();
  199. /** Return control to scheduler */
  200. void furi_thread_yield();
  201. uint32_t furi_thread_flags_set(FuriThreadId thread_id, uint32_t flags);
  202. uint32_t furi_thread_flags_clear(uint32_t flags);
  203. uint32_t furi_thread_flags_get(void);
  204. uint32_t furi_thread_flags_wait(uint32_t flags, uint32_t options, uint32_t timeout);
  205. /**
  206. * @brief Enumerate threads
  207. *
  208. * @param thread_array array of FuriThreadId, where thread ids will be stored
  209. * @param array_items array size
  210. * @return uint32_t threads count
  211. */
  212. uint32_t furi_thread_enumerate(FuriThreadId* thread_array, uint32_t array_items);
  213. /**
  214. * @brief Get thread name
  215. *
  216. * @param thread_id
  217. * @return const char* name or NULL
  218. */
  219. const char* furi_thread_get_name(FuriThreadId thread_id);
  220. /**
  221. * @brief Get thread appid
  222. *
  223. * @param thread_id
  224. * @return const char* appid
  225. */
  226. const char* furi_thread_get_appid(FuriThreadId thread_id);
  227. /**
  228. * @brief Get thread stack watermark
  229. *
  230. * @param thread_id
  231. * @return uint32_t
  232. */
  233. uint32_t furi_thread_get_stack_space(FuriThreadId thread_id);
  234. /** Get STDOUT callback for thead
  235. *
  236. * @return STDOUT callback
  237. */
  238. FuriThreadStdoutWriteCallback furi_thread_get_stdout_callback();
  239. /** Set STDOUT callback for thread
  240. *
  241. * @param callback callback or NULL to clear
  242. *
  243. * @return true on success, otherwise fail
  244. */
  245. bool furi_thread_set_stdout_callback(FuriThreadStdoutWriteCallback callback);
  246. /** Write data to buffered STDOUT
  247. *
  248. * @param data input data
  249. * @param size input data size
  250. *
  251. * @return size_t written data size
  252. */
  253. size_t furi_thread_stdout_write(const char* data, size_t size);
  254. /** Flush data to STDOUT
  255. *
  256. * @return int32_t error code
  257. */
  258. int32_t furi_thread_stdout_flush();
  259. /** Suspend thread
  260. *
  261. * @param thread_id thread id
  262. */
  263. void furi_thread_suspend(FuriThreadId thread_id);
  264. /** Resume thread
  265. *
  266. * @param thread_id thread id
  267. */
  268. void furi_thread_resume(FuriThreadId thread_id);
  269. /** Get thread suspended state
  270. *
  271. * @param thread_id thread id
  272. * @return true if thread is suspended
  273. */
  274. bool furi_thread_is_suspended(FuriThreadId thread_id);
  275. #ifdef __cplusplus
  276. }
  277. #endif