1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero * 2006-03-18 Bernard the first version 9*10465441SEvalZero * 2006-04-26 Bernard add semaphore APIs 10*10465441SEvalZero * 2006-08-10 Bernard add version information 11*10465441SEvalZero * 2007-01-28 Bernard rename RT_OBJECT_Class_Static to RT_Object_Class_Static 12*10465441SEvalZero * 2007-03-03 Bernard clean up the definitions to rtdef.h 13*10465441SEvalZero * 2010-04-11 yi.qiu add module feature 14*10465441SEvalZero * 2013-06-24 Bernard add rt_kprintf re-define when not use RT_USING_CONSOLE. 15*10465441SEvalZero * 2016-08-09 ArdaFu add new thread and interrupt hook. 16*10465441SEvalZero * 2018-11-22 Jesven add all cpu's lock and ipi handler 17*10465441SEvalZero */ 18*10465441SEvalZero 19*10465441SEvalZero #ifndef __RT_THREAD_H__ 20*10465441SEvalZero #define __RT_THREAD_H__ 21*10465441SEvalZero 22*10465441SEvalZero #include <rtconfig.h> 23*10465441SEvalZero #include <rtdebug.h> 24*10465441SEvalZero #include <rtdef.h> 25*10465441SEvalZero #include <rtservice.h> 26*10465441SEvalZero #include <rtm.h> 27*10465441SEvalZero 28*10465441SEvalZero #ifdef __cplusplus 29*10465441SEvalZero extern "C" { 30*10465441SEvalZero #endif 31*10465441SEvalZero 32*10465441SEvalZero /** 33*10465441SEvalZero * @addtogroup KernelObject 34*10465441SEvalZero */ 35*10465441SEvalZero 36*10465441SEvalZero /**@{*/ 37*10465441SEvalZero 38*10465441SEvalZero /* 39*10465441SEvalZero * kernel object interface 40*10465441SEvalZero */ 41*10465441SEvalZero void rt_system_object_init(void); 42*10465441SEvalZero struct rt_object_information * 43*10465441SEvalZero rt_object_get_information(enum rt_object_class_type type); 44*10465441SEvalZero void rt_object_init(struct rt_object *object, 45*10465441SEvalZero enum rt_object_class_type type, 46*10465441SEvalZero const char *name); 47*10465441SEvalZero void rt_object_detach(rt_object_t object); 48*10465441SEvalZero rt_object_t rt_object_allocate(enum rt_object_class_type type, 49*10465441SEvalZero const char *name); 50*10465441SEvalZero void rt_object_delete(rt_object_t object); 51*10465441SEvalZero rt_bool_t rt_object_is_systemobject(rt_object_t object); 52*10465441SEvalZero rt_uint8_t rt_object_get_type(rt_object_t object); 53*10465441SEvalZero rt_object_t rt_object_find(const char *name, rt_uint8_t type); 54*10465441SEvalZero 55*10465441SEvalZero #ifdef RT_USING_HOOK 56*10465441SEvalZero void rt_object_attach_sethook(void (*hook)(struct rt_object *object)); 57*10465441SEvalZero void rt_object_detach_sethook(void (*hook)(struct rt_object *object)); 58*10465441SEvalZero void rt_object_trytake_sethook(void (*hook)(struct rt_object *object)); 59*10465441SEvalZero void rt_object_take_sethook(void (*hook)(struct rt_object *object)); 60*10465441SEvalZero void rt_object_put_sethook(void (*hook)(struct rt_object *object)); 61*10465441SEvalZero #endif 62*10465441SEvalZero 63*10465441SEvalZero /**@}*/ 64*10465441SEvalZero 65*10465441SEvalZero /** 66*10465441SEvalZero * @addtogroup Clock 67*10465441SEvalZero */ 68*10465441SEvalZero 69*10465441SEvalZero /**@{*/ 70*10465441SEvalZero 71*10465441SEvalZero /* 72*10465441SEvalZero * clock & timer interface 73*10465441SEvalZero */ 74*10465441SEvalZero void rt_system_tick_init(void); 75*10465441SEvalZero rt_tick_t rt_tick_get(void); 76*10465441SEvalZero void rt_tick_set(rt_tick_t tick); 77*10465441SEvalZero void rt_tick_increase(void); 78*10465441SEvalZero int rt_tick_from_millisecond(rt_int32_t ms); 79*10465441SEvalZero 80*10465441SEvalZero void rt_system_timer_init(void); 81*10465441SEvalZero void rt_system_timer_thread_init(void); 82*10465441SEvalZero 83*10465441SEvalZero void rt_timer_init(rt_timer_t timer, 84*10465441SEvalZero const char *name, 85*10465441SEvalZero void (*timeout)(void *parameter), 86*10465441SEvalZero void *parameter, 87*10465441SEvalZero rt_tick_t time, 88*10465441SEvalZero rt_uint8_t flag); 89*10465441SEvalZero rt_err_t rt_timer_detach(rt_timer_t timer); 90*10465441SEvalZero rt_timer_t rt_timer_create(const char *name, 91*10465441SEvalZero void (*timeout)(void *parameter), 92*10465441SEvalZero void *parameter, 93*10465441SEvalZero rt_tick_t time, 94*10465441SEvalZero rt_uint8_t flag); 95*10465441SEvalZero rt_err_t rt_timer_delete(rt_timer_t timer); 96*10465441SEvalZero rt_err_t rt_timer_start(rt_timer_t timer); 97*10465441SEvalZero rt_err_t rt_timer_stop(rt_timer_t timer); 98*10465441SEvalZero rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *arg); 99*10465441SEvalZero 100*10465441SEvalZero rt_tick_t rt_timer_next_timeout_tick(void); 101*10465441SEvalZero void rt_timer_check(void); 102*10465441SEvalZero 103*10465441SEvalZero #ifdef RT_USING_HOOK 104*10465441SEvalZero void rt_timer_enter_sethook(void (*hook)(struct rt_timer *timer)); 105*10465441SEvalZero void rt_timer_exit_sethook(void (*hook)(struct rt_timer *timer)); 106*10465441SEvalZero #endif 107*10465441SEvalZero 108*10465441SEvalZero /**@}*/ 109*10465441SEvalZero 110*10465441SEvalZero /** 111*10465441SEvalZero * @addtogroup Thread 112*10465441SEvalZero */ 113*10465441SEvalZero 114*10465441SEvalZero /**@{*/ 115*10465441SEvalZero 116*10465441SEvalZero /* 117*10465441SEvalZero * thread interface 118*10465441SEvalZero */ 119*10465441SEvalZero rt_err_t rt_thread_init(struct rt_thread *thread, 120*10465441SEvalZero const char *name, 121*10465441SEvalZero void (*entry)(void *parameter), 122*10465441SEvalZero void *parameter, 123*10465441SEvalZero void *stack_start, 124*10465441SEvalZero rt_uint32_t stack_size, 125*10465441SEvalZero rt_uint8_t priority, 126*10465441SEvalZero rt_uint32_t tick); 127*10465441SEvalZero rt_err_t rt_thread_detach(rt_thread_t thread); 128*10465441SEvalZero rt_thread_t rt_thread_create(const char *name, 129*10465441SEvalZero void (*entry)(void *parameter), 130*10465441SEvalZero void *parameter, 131*10465441SEvalZero rt_uint32_t stack_size, 132*10465441SEvalZero rt_uint8_t priority, 133*10465441SEvalZero rt_uint32_t tick); 134*10465441SEvalZero rt_thread_t rt_thread_self(void); 135*10465441SEvalZero rt_thread_t rt_thread_find(char *name); 136*10465441SEvalZero rt_err_t rt_thread_startup(rt_thread_t thread); 137*10465441SEvalZero rt_err_t rt_thread_delete(rt_thread_t thread); 138*10465441SEvalZero 139*10465441SEvalZero rt_err_t rt_thread_yield(void); 140*10465441SEvalZero rt_err_t rt_thread_delay(rt_tick_t tick); 141*10465441SEvalZero rt_err_t rt_thread_mdelay(rt_int32_t ms); 142*10465441SEvalZero rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg); 143*10465441SEvalZero rt_err_t rt_thread_suspend(rt_thread_t thread); 144*10465441SEvalZero rt_err_t rt_thread_resume(rt_thread_t thread); 145*10465441SEvalZero void rt_thread_timeout(void *parameter); 146*10465441SEvalZero 147*10465441SEvalZero #ifdef RT_USING_SIGNALS 148*10465441SEvalZero void rt_thread_alloc_sig(rt_thread_t tid); 149*10465441SEvalZero void rt_thread_free_sig(rt_thread_t tid); 150*10465441SEvalZero int rt_thread_kill(rt_thread_t tid, int sig); 151*10465441SEvalZero #endif 152*10465441SEvalZero 153*10465441SEvalZero #ifdef RT_USING_HOOK 154*10465441SEvalZero void rt_thread_suspend_sethook(void (*hook)(rt_thread_t thread)); 155*10465441SEvalZero void rt_thread_resume_sethook (void (*hook)(rt_thread_t thread)); 156*10465441SEvalZero void rt_thread_inited_sethook (void (*hook)(rt_thread_t thread)); 157*10465441SEvalZero #endif 158*10465441SEvalZero 159*10465441SEvalZero /* 160*10465441SEvalZero * idle thread interface 161*10465441SEvalZero */ 162*10465441SEvalZero void rt_thread_idle_init(void); 163*10465441SEvalZero #if defined(RT_USING_HOOK) || defined(RT_USING_IDLE_HOOK) 164*10465441SEvalZero rt_err_t rt_thread_idle_sethook(void (*hook)(void)); 165*10465441SEvalZero rt_err_t rt_thread_idle_delhook(void (*hook)(void)); 166*10465441SEvalZero #endif 167*10465441SEvalZero void rt_thread_idle_excute(void); 168*10465441SEvalZero rt_thread_t rt_thread_idle_gethandler(void); 169*10465441SEvalZero 170*10465441SEvalZero /* 171*10465441SEvalZero * schedule service 172*10465441SEvalZero */ 173*10465441SEvalZero void rt_system_scheduler_init(void); 174*10465441SEvalZero void rt_system_scheduler_start(void); 175*10465441SEvalZero 176*10465441SEvalZero void rt_schedule(void); 177*10465441SEvalZero void rt_schedule_insert_thread(struct rt_thread *thread); 178*10465441SEvalZero void rt_schedule_remove_thread(struct rt_thread *thread); 179*10465441SEvalZero 180*10465441SEvalZero void rt_enter_critical(void); 181*10465441SEvalZero void rt_exit_critical(void); 182*10465441SEvalZero rt_uint16_t rt_critical_level(void); 183*10465441SEvalZero 184*10465441SEvalZero #ifdef RT_USING_HOOK 185*10465441SEvalZero void rt_scheduler_sethook(void (*hook)(rt_thread_t from, rt_thread_t to)); 186*10465441SEvalZero #endif 187*10465441SEvalZero 188*10465441SEvalZero #ifdef RT_USING_SMP 189*10465441SEvalZero void rt_scheduler_ipi_handler(int vector, void *param); 190*10465441SEvalZero #endif 191*10465441SEvalZero 192*10465441SEvalZero /**@}*/ 193*10465441SEvalZero 194*10465441SEvalZero /** 195*10465441SEvalZero * @addtogroup Signals 196*10465441SEvalZero * @{ 197*10465441SEvalZero */ 198*10465441SEvalZero #ifdef RT_USING_SIGNALS 199*10465441SEvalZero void rt_signal_mask(int signo); 200*10465441SEvalZero void rt_signal_unmask(int signo); 201*10465441SEvalZero rt_sighandler_t rt_signal_install(int signo, rt_sighandler_t handler); 202*10465441SEvalZero int rt_signal_wait(const rt_sigset_t *set, rt_siginfo_t *si, rt_int32_t timeout); 203*10465441SEvalZero 204*10465441SEvalZero int rt_system_signal_init(void); 205*10465441SEvalZero #endif 206*10465441SEvalZero /*@}*/ 207*10465441SEvalZero 208*10465441SEvalZero /** 209*10465441SEvalZero * @addtogroup MM 210*10465441SEvalZero */ 211*10465441SEvalZero 212*10465441SEvalZero /**@{*/ 213*10465441SEvalZero 214*10465441SEvalZero /* 215*10465441SEvalZero * memory management interface 216*10465441SEvalZero */ 217*10465441SEvalZero #ifdef RT_USING_MEMPOOL 218*10465441SEvalZero /* 219*10465441SEvalZero * memory pool interface 220*10465441SEvalZero */ 221*10465441SEvalZero rt_err_t rt_mp_init(struct rt_mempool *mp, 222*10465441SEvalZero const char *name, 223*10465441SEvalZero void *start, 224*10465441SEvalZero rt_size_t size, 225*10465441SEvalZero rt_size_t block_size); 226*10465441SEvalZero rt_err_t rt_mp_detach(struct rt_mempool *mp); 227*10465441SEvalZero rt_mp_t rt_mp_create(const char *name, 228*10465441SEvalZero rt_size_t block_count, 229*10465441SEvalZero rt_size_t block_size); 230*10465441SEvalZero rt_err_t rt_mp_delete(rt_mp_t mp); 231*10465441SEvalZero 232*10465441SEvalZero void *rt_mp_alloc(rt_mp_t mp, rt_int32_t time); 233*10465441SEvalZero void rt_mp_free(void *block); 234*10465441SEvalZero 235*10465441SEvalZero #ifdef RT_USING_HOOK 236*10465441SEvalZero void rt_mp_alloc_sethook(void (*hook)(struct rt_mempool *mp, void *block)); 237*10465441SEvalZero void rt_mp_free_sethook(void (*hook)(struct rt_mempool *mp, void *block)); 238*10465441SEvalZero #endif 239*10465441SEvalZero 240*10465441SEvalZero #endif 241*10465441SEvalZero 242*10465441SEvalZero #ifdef RT_USING_HEAP 243*10465441SEvalZero /* 244*10465441SEvalZero * heap memory interface 245*10465441SEvalZero */ 246*10465441SEvalZero void rt_system_heap_init(void *begin_addr, void *end_addr); 247*10465441SEvalZero 248*10465441SEvalZero void *rt_malloc(rt_size_t nbytes); 249*10465441SEvalZero void rt_free(void *ptr); 250*10465441SEvalZero void *rt_realloc(void *ptr, rt_size_t nbytes); 251*10465441SEvalZero void *rt_calloc(rt_size_t count, rt_size_t size); 252*10465441SEvalZero void *rt_malloc_align(rt_size_t size, rt_size_t align); 253*10465441SEvalZero void rt_free_align(void *ptr); 254*10465441SEvalZero 255*10465441SEvalZero void rt_memory_info(rt_uint32_t *total, 256*10465441SEvalZero rt_uint32_t *used, 257*10465441SEvalZero rt_uint32_t *max_used); 258*10465441SEvalZero 259*10465441SEvalZero #ifdef RT_USING_SLAB 260*10465441SEvalZero void *rt_page_alloc(rt_size_t npages); 261*10465441SEvalZero void rt_page_free(void *addr, rt_size_t npages); 262*10465441SEvalZero #endif 263*10465441SEvalZero 264*10465441SEvalZero #ifdef RT_USING_HOOK 265*10465441SEvalZero void rt_malloc_sethook(void (*hook)(void *ptr, rt_size_t size)); 266*10465441SEvalZero void rt_free_sethook(void (*hook)(void *ptr)); 267*10465441SEvalZero #endif 268*10465441SEvalZero 269*10465441SEvalZero #endif 270*10465441SEvalZero 271*10465441SEvalZero #ifdef RT_USING_MEMHEAP 272*10465441SEvalZero /** 273*10465441SEvalZero * memory heap object interface 274*10465441SEvalZero */ 275*10465441SEvalZero rt_err_t rt_memheap_init(struct rt_memheap *memheap, 276*10465441SEvalZero const char *name, 277*10465441SEvalZero void *start_addr, 278*10465441SEvalZero rt_size_t size); 279*10465441SEvalZero rt_err_t rt_memheap_detach(struct rt_memheap *heap); 280*10465441SEvalZero void *rt_memheap_alloc(struct rt_memheap *heap, rt_size_t size); 281*10465441SEvalZero void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize); 282*10465441SEvalZero void rt_memheap_free(void *ptr); 283*10465441SEvalZero #endif 284*10465441SEvalZero 285*10465441SEvalZero /**@}*/ 286*10465441SEvalZero 287*10465441SEvalZero /** 288*10465441SEvalZero * @addtogroup IPC 289*10465441SEvalZero */ 290*10465441SEvalZero 291*10465441SEvalZero /**@{*/ 292*10465441SEvalZero 293*10465441SEvalZero #ifdef RT_USING_SEMAPHORE 294*10465441SEvalZero /* 295*10465441SEvalZero * semaphore interface 296*10465441SEvalZero */ 297*10465441SEvalZero rt_err_t rt_sem_init(rt_sem_t sem, 298*10465441SEvalZero const char *name, 299*10465441SEvalZero rt_uint32_t value, 300*10465441SEvalZero rt_uint8_t flag); 301*10465441SEvalZero rt_err_t rt_sem_detach(rt_sem_t sem); 302*10465441SEvalZero rt_sem_t rt_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag); 303*10465441SEvalZero rt_err_t rt_sem_delete(rt_sem_t sem); 304*10465441SEvalZero 305*10465441SEvalZero rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time); 306*10465441SEvalZero rt_err_t rt_sem_trytake(rt_sem_t sem); 307*10465441SEvalZero rt_err_t rt_sem_release(rt_sem_t sem); 308*10465441SEvalZero rt_err_t rt_sem_control(rt_sem_t sem, int cmd, void *arg); 309*10465441SEvalZero #endif 310*10465441SEvalZero 311*10465441SEvalZero #ifdef RT_USING_MUTEX 312*10465441SEvalZero /* 313*10465441SEvalZero * mutex interface 314*10465441SEvalZero */ 315*10465441SEvalZero rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag); 316*10465441SEvalZero rt_err_t rt_mutex_detach(rt_mutex_t mutex); 317*10465441SEvalZero rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag); 318*10465441SEvalZero rt_err_t rt_mutex_delete(rt_mutex_t mutex); 319*10465441SEvalZero 320*10465441SEvalZero rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time); 321*10465441SEvalZero rt_err_t rt_mutex_release(rt_mutex_t mutex); 322*10465441SEvalZero rt_err_t rt_mutex_control(rt_mutex_t mutex, int cmd, void *arg); 323*10465441SEvalZero #endif 324*10465441SEvalZero 325*10465441SEvalZero #ifdef RT_USING_EVENT 326*10465441SEvalZero /* 327*10465441SEvalZero * event interface 328*10465441SEvalZero */ 329*10465441SEvalZero rt_err_t rt_event_init(rt_event_t event, const char *name, rt_uint8_t flag); 330*10465441SEvalZero rt_err_t rt_event_detach(rt_event_t event); 331*10465441SEvalZero rt_event_t rt_event_create(const char *name, rt_uint8_t flag); 332*10465441SEvalZero rt_err_t rt_event_delete(rt_event_t event); 333*10465441SEvalZero 334*10465441SEvalZero rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set); 335*10465441SEvalZero rt_err_t rt_event_recv(rt_event_t event, 336*10465441SEvalZero rt_uint32_t set, 337*10465441SEvalZero rt_uint8_t opt, 338*10465441SEvalZero rt_int32_t timeout, 339*10465441SEvalZero rt_uint32_t *recved); 340*10465441SEvalZero rt_err_t rt_event_control(rt_event_t event, int cmd, void *arg); 341*10465441SEvalZero #endif 342*10465441SEvalZero 343*10465441SEvalZero #ifdef RT_USING_MAILBOX 344*10465441SEvalZero /* 345*10465441SEvalZero * mailbox interface 346*10465441SEvalZero */ 347*10465441SEvalZero rt_err_t rt_mb_init(rt_mailbox_t mb, 348*10465441SEvalZero const char *name, 349*10465441SEvalZero void *msgpool, 350*10465441SEvalZero rt_size_t size, 351*10465441SEvalZero rt_uint8_t flag); 352*10465441SEvalZero rt_err_t rt_mb_detach(rt_mailbox_t mb); 353*10465441SEvalZero rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag); 354*10465441SEvalZero rt_err_t rt_mb_delete(rt_mailbox_t mb); 355*10465441SEvalZero 356*10465441SEvalZero rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value); 357*10465441SEvalZero rt_err_t rt_mb_send_wait(rt_mailbox_t mb, 358*10465441SEvalZero rt_ubase_t value, 359*10465441SEvalZero rt_int32_t timeout); 360*10465441SEvalZero rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout); 361*10465441SEvalZero rt_err_t rt_mb_control(rt_mailbox_t mb, int cmd, void *arg); 362*10465441SEvalZero #endif 363*10465441SEvalZero 364*10465441SEvalZero #ifdef RT_USING_MESSAGEQUEUE 365*10465441SEvalZero /* 366*10465441SEvalZero * message queue interface 367*10465441SEvalZero */ 368*10465441SEvalZero rt_err_t rt_mq_init(rt_mq_t mq, 369*10465441SEvalZero const char *name, 370*10465441SEvalZero void *msgpool, 371*10465441SEvalZero rt_size_t msg_size, 372*10465441SEvalZero rt_size_t pool_size, 373*10465441SEvalZero rt_uint8_t flag); 374*10465441SEvalZero rt_err_t rt_mq_detach(rt_mq_t mq); 375*10465441SEvalZero rt_mq_t rt_mq_create(const char *name, 376*10465441SEvalZero rt_size_t msg_size, 377*10465441SEvalZero rt_size_t max_msgs, 378*10465441SEvalZero rt_uint8_t flag); 379*10465441SEvalZero rt_err_t rt_mq_delete(rt_mq_t mq); 380*10465441SEvalZero 381*10465441SEvalZero rt_err_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size); 382*10465441SEvalZero rt_err_t rt_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size); 383*10465441SEvalZero rt_err_t rt_mq_recv(rt_mq_t mq, 384*10465441SEvalZero void *buffer, 385*10465441SEvalZero rt_size_t size, 386*10465441SEvalZero rt_int32_t timeout); 387*10465441SEvalZero rt_err_t rt_mq_control(rt_mq_t mq, int cmd, void *arg); 388*10465441SEvalZero #endif 389*10465441SEvalZero 390*10465441SEvalZero /**@}*/ 391*10465441SEvalZero 392*10465441SEvalZero #ifdef RT_USING_DEVICE 393*10465441SEvalZero /** 394*10465441SEvalZero * @addtogroup Device 395*10465441SEvalZero */ 396*10465441SEvalZero 397*10465441SEvalZero /**@{*/ 398*10465441SEvalZero 399*10465441SEvalZero /* 400*10465441SEvalZero * device (I/O) system interface 401*10465441SEvalZero */ 402*10465441SEvalZero rt_device_t rt_device_find(const char *name); 403*10465441SEvalZero 404*10465441SEvalZero rt_err_t rt_device_register(rt_device_t dev, 405*10465441SEvalZero const char *name, 406*10465441SEvalZero rt_uint16_t flags); 407*10465441SEvalZero rt_err_t rt_device_unregister(rt_device_t dev); 408*10465441SEvalZero 409*10465441SEvalZero rt_device_t rt_device_create(int type, int attach_size); 410*10465441SEvalZero void rt_device_destroy(rt_device_t device); 411*10465441SEvalZero 412*10465441SEvalZero rt_err_t rt_device_init_all(void); 413*10465441SEvalZero 414*10465441SEvalZero rt_err_t 415*10465441SEvalZero rt_device_set_rx_indicate(rt_device_t dev, 416*10465441SEvalZero rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size)); 417*10465441SEvalZero rt_err_t 418*10465441SEvalZero rt_device_set_tx_complete(rt_device_t dev, 419*10465441SEvalZero rt_err_t (*tx_done)(rt_device_t dev, void *buffer)); 420*10465441SEvalZero 421*10465441SEvalZero rt_err_t rt_device_init (rt_device_t dev); 422*10465441SEvalZero rt_err_t rt_device_open (rt_device_t dev, rt_uint16_t oflag); 423*10465441SEvalZero rt_err_t rt_device_close(rt_device_t dev); 424*10465441SEvalZero rt_size_t rt_device_read (rt_device_t dev, 425*10465441SEvalZero rt_off_t pos, 426*10465441SEvalZero void *buffer, 427*10465441SEvalZero rt_size_t size); 428*10465441SEvalZero rt_size_t rt_device_write(rt_device_t dev, 429*10465441SEvalZero rt_off_t pos, 430*10465441SEvalZero const void *buffer, 431*10465441SEvalZero rt_size_t size); 432*10465441SEvalZero rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg); 433*10465441SEvalZero 434*10465441SEvalZero /**@}*/ 435*10465441SEvalZero #endif 436*10465441SEvalZero 437*10465441SEvalZero /* 438*10465441SEvalZero * interrupt service 439*10465441SEvalZero */ 440*10465441SEvalZero 441*10465441SEvalZero /* 442*10465441SEvalZero * rt_interrupt_enter and rt_interrupt_leave only can be called by BSP 443*10465441SEvalZero */ 444*10465441SEvalZero void rt_interrupt_enter(void); 445*10465441SEvalZero void rt_interrupt_leave(void); 446*10465441SEvalZero 447*10465441SEvalZero #ifdef RT_USING_SMP 448*10465441SEvalZero 449*10465441SEvalZero /* 450*10465441SEvalZero * smp cpus lock service 451*10465441SEvalZero */ 452*10465441SEvalZero 453*10465441SEvalZero rt_base_t rt_cpus_lock(void); 454*10465441SEvalZero void rt_cpus_unlock(rt_base_t level); 455*10465441SEvalZero 456*10465441SEvalZero struct rt_cpu *rt_cpu_self(void); 457*10465441SEvalZero struct rt_cpu *rt_cpu_index(int index); 458*10465441SEvalZero 459*10465441SEvalZero #endif 460*10465441SEvalZero 461*10465441SEvalZero /* 462*10465441SEvalZero * the number of nested interrupts. 463*10465441SEvalZero */ 464*10465441SEvalZero rt_uint8_t rt_interrupt_get_nest(void); 465*10465441SEvalZero 466*10465441SEvalZero #ifdef RT_USING_HOOK 467*10465441SEvalZero void rt_interrupt_enter_sethook(void (*hook)(void)); 468*10465441SEvalZero void rt_interrupt_leave_sethook(void (*hook)(void)); 469*10465441SEvalZero #endif 470*10465441SEvalZero 471*10465441SEvalZero #ifdef RT_USING_COMPONENTS_INIT 472*10465441SEvalZero void rt_components_init(void); 473*10465441SEvalZero void rt_components_board_init(void); 474*10465441SEvalZero #endif 475*10465441SEvalZero 476*10465441SEvalZero /** 477*10465441SEvalZero * @addtogroup KernelService 478*10465441SEvalZero */ 479*10465441SEvalZero 480*10465441SEvalZero /**@{*/ 481*10465441SEvalZero 482*10465441SEvalZero /* 483*10465441SEvalZero * general kernel service 484*10465441SEvalZero */ 485*10465441SEvalZero #ifndef RT_USING_CONSOLE 486*10465441SEvalZero #define rt_kprintf(...) 487*10465441SEvalZero #define rt_kputs(str) 488*10465441SEvalZero #else 489*10465441SEvalZero void rt_kprintf(const char *fmt, ...); 490*10465441SEvalZero void rt_kputs(const char *str); 491*10465441SEvalZero #endif 492*10465441SEvalZero rt_int32_t rt_vsprintf(char *dest, const char *format, va_list arg_ptr); 493*10465441SEvalZero rt_int32_t rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list args); 494*10465441SEvalZero rt_int32_t rt_sprintf(char *buf, const char *format, ...); 495*10465441SEvalZero rt_int32_t rt_snprintf(char *buf, rt_size_t size, const char *format, ...); 496*10465441SEvalZero 497*10465441SEvalZero #if defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE) 498*10465441SEvalZero rt_device_t rt_console_set_device(const char *name); 499*10465441SEvalZero rt_device_t rt_console_get_device(void); 500*10465441SEvalZero #endif 501*10465441SEvalZero 502*10465441SEvalZero rt_err_t rt_get_errno(void); 503*10465441SEvalZero void rt_set_errno(rt_err_t no); 504*10465441SEvalZero int *_rt_errno(void); 505*10465441SEvalZero #if !defined(RT_USING_NEWLIB) && !defined(_WIN32) 506*10465441SEvalZero #ifndef errno 507*10465441SEvalZero #define errno *_rt_errno() 508*10465441SEvalZero #endif 509*10465441SEvalZero #endif 510*10465441SEvalZero 511*10465441SEvalZero int __rt_ffs(int value); 512*10465441SEvalZero 513*10465441SEvalZero void *rt_memset(void *src, int c, rt_ubase_t n); 514*10465441SEvalZero void *rt_memcpy(void *dest, const void *src, rt_ubase_t n); 515*10465441SEvalZero 516*10465441SEvalZero rt_int32_t rt_strncmp(const char *cs, const char *ct, rt_ubase_t count); 517*10465441SEvalZero rt_int32_t rt_strcmp(const char *cs, const char *ct); 518*10465441SEvalZero rt_size_t rt_strlen(const char *src); 519*10465441SEvalZero char *rt_strdup(const char *s); 520*10465441SEvalZero #if defined(__CC_ARM) || defined(__CLANG_ARM) 521*10465441SEvalZero /* leak strdup interface */ 522*10465441SEvalZero char* strdup(const char* str); 523*10465441SEvalZero #endif 524*10465441SEvalZero 525*10465441SEvalZero char *rt_strstr(const char *str1, const char *str2); 526*10465441SEvalZero rt_int32_t rt_sscanf(const char *buf, const char *fmt, ...); 527*10465441SEvalZero char *rt_strncpy(char *dest, const char *src, rt_ubase_t n); 528*10465441SEvalZero void *rt_memmove(void *dest, const void *src, rt_ubase_t n); 529*10465441SEvalZero rt_int32_t rt_memcmp(const void *cs, const void *ct, rt_ubase_t count); 530*10465441SEvalZero rt_uint32_t rt_strcasecmp(const char *a, const char *b); 531*10465441SEvalZero 532*10465441SEvalZero void rt_show_version(void); 533*10465441SEvalZero 534*10465441SEvalZero #ifdef RT_DEBUG 535*10465441SEvalZero extern void (*rt_assert_hook)(const char *ex, const char *func, rt_size_t line); 536*10465441SEvalZero void rt_assert_set_hook(void (*hook)(const char *ex, const char *func, rt_size_t line)); 537*10465441SEvalZero 538*10465441SEvalZero void rt_assert_handler(const char *ex, const char *func, rt_size_t line); 539*10465441SEvalZero #endif /* RT_DEBUG */ 540*10465441SEvalZero 541*10465441SEvalZero #ifdef RT_USING_FINSH 542*10465441SEvalZero #include <finsh_api.h> 543*10465441SEvalZero #endif 544*10465441SEvalZero 545*10465441SEvalZero /**@}*/ 546*10465441SEvalZero 547*10465441SEvalZero #ifdef __cplusplus 548*10465441SEvalZero } 549*10465441SEvalZero #endif 550*10465441SEvalZero 551*10465441SEvalZero #endif 552