rtthread.h 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. /**
  2. * RT-Thread RuiChing
  3. *
  4. * COPYRIGHT (C) 2024-2025 Shanghai Real-Thread Electronic Technology Co., Ltd.
  5. * All rights reserved.
  6. *
  7. * The license and distribution terms for this file may be
  8. * found in the file LICENSE in this distribution.
  9. */
  10. #ifndef __RTTHREAD_H__
  11. #define __RTTHREAD_H__
  12. #include <rtconfig.h>
  13. #include <rtdef.h>
  14. #include <rtservice.h>
  15. #include <rtm.h>
  16. #include <rtatomic.h>
  17. #include <rtklibc.h>
  18. #ifdef RT_USING_FINSH
  19. #include <finsh.h>
  20. #endif /* RT_USING_FINSH */
  21. /*
  22. * kernel object interface
  23. */
  24. #if 0
  25. struct rt_object_information *rt_object_get_information(
  26. enum rt_object_class_type type);
  27. int rt_object_get_length(enum rt_object_class_type type);
  28. int rt_object_get_pointers(enum rt_object_class_type type,
  29. rt_object_t *pointers, int maxlen);
  30. void rt_object_init(struct rt_object *object, enum rt_object_class_type type,
  31. const char *name);
  32. void rt_object_detach(rt_object_t object);
  33. #ifdef RT_USING_HEAP
  34. rt_object_t rt_object_allocate(enum rt_object_class_type type, const char *name);
  35. void rt_object_delete(rt_object_t object);
  36. /* custom object */
  37. rt_object_t rt_custom_object_create(const char *name, void *data,
  38. rt_err_t (*data_destroy)(void *));
  39. rt_err_t rt_custom_object_destroy(rt_object_t obj);
  40. #endif /* RT_USING_HEAP */
  41. rt_bool_t rt_object_is_systemobject(rt_object_t object);
  42. rt_uint8_t rt_object_get_type(rt_object_t object);
  43. rt_err_t rt_object_for_each(rt_uint8_t type, rt_object_iter_t iter, void *data);
  44. rt_object_t rt_object_find(const char *name, rt_uint8_t type);
  45. rt_err_t rt_object_get_name(rt_object_t object, char *name, rt_uint8_t name_size);
  46. #ifdef RT_USING_HOOK
  47. void rt_object_attach_sethook(void (*hook)(struct rt_object *object));
  48. void rt_object_detach_sethook(void (*hook)(struct rt_object *object));
  49. void rt_object_trytake_sethook(void (*hook)(struct rt_object *object));
  50. void rt_object_take_sethook(void (*hook)(struct rt_object *object));
  51. void rt_object_put_sethook(void (*hook)(struct rt_object *object));
  52. #endif /* RT_USING_HOOK */
  53. #endif
  54. /*
  55. * clock & timer interface
  56. */
  57. typedef rt_tick_t (*__kpi_rt_tick_get)(void);
  58. typedef void (*__kpi_rt_tick_set)(rt_tick_t tick);
  59. typedef rt_tick_t (*__kpi_rt_tick_from_millisecond)(rt_int32_t ms);
  60. rt_tick_t rt_tick_get_millisecond(void);
  61. typedef rt_tick_t (*__kpi_rt_tick_get_millisecond_r)(void);
  62. typedef void (*__kpi_rt_timer_init)(rt_timer_t timer, const char *name,
  63. void (*timeout)(void *parameter), void *parameter, rt_tick_t time,
  64. rt_uint8_t flag);
  65. typedef rt_err_t (*__kpi_rt_timer_detach)(rt_timer_t timer);
  66. typedef rt_timer_t (*__kpi_rt_timer_create)(const char *name,
  67. void (*timeout)(void *parameter), void *parameter, rt_tick_t time,
  68. rt_uint8_t flag);
  69. typedef rt_err_t (*__kpi_rt_timer_delete)(rt_timer_t timer);
  70. typedef rt_err_t (*__kpi_rt_timer_start)(rt_timer_t timer);
  71. typedef rt_err_t (*__kpi_rt_timer_stop)(rt_timer_t timer);
  72. typedef rt_err_t (*__kpi_rt_timer_control)(rt_timer_t timer, int cmd, void *arg);
  73. #if 0
  74. void rt_tick_increase(void);
  75. void rt_tick_increase_tick(rt_tick_t tick);
  76. #ifdef RT_USING_HOOK
  77. void rt_tick_sethook(void (*hook)(void));
  78. #endif /* RT_USING_HOOK */
  79. void rt_system_timer_init(void);
  80. void rt_system_timer_thread_init(void);
  81. rt_tick_t rt_timer_next_timeout_tick(void);
  82. void rt_timer_check(void);
  83. #ifdef RT_USING_HOOK
  84. void rt_timer_enter_sethook(void (*hook)(struct rt_timer *timer));
  85. void rt_timer_exit_sethook(void (*hook)(struct rt_timer *timer));
  86. #endif /* RT_USING_HOOK */
  87. #endif
  88. /*
  89. * thread interface
  90. */
  91. typedef rt_err_t (*__kpi_rt_thread_init)(struct rt_thread *thread,
  92. const char *name, void (*entry)(void *parameter), void *parameter,
  93. void *stack_start, rt_uint32_t stack_size, rt_uint8_t priority,
  94. rt_uint32_t tick);
  95. typedef rt_err_t (*__kpi_rt_thread_detach)(rt_thread_t thread);
  96. typedef rt_thread_t (*__kpi_rt_thread_create)(const char *name,
  97. void (*entry)(void *parameter), void *parameter, rt_uint32_t stack_size,
  98. rt_uint8_t priority, rt_uint32_t tick);
  99. typedef rt_err_t (*__kpi_rt_thread_delete)(rt_thread_t thread);
  100. typedef rt_err_t (*__kpi_rt_thread_close)(rt_thread_t thread);
  101. typedef rt_thread_t (*__kpi_rt_thread_self)(void);
  102. typedef rt_thread_t (*__kpi_rt_thread_find)(char *name);
  103. typedef rt_err_t (*__kpi_rt_thread_startup)(rt_thread_t thread);
  104. typedef rt_err_t (*__kpi_rt_thread_yield)(void);
  105. typedef rt_err_t (*__kpi_rt_thread_delay)(rt_tick_t tick);
  106. typedef rt_err_t (*__kpi_rt_thread_delay_until)(rt_tick_t *tick,
  107. rt_tick_t inc_tick);
  108. typedef rt_err_t (*__kpi_rt_thread_mdelay)(rt_int32_t ms);
  109. typedef rt_err_t (*__kpi_rt_thread_control)(rt_thread_t thread, int cmd,
  110. void *arg);
  111. typedef rt_err_t (*__kpi_rt_thread_suspend)(rt_thread_t thread);
  112. typedef rt_err_t (*__kpi_rt_thread_suspend_with_flag)(rt_thread_t thread,
  113. int suspend_flag);
  114. typedef rt_err_t (*__kpi_rt_thread_resume)(rt_thread_t thread);
  115. typedef rt_err_t (*__kpi_rt_thread_get_name)(rt_thread_t thread, char *name,
  116. rt_uint8_t name_size);
  117. #if 0
  118. #ifdef RT_USING_SMART
  119. rt_err_t rt_thread_wakeup(rt_thread_t thread);
  120. void rt_thread_wakeup_set(struct rt_thread *thread, rt_wakeup_func_t func, void* user_data);
  121. #endif /* RT_USING_SMART */
  122. #ifdef RT_USING_SIGNALS
  123. void rt_thread_alloc_sig(rt_thread_t tid);
  124. void rt_thread_free_sig(rt_thread_t tid);
  125. int rt_thread_kill(rt_thread_t tid, int sig);
  126. #endif /* RT_USING_SIGNALS */
  127. #ifdef RT_USING_HOOK
  128. void rt_thread_suspend_sethook(void (*hook)(rt_thread_t thread));
  129. void rt_thread_resume_sethook (void (*hook)(rt_thread_t thread));
  130. /**
  131. * @brief Sets a hook function when a thread is initialized.
  132. *
  133. * @param thread is the target thread that initializing
  134. */
  135. typedef void (*rt_thread_inited_hookproto_t)(rt_thread_t thread);
  136. RT_OBJECT_HOOKLIST_DECLARE(rt_thread_inited_hookproto_t, rt_thread_inited);
  137. #endif /* RT_USING_HOOK */
  138. #endif
  139. /*
  140. * idle thread interface
  141. */
  142. typedef rt_err_t (*__kpi_rt_thread_idle_sethook)(void (*hook)(void));
  143. typedef rt_err_t (*__kpi_rt_thread_idle_delhook)(void (*hook)(void));
  144. typedef rt_thread_t (*__kpi_rt_thread_idle_gethandler)(void);
  145. #if 0
  146. void rt_thread_idle_init(void);
  147. #endif
  148. /*
  149. * schedule service
  150. */
  151. typedef void (*__kpi_rt_schedule)(void);
  152. #if 0
  153. void rt_system_scheduler_init(void);
  154. void rt_system_scheduler_start(void);
  155. void rt_scheduler_do_irq_switch(void *context);
  156. #ifdef RT_USING_OVERFLOW_CHECK
  157. void rt_scheduler_stack_check(struct rt_thread *thread);
  158. #define RT_SCHEDULER_STACK_CHECK(thr) rt_scheduler_stack_check(thr)
  159. #else /* !RT_USING_OVERFLOW_CHECK */
  160. #define RT_SCHEDULER_STACK_CHECK(thr)
  161. #endif /* RT_USING_OVERFLOW_CHECK */
  162. #endif
  163. typedef rt_base_t (* __kpi_rt_enter_critical)(void);
  164. typedef void (*__kpi_rt_exit_critical)(void);
  165. typedef void (*__kpi_rt_exit_critical_safe)(rt_base_t critical_level);
  166. typedef rt_uint16_t (*__kpi_rt_critical_level)(void);
  167. #if 0
  168. #ifdef RT_USING_HOOK
  169. void rt_scheduler_sethook(void (*hook)(rt_thread_t from, rt_thread_t to));
  170. void rt_scheduler_switch_sethook(void (*hook)(struct rt_thread *tid));
  171. #endif /* RT_USING_HOOK */
  172. #ifdef RT_USING_SMP
  173. void rt_secondary_cpu_entry(void);
  174. void rt_scheduler_ipi_handler(int vector, void *param);
  175. #endif /* RT_USING_SMP */
  176. #ifdef RT_USING_SIGNALS
  177. void rt_signal_mask(int signo);
  178. void rt_signal_unmask(int signo);
  179. rt_sighandler_t rt_signal_install(int signo, rt_sighandler_t handler);
  180. int rt_signal_wait(const rt_sigset_t *set, rt_siginfo_t *si, rt_int32_t timeout);
  181. int rt_system_signal_init(void);
  182. #endif /* RT_USING_SIGNALS */
  183. #endif
  184. /*
  185. * memory management interface
  186. */
  187. typedef void *(*__kpi_rt_malloc)(rt_size_t size);
  188. typedef void (*__kpi_rt_free)(void *ptr);
  189. typedef void *(*__kpi_rt_realloc)(void *ptr, rt_size_t newsize);
  190. typedef void *(*__kpi_rt_calloc)(rt_size_t count, rt_size_t size);
  191. typedef void *(*__kpi_rt_malloc_align)(rt_size_t size, rt_size_t align);
  192. typedef void (*__kpi_rt_free_align)(void *ptr);
  193. #if 0
  194. #ifdef RT_USING_MEMPOOL
  195. /*
  196. * memory pool interface
  197. */
  198. rt_err_t rt_mp_init(struct rt_mempool *mp,
  199. const char *name,
  200. void *start,
  201. rt_size_t size,
  202. rt_size_t block_size);
  203. rt_err_t rt_mp_detach(struct rt_mempool *mp);
  204. #ifdef RT_USING_HEAP
  205. rt_mp_t rt_mp_create(const char *name,
  206. rt_size_t block_count,
  207. rt_size_t block_size);
  208. rt_err_t rt_mp_delete(rt_mp_t mp);
  209. #endif /* RT_USING_HEAP */
  210. void *rt_mp_alloc(rt_mp_t mp, rt_int32_t time);
  211. void rt_mp_free(void *block);
  212. #ifdef RT_USING_HOOK
  213. void rt_mp_alloc_sethook(void (*hook)(struct rt_mempool *mp, void *block));
  214. void rt_mp_free_sethook(void (*hook)(struct rt_mempool *mp, void *block));
  215. #endif /* RT_USING_HOOK */
  216. #endif /* RT_USING_MEMPOOL */
  217. #ifdef RT_USING_HEAP
  218. /*
  219. * heap memory interface
  220. */
  221. void rt_system_heap_init(void *begin_addr, void *end_addr);
  222. void rt_system_heap_init_generic(void *begin_addr, void *end_addr);
  223. void rt_memory_info(rt_size_t *total,
  224. rt_size_t *used,
  225. rt_size_t *max_used);
  226. #if defined(RT_USING_SLAB) && defined(RT_USING_SLAB_AS_HEAP)
  227. void *rt_page_alloc(rt_size_t npages);
  228. void rt_page_free(void *addr, rt_size_t npages);
  229. #endif /* defined(RT_USING_SLAB) && defined(RT_USING_SLAB_AS_HEAP) */
  230. /**
  231. * @ingroup Hook
  232. * @{
  233. */
  234. #ifdef RT_USING_HOOK
  235. void rt_malloc_sethook(void (*hook)(void **ptr, rt_size_t size));
  236. void rt_realloc_set_entry_hook(void (*hook)(void **ptr, rt_size_t size));
  237. void rt_realloc_set_exit_hook(void (*hook)(void **ptr, rt_size_t size));
  238. void rt_free_sethook(void (*hook)(void **ptr));
  239. #endif /* RT_USING_HOOK */
  240. /**@}*/
  241. #endif /* RT_USING_HEAP */
  242. #ifdef RT_USING_SMALL_MEM
  243. /**
  244. * small memory object interface
  245. */
  246. rt_smem_t rt_smem_init(const char *name,
  247. void *begin_addr,
  248. rt_size_t size);
  249. rt_err_t rt_smem_detach(rt_smem_t m);
  250. void *rt_smem_alloc(rt_smem_t m, rt_size_t size);
  251. void *rt_smem_realloc(rt_smem_t m, void *rmem, rt_size_t newsize);
  252. void rt_smem_free(void *rmem);
  253. #endif /* RT_USING_SMALL_MEM */
  254. #ifdef RT_USING_MEMHEAP
  255. /**
  256. * memory heap object interface
  257. */
  258. rt_err_t rt_memheap_init(struct rt_memheap *memheap,
  259. const char *name,
  260. void *start_addr,
  261. rt_size_t size);
  262. rt_err_t rt_memheap_detach(struct rt_memheap *heap);
  263. void *rt_memheap_alloc(struct rt_memheap *heap, rt_size_t size);
  264. void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize);
  265. void rt_memheap_free(void *ptr);
  266. void rt_memheap_info(struct rt_memheap *heap,
  267. rt_size_t *total,
  268. rt_size_t *used,
  269. rt_size_t *max_used);
  270. #endif /* RT_USING_MEMHEAP */
  271. #ifdef RT_USING_MEMHEAP_AS_HEAP
  272. /**
  273. * memory heap as heap
  274. */
  275. void *_memheap_alloc(struct rt_memheap *heap, rt_size_t size);
  276. void _memheap_free(void *rmem);
  277. void *_memheap_realloc(struct rt_memheap *heap, void *rmem, rt_size_t newsize);
  278. #endif
  279. #ifdef RT_USING_SLAB
  280. /**
  281. * slab object interface
  282. */
  283. rt_slab_t rt_slab_init(const char *name, void *begin_addr, rt_size_t size);
  284. rt_err_t rt_slab_detach(rt_slab_t m);
  285. void *rt_slab_page_alloc(rt_slab_t m, rt_size_t npages);
  286. void rt_slab_page_free(rt_slab_t m, void *addr, rt_size_t npages);
  287. void *rt_slab_alloc(rt_slab_t m, rt_size_t size);
  288. void *rt_slab_realloc(rt_slab_t m, void *ptr, rt_size_t size);
  289. void rt_slab_free(rt_slab_t m, void *ptr);
  290. #endif /* RT_USING_SLAB */
  291. #endif
  292. #if 0
  293. /**
  294. * Suspend list - A basic building block for IPC primitives which interacts with
  295. * scheduler directly. Its API is similar to a FIFO list.
  296. *
  297. * Note: don't use in application codes directly
  298. */
  299. void rt_susp_list_print(rt_list_t *list);
  300. /* reserve thread error while resuming it */
  301. #define RT_THREAD_RESUME_RES_THR_ERR (-1)
  302. struct rt_thread *rt_susp_list_dequeue(rt_list_t *susp_list, rt_err_t thread_error);
  303. rt_err_t rt_susp_list_resume_all(rt_list_t *susp_list, rt_err_t thread_error);
  304. rt_err_t rt_susp_list_resume_all_irq(rt_list_t *susp_list,
  305. rt_err_t thread_error,
  306. struct rt_spinlock *lock);
  307. /* suspend and enqueue */
  308. rt_err_t rt_thread_suspend_to_list(rt_thread_t thread, rt_list_t *susp_list, int ipc_flags, int suspend_flag);
  309. /* only for a suspended thread, and caller must hold the scheduler lock */
  310. rt_err_t rt_susp_list_enqueue(rt_list_t *susp_list, rt_thread_t thread, int ipc_flags);
  311. #endif
  312. /*
  313. * semaphore interface
  314. */
  315. typedef rt_err_t (*__kpi_rt_sem_init)(rt_sem_t sem, const char *name,
  316. rt_uint32_t value, rt_uint8_t flag);
  317. typedef rt_err_t (*__kpi_rt_sem_detach)(rt_sem_t sem);
  318. typedef rt_sem_t (*__kpi_rt_sem_create)(const char *name, rt_uint32_t value,
  319. rt_uint8_t flag);
  320. typedef rt_err_t (*__kpi_rt_sem_delete)(rt_sem_t sem);
  321. typedef rt_err_t (*__kpi_rt_sem_take)(rt_sem_t sem, rt_int32_t timeout);
  322. typedef rt_err_t (*__kpi_rt_sem_take_interruptible)(rt_sem_t sem,
  323. rt_int32_t timeout);
  324. typedef rt_err_t (*__kpi_rt_sem_take_killable)(rt_sem_t sem, rt_int32_t timeout);
  325. typedef rt_err_t (*__kpi_rt_sem_trytake)(rt_sem_t sem);
  326. typedef rt_err_t (*__kpi_rt_sem_release)(rt_sem_t sem);
  327. typedef rt_err_t (*__kpi_rt_sem_control)(rt_sem_t sem, int cmd, void *arg);
  328. /**
  329. * @addtogroup mutex
  330. * @{
  331. */
  332. typedef rt_err_t (*__kpi_rt_mutex_init)(rt_mutex_t mutex, const char *name,
  333. rt_uint8_t flag);
  334. typedef rt_err_t (*__kpi_rt_mutex_detach)(rt_mutex_t mutex);
  335. typedef rt_mutex_t (*__kpi_rt_mutex_create)(const char *name, rt_uint8_t flag);
  336. typedef rt_err_t (*__kpi_rt_mutex_delete)(rt_mutex_t mutex);
  337. typedef void (*__kpi_rt_mutex_drop_thread)(rt_mutex_t mutex, rt_thread_t thread);
  338. typedef rt_uint8_t (*__kpi_rt_mutex_setprioceiling)(rt_mutex_t mutex,
  339. rt_uint8_t priority);
  340. typedef rt_uint8_t (*__kpi_rt_mutex_getprioceiling)(rt_mutex_t mutex);
  341. typedef rt_err_t (*__kpi_rt_mutex_take)(rt_mutex_t mutex, rt_int32_t timeout);
  342. typedef rt_err_t (*__kpi_rt_mutex_trytake)(rt_mutex_t mutex);
  343. typedef rt_err_t (*__kpi_rt_mutex_take_interruptible)(rt_mutex_t mutex,
  344. rt_int32_t time);
  345. typedef rt_err_t (*__kpi_rt_mutex_take_killable)(rt_mutex_t mutex,
  346. rt_int32_t time);
  347. typedef rt_err_t (*__kpi_rt_mutex_release)(rt_mutex_t mutex);
  348. typedef rt_err_t (*__kpi_rt_mutex_control)(rt_mutex_t mutex, int cmd, void *arg);
  349. rt_inline rt_thread_t rt_mutex_get_owner(rt_mutex_t mutex)
  350. {
  351. return mutex->owner;
  352. }
  353. rt_inline rt_ubase_t rt_mutex_get_hold(rt_mutex_t mutex)
  354. {
  355. return mutex->hold;
  356. }
  357. /**
  358. * @addtogroup event
  359. * @{
  360. */
  361. typedef rt_err_t (*__kpi_rt_event_init)(rt_event_t event, const char *name,
  362. rt_uint8_t flag);
  363. typedef rt_err_t (*__kpi_rt_event_detach)(rt_event_t event);
  364. typedef rt_event_t (*__kpi_rt_event_create)(const char *name, rt_uint8_t flag);
  365. typedef rt_err_t (*__kpi_rt_event_delete)(rt_event_t event);
  366. typedef rt_err_t (*__kpi_rt_event_send)(rt_event_t event, rt_uint32_t set);
  367. typedef rt_err_t (*__kpi_rt_event_recv)(rt_event_t event, rt_uint32_t set,
  368. rt_uint8_t opt, rt_int32_t timeout, rt_uint32_t *recved);
  369. typedef rt_err_t (*__kpi_rt_event_recv_interruptible)(rt_event_t event,
  370. rt_uint32_t set, rt_uint8_t opt, rt_int32_t timeout, rt_uint32_t *recved);
  371. typedef rt_err_t (*__kpi_rt_event_recv_killable)(rt_event_t event,
  372. rt_uint32_t set, rt_uint8_t opt, rt_int32_t timeout, rt_uint32_t *recved);
  373. typedef rt_err_t (*__kpi_rt_event_control)(rt_event_t event, int cmd, void *arg);
  374. /**
  375. * @addtogroup mailbox
  376. * @{
  377. */
  378. typedef rt_err_t (*__kpi_rt_mb_init)(rt_mailbox_t mb, const char *name,
  379. void *msgpool, rt_size_t size, rt_uint8_t flag);
  380. typedef rt_err_t (*__kpi_rt_mb_detach)(rt_mailbox_t mb);
  381. typedef rt_mailbox_t (*__kpi_rt_mb_create)(const char *name, rt_size_t size,
  382. rt_uint8_t flag);
  383. typedef rt_err_t (*__kpi_rt_mb_delete)(rt_mailbox_t mb);
  384. typedef rt_err_t (*__kpi_rt_mb_send)(rt_mailbox_t mb, rt_ubase_t value);
  385. typedef rt_err_t (*__kpi_rt_mb_send_interruptible)(rt_mailbox_t mb,
  386. rt_ubase_t value);
  387. typedef rt_err_t (*__kpi_rt_mb_send_killable)(rt_mailbox_t mb, rt_ubase_t value);
  388. typedef rt_err_t (*__kpi_rt_mb_send_wait)(rt_mailbox_t mb, rt_ubase_t value,
  389. rt_int32_t timeout);
  390. typedef rt_err_t (*__kpi_rt_mb_send_wait_interruptible)(rt_mailbox_t mb,
  391. rt_ubase_t value, rt_int32_t timeout);
  392. typedef rt_err_t (*__kpi_rt_mb_send_wait_killable)(rt_mailbox_t mb,
  393. rt_ubase_t value, rt_int32_t timeout);
  394. typedef rt_err_t (*__kpi_rt_mb_urgent)(rt_mailbox_t mb, rt_ubase_t value);
  395. typedef rt_err_t (*__kpi_rt_mb_recv)(rt_mailbox_t mb, rt_ubase_t *value,
  396. rt_int32_t timeout);
  397. typedef rt_err_t (*__kpi_rt_mb_recv_interruptible)(rt_mailbox_t mb,
  398. rt_ubase_t *value, rt_int32_t timeout);
  399. typedef rt_err_t (*__kpi_rt_mb_recv_killable)(rt_mailbox_t mb,
  400. rt_ubase_t *value, rt_int32_t timeout);
  401. typedef rt_err_t (*__kpi_rt_mb_control)(rt_mailbox_t mb, int cmd, void *arg);
  402. struct rt_mq_message
  403. {
  404. struct rt_mq_message *next;
  405. rt_ssize_t length;
  406. #ifdef RT_USING_MESSAGEQUEUE_PRIORITY
  407. rt_int32_t prio;
  408. #endif /* RT_USING_MESSAGEQUEUE_PRIORITY */
  409. };
  410. #define RT_MQ_BUF_SIZE(msg_size, max_msgs) \
  411. ((RT_ALIGN((msg_size), RT_ALIGN_SIZE) + sizeof(struct rt_mq_message)) * (max_msgs))
  412. /*
  413. * message queue interface
  414. */
  415. typedef rt_err_t (*__kpi_rt_mq_init)(rt_mq_t mq, const char *name, void *msgpool,
  416. rt_size_t msg_size, rt_size_t pool_size, rt_uint8_t flag);
  417. typedef rt_err_t (*__kpi_rt_mq_detach)(rt_mq_t mq);
  418. typedef rt_mq_t (*__kpi_rt_mq_create)(const char *name, rt_size_t msg_size,
  419. rt_size_t max_msgs, rt_uint8_t flag);
  420. typedef rt_err_t (*__kpi_rt_mq_delete)(rt_mq_t mq);
  421. typedef rt_err_t (*__kpi_rt_mq_send)(rt_mq_t mq, const void *buffer,
  422. rt_size_t size);
  423. typedef rt_err_t (*__kpi_rt_mq_send_interruptible)(rt_mq_t mq,
  424. const void *buffer, rt_size_t size);
  425. typedef rt_err_t (*__kpi_rt_mq_send_killable)(rt_mq_t mq, const void *buffer,
  426. rt_size_t size);
  427. typedef rt_err_t (*__kpi_rt_mq_send_wait)(rt_mq_t mq, const void *buffer,
  428. rt_size_t size, rt_int32_t timeout);
  429. typedef rt_err_t (*__kpi_rt_mq_send_wait_interruptible)(rt_mq_t mq,
  430. const void *buffer, rt_size_t size, rt_int32_t timeout);
  431. typedef rt_err_t (*__kpi_rt_mq_send_wait_killable)(rt_mq_t mq,
  432. const void *buffer, rt_size_t size, rt_int32_t timeout);
  433. typedef rt_err_t (*__kpi_rt_mq_urgent)(rt_mq_t mq, const void *buffer,
  434. rt_size_t size);
  435. typedef rt_ssize_t (*__kpi_rt_mq_recv)(rt_mq_t mq, void *buffer, rt_size_t size,
  436. rt_int32_t timeout);
  437. typedef rt_ssize_t (*__kpi_rt_mq_recv_interruptible)(rt_mq_t mq, void *buffer,
  438. rt_size_t size, rt_int32_t timeout);
  439. typedef rt_ssize_t (*__kpi_rt_mq_recv_killable)(rt_mq_t mq, void *buffer,
  440. rt_size_t size, rt_int32_t timeout);
  441. typedef rt_err_t (*__kpi_rt_mq_control)(rt_mq_t mq, int cmd, void *arg);
  442. typedef rt_err_t (*__kpi_rt_mq_send_wait_prio)(rt_mq_t mq, const void *buffer,
  443. rt_size_t size, rt_int32_t prio, rt_int32_t timeout, int suspend_flag);
  444. typedef rt_ssize_t (*__kpi_rt_mq_recv_prio)(rt_mq_t mq, void *buffer,
  445. rt_size_t size, rt_int32_t *prio, rt_int32_t timeout, int suspend_flag);
  446. #if 0
  447. /* defunct */
  448. void rt_thread_defunct_init(void);
  449. void rt_thread_defunct_enqueue(rt_thread_t thread);
  450. rt_thread_t rt_thread_defunct_dequeue(void);
  451. void rt_defunct_execute(void);
  452. #endif
  453. /*
  454. * spinlock
  455. */
  456. struct rt_spinlock;
  457. typedef void (*__kpi_rt_spin_lock_init)(struct rt_spinlock *lock);
  458. typedef void (*__kpi_rt_spin_lock)(struct rt_spinlock *lock);
  459. typedef void (*__kpi_rt_spin_unlock)(struct rt_spinlock *lock);
  460. typedef rt_base_t (*__kpi_rt_spin_lock_irqsave)(struct rt_spinlock *lock);
  461. typedef void (*__kpi_rt_spin_unlock_irqrestore)(struct rt_spinlock *lock,
  462. rt_base_t level);
  463. /*
  464. * device (I/O) system interface
  465. */
  466. typedef rt_device_t (*__kpi_rt_device_find)(const char *name);
  467. typedef rt_err_t (*__kpi_rt_device_register)(rt_device_t dev, const char *name,
  468. rt_uint16_t flags);
  469. typedef rt_err_t (*__kpi_rt_device_unregister)(rt_device_t dev);
  470. typedef rt_device_t (*__kpi_rt_device_create)(int type, int attach_size);
  471. typedef void (*__kpi_rt_device_destroy)(rt_device_t device);
  472. typedef rt_err_t (*__kpi_rt_device_set_rx_indicate)(rt_device_t dev,
  473. rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size));
  474. typedef rt_err_t (*__kpi_rt_device_set_tx_complete)(rt_device_t dev,
  475. rt_err_t (*tx_done)(rt_device_t dev, void *buffer));
  476. typedef rt_err_t (*__kpi_rt_device_init)(rt_device_t dev);
  477. typedef rt_err_t (*__kpi_rt_device_open)(rt_device_t dev, rt_uint16_t oflag);
  478. typedef rt_err_t (*__kpi_rt_device_close)(rt_device_t dev);
  479. typedef rt_ssize_t (*__kpi_rt_device_read)(rt_device_t dev, rt_off_t pos,
  480. void *buffer, rt_size_t size);
  481. typedef rt_ssize_t (*__kpi_rt_device_write)(rt_device_t dev, rt_off_t pos,
  482. const void *buffer, rt_size_t size);
  483. typedef rt_err_t (*__kpi_rt_device_control)(rt_device_t dev, int cmd, void *arg);
  484. #if 0
  485. /**
  486. * CPU object
  487. */
  488. struct rt_cpu *rt_cpu_self(void);
  489. struct rt_cpu *rt_cpu_index(int index);
  490. #ifdef RT_USING_SMP
  491. /*
  492. * smp cpus lock service
  493. */
  494. rt_base_t rt_cpus_lock(void);
  495. void rt_cpus_unlock(rt_base_t level);
  496. void rt_cpus_lock_status_restore(struct rt_thread *thread);
  497. #ifdef RT_USING_DEBUG
  498. rt_base_t rt_cpu_get_id(void);
  499. #else /* !RT_USING_DEBUG */
  500. #define rt_cpu_get_id rt_hw_cpu_id
  501. #endif /* RT_USING_DEBUG */
  502. #else /* !RT_USING_SMP */
  503. #define rt_cpu_get_id() (0)
  504. #endif /* RT_USING_SMP */
  505. #endif
  506. /*
  507. * rt_interrupt_enter and rt_interrupt_leave only can be called by BSP
  508. */
  509. typedef void (*__kpi_rt_interrupt_enter)(void);
  510. typedef void (*__kpi_rt_interrupt_leave)(void);
  511. typedef rt_uint8_t (*__kpi_rt_interrupt_get_nest)(void);
  512. #if 0
  513. void rt_interrupt_context_push(rt_interrupt_context_t this_ctx);
  514. void rt_interrupt_context_pop(void);
  515. void *rt_interrupt_context_get(void);
  516. #ifdef RT_USING_HOOK
  517. void rt_interrupt_enter_sethook(void (*hook)(void));
  518. void rt_interrupt_leave_sethook(void (*hook)(void));
  519. #endif /* RT_USING_HOOK */
  520. #endif
  521. #if 0
  522. #ifdef RT_USING_COMPONENTS_INIT
  523. void rt_components_init(void);
  524. void rt_components_board_init(void);
  525. #endif /* RT_USING_COMPONENTS_INIT */
  526. #endif
  527. /*
  528. * general kernel service
  529. */
  530. typedef int (*__kpi_rt_kprintf)(const char *fmt, ...);
  531. typedef void (*__kpi_rt_kputs)(const char *str);
  532. #if 0
  533. rt_err_t rt_backtrace(void);
  534. rt_err_t rt_backtrace_thread(rt_thread_t thread);
  535. rt_err_t rt_backtrace_frame(rt_thread_t thread, struct rt_hw_backtrace_frame *frame);
  536. rt_err_t rt_backtrace_formatted_print(rt_ubase_t *buffer, long buflen);
  537. rt_err_t rt_backtrace_to_buffer(rt_thread_t thread, struct rt_hw_backtrace_frame *frame,
  538. long skip, rt_ubase_t *buffer, long buflen);
  539. #if defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE)
  540. rt_device_t rt_console_set_device(const char *name);
  541. rt_device_t rt_console_get_device(void);
  542. #ifdef RT_USING_THREADSAFE_PRINTF
  543. rt_thread_t rt_console_current_user(void);
  544. #else
  545. rt_inline void *rt_console_current_user(void) { return RT_NULL; }
  546. #endif /* RT_USING_THREADSAFE_PRINTF */
  547. #endif /* defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE) */
  548. int __rt_ffs(int value);
  549. unsigned long __rt_ffsl(unsigned long value);
  550. unsigned long __rt_clz(unsigned long value);
  551. void rt_show_version(void);
  552. #endif
  553. #ifdef RT_DEBUGING_ASSERT
  554. typedef void (*__kpi_rt_assert_handler)(const char *ex, const char *func,
  555. rt_size_t line);
  556. #define RT_ASSERT(EX) \
  557. if (!(EX)) \
  558. { \
  559. rt_assert_handler(#EX, __FUNCTION__, __LINE__); \
  560. }
  561. #else
  562. #define RT_ASSERT(EX) \
  563. { \
  564. RT_UNUSED(EX); \
  565. }
  566. #endif /* RT_DEBUGING_ASSERT */
  567. #if 0
  568. #ifdef RT_DEBUGING_CONTEXT
  569. /* Macro to check current context */
  570. #define RT_DEBUG_NOT_IN_INTERRUPT \
  571. do \
  572. { \
  573. if (rt_interrupt_get_nest() != 0) \
  574. { \
  575. rt_kprintf("Function[%s] shall not be used in ISR\n", __FUNCTION__); \
  576. RT_ASSERT(0) \
  577. } \
  578. } \
  579. while (0)
  580. /* "In thread context" means:
  581. * 1) the scheduler has been started
  582. * 2) not in interrupt context.
  583. */
  584. #define RT_DEBUG_IN_THREAD_CONTEXT \
  585. do \
  586. { \
  587. if (rt_thread_self() == RT_NULL) \
  588. { \
  589. rt_kprintf("Function[%s] shall not be used before scheduler start\n", \
  590. __FUNCTION__); \
  591. RT_ASSERT(0) \
  592. } \
  593. RT_DEBUG_NOT_IN_INTERRUPT; \
  594. } \
  595. while (0)
  596. /* "scheduler available" means:
  597. * 1) the scheduler has been started.
  598. * 2) not in interrupt context.
  599. * 3) scheduler is not locked.
  600. */
  601. #define RT_DEBUG_SCHEDULER_AVAILABLE(need_check) \
  602. do \
  603. { \
  604. if (need_check) \
  605. { \
  606. if (rt_critical_level() != 0) \
  607. { \
  608. rt_kprintf("Function[%s]: scheduler is not available\n", \
  609. __FUNCTION__); \
  610. RT_ASSERT(0) \
  611. } \
  612. RT_DEBUG_IN_THREAD_CONTEXT; \
  613. } \
  614. } \
  615. while (0)
  616. #else
  617. #define RT_DEBUG_NOT_IN_INTERRUPT
  618. #define RT_DEBUG_IN_THREAD_CONTEXT
  619. #define RT_DEBUG_SCHEDULER_AVAILABLE(need_check)
  620. #endif /* RT_DEBUGING_CONTEXT */
  621. rt_inline rt_bool_t rt_in_thread_context(void)
  622. {
  623. return rt_thread_self() != RT_NULL && rt_interrupt_get_nest() == 0;
  624. }
  625. /* is scheduler available */
  626. rt_inline rt_bool_t rt_scheduler_is_available(void)
  627. {
  628. return rt_critical_level() == 0 && rt_in_thread_context();
  629. }
  630. #ifdef RT_USING_SMP
  631. /* is thread bond on core */
  632. rt_inline rt_bool_t rt_sched_thread_is_binding(rt_thread_t thread)
  633. {
  634. if (thread == RT_NULL)
  635. {
  636. thread = rt_thread_self();
  637. }
  638. return !thread || RT_SCHED_CTX(thread).bind_cpu != RT_CPUS_NR;
  639. }
  640. #else
  641. #define rt_sched_thread_is_binding(thread) (RT_TRUE)
  642. #endif
  643. #endif
  644. KPI_EXTERN(rt_tick_get);
  645. KPI_EXTERN(rt_tick_set);
  646. KPI_EXTERN(rt_tick_from_millisecond);
  647. KPI_EXTERN(rt_tick_get_millisecond_r);
  648. KPI_EXTERN(rt_timer_init);
  649. KPI_EXTERN(rt_timer_detach);
  650. KPI_EXTERN(rt_timer_create);
  651. KPI_EXTERN(rt_timer_delete);
  652. KPI_EXTERN(rt_timer_start);
  653. KPI_EXTERN(rt_timer_stop);
  654. KPI_EXTERN(rt_timer_control);
  655. KPI_EXTERN(rt_thread_init);
  656. KPI_EXTERN(rt_thread_detach);
  657. KPI_EXTERN(rt_thread_create);
  658. KPI_EXTERN(rt_thread_delete);
  659. KPI_EXTERN(rt_thread_close);
  660. KPI_EXTERN(rt_thread_self);
  661. KPI_EXTERN(rt_thread_find);
  662. KPI_EXTERN(rt_thread_startup);
  663. KPI_EXTERN(rt_thread_yield);
  664. KPI_EXTERN(rt_thread_delay);
  665. KPI_EXTERN(rt_thread_delay_until);
  666. KPI_EXTERN(rt_thread_mdelay);
  667. KPI_EXTERN(rt_thread_control);
  668. KPI_EXTERN(rt_thread_suspend);
  669. KPI_EXTERN(rt_thread_suspend_with_flag);
  670. KPI_EXTERN(rt_thread_resume);
  671. KPI_EXTERN(rt_thread_get_name);
  672. KPI_EXTERN(rt_thread_idle_sethook);
  673. KPI_EXTERN(rt_thread_idle_delhook);
  674. KPI_EXTERN(rt_thread_idle_gethandler);
  675. KPI_EXTERN(rt_enter_critical);
  676. KPI_EXTERN(rt_exit_critical);
  677. KPI_EXTERN(rt_exit_critical_safe);
  678. KPI_EXTERN(rt_critical_level);
  679. KPI_EXTERN(rt_schedule);
  680. KPI_EXTERN(rt_malloc);
  681. KPI_EXTERN(rt_free);
  682. KPI_EXTERN(rt_realloc);
  683. KPI_EXTERN(rt_calloc);
  684. KPI_EXTERN(rt_malloc_align);
  685. KPI_EXTERN(rt_free_align);
  686. KPI_EXTERN(rt_sem_init);
  687. KPI_EXTERN(rt_sem_detach);
  688. KPI_EXTERN(rt_sem_create);
  689. KPI_EXTERN(rt_sem_delete);
  690. KPI_EXTERN(rt_sem_take);
  691. KPI_EXTERN(rt_sem_take_interruptible);
  692. KPI_EXTERN(rt_sem_take_killable);
  693. KPI_EXTERN(rt_sem_trytake);
  694. KPI_EXTERN(rt_sem_release);
  695. KPI_EXTERN(rt_sem_control);
  696. KPI_EXTERN(rt_mutex_init);
  697. KPI_EXTERN(rt_mutex_detach);
  698. KPI_EXTERN(rt_mutex_create);
  699. KPI_EXTERN(rt_mutex_delete);
  700. KPI_EXTERN(rt_mutex_drop_thread);
  701. KPI_EXTERN(rt_mutex_setprioceiling);
  702. KPI_EXTERN(rt_mutex_getprioceiling);
  703. KPI_EXTERN(rt_mutex_take);
  704. KPI_EXTERN(rt_mutex_trytake);
  705. KPI_EXTERN(rt_mutex_take_interruptible);
  706. KPI_EXTERN(rt_mutex_take_killable);
  707. KPI_EXTERN(rt_mutex_release);
  708. KPI_EXTERN(rt_mutex_control);
  709. KPI_EXTERN(rt_event_init);
  710. KPI_EXTERN(rt_event_detach);
  711. KPI_EXTERN(rt_event_create);
  712. KPI_EXTERN(rt_event_delete);
  713. KPI_EXTERN(rt_event_send);
  714. KPI_EXTERN(rt_event_recv);
  715. KPI_EXTERN(rt_event_recv_interruptible);
  716. KPI_EXTERN(rt_event_recv_killable);
  717. KPI_EXTERN(rt_event_control);
  718. KPI_EXTERN(rt_mb_init);
  719. KPI_EXTERN(rt_mb_detach);
  720. KPI_EXTERN(rt_mb_create);
  721. KPI_EXTERN(rt_mb_delete);
  722. KPI_EXTERN(rt_mb_send);
  723. KPI_EXTERN(rt_mb_send_interruptible);
  724. KPI_EXTERN(rt_mb_send_killable);
  725. KPI_EXTERN(rt_mb_send_wait);
  726. KPI_EXTERN(rt_mb_send_wait_interruptible);
  727. KPI_EXTERN(rt_mb_send_wait_killable);
  728. KPI_EXTERN(rt_mb_urgent);
  729. KPI_EXTERN(rt_mb_recv);
  730. KPI_EXTERN(rt_mb_recv_interruptible);
  731. KPI_EXTERN(rt_mb_recv_killable);
  732. KPI_EXTERN(rt_mb_control);
  733. KPI_EXTERN(rt_mq_init);
  734. KPI_EXTERN(rt_mq_detach);
  735. KPI_EXTERN(rt_mq_create);
  736. KPI_EXTERN(rt_mq_delete);
  737. KPI_EXTERN(rt_mq_send);
  738. KPI_EXTERN(rt_mq_send_interruptible);
  739. KPI_EXTERN(rt_mq_send_killable);
  740. KPI_EXTERN(rt_mq_send_wait);
  741. KPI_EXTERN(rt_mq_send_wait_interruptible);
  742. KPI_EXTERN(rt_mq_send_wait_killable);
  743. KPI_EXTERN(rt_mq_urgent);
  744. KPI_EXTERN(rt_mq_recv);
  745. KPI_EXTERN(rt_mq_recv_interruptible);
  746. KPI_EXTERN(rt_mq_recv_killable);
  747. KPI_EXTERN(rt_mq_control);
  748. KPI_EXTERN(rt_mq_send_wait_prio);
  749. KPI_EXTERN(rt_mq_recv_prio);
  750. KPI_EXTERN(rt_spin_lock_init);
  751. KPI_EXTERN(rt_spin_lock);
  752. KPI_EXTERN(rt_spin_unlock);
  753. KPI_EXTERN(rt_spin_lock_irqsave);
  754. KPI_EXTERN(rt_spin_unlock_irqrestore);
  755. KPI_EXTERN(rt_device_find);
  756. KPI_EXTERN(rt_device_register);
  757. KPI_EXTERN(rt_device_unregister);
  758. KPI_EXTERN(rt_device_create);
  759. KPI_EXTERN(rt_device_destroy);
  760. KPI_EXTERN(rt_device_set_rx_indicate);
  761. KPI_EXTERN(rt_device_set_tx_complete);
  762. KPI_EXTERN(rt_device_init);
  763. KPI_EXTERN(rt_device_open);
  764. KPI_EXTERN(rt_device_close);
  765. KPI_EXTERN(rt_device_read);
  766. KPI_EXTERN(rt_device_write);
  767. KPI_EXTERN(rt_device_control);
  768. KPI_EXTERN(rt_interrupt_enter);
  769. KPI_EXTERN(rt_interrupt_leave);
  770. KPI_EXTERN(rt_interrupt_get_nest);
  771. KPI_EXTERN(rt_kprintf);
  772. KPI_EXTERN(rt_kputs);
  773. KPI_EXTERN(rt_assert_handler);
  774. #endif /* __RTTHREAD_H__ */