rtdef.h 31.7 KB
Newer Older
1 2 3
/*
 * File      : rtdef.h
 * This file is part of RT-Thread RTOS
D
dzzxzz 已提交
4
 * COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
5 6 7
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
D
dzzxzz 已提交
8
 * http://www.rt-thread.org/license/LICENSE
9 10 11 12
 *
 * Change Logs:
 * Date           Author       Notes
 * 2007-01-10     Bernard      the first version
D
dzzxzz 已提交
13
 * 2008-07-12     Bernard      remove all rt_int8, rt_uint32_t etc typedef
qiuyiuestc's avatar
qiuyiuestc 已提交
14
 * 2010-10-26     yi.qiu       add module support
15
 * 2010-11-10     Bernard      add cleanup callback function in thread exit.
B
bernard.xiong 已提交
16
 * 2011-05-09     Bernard      use builtin va_arg in GCC 4.x
17
 */
D
dzzxzz 已提交
18
 
19 20 21 22 23 24 25 26 27
#ifndef __RT_DEF_H__
#define __RT_DEF_H__

#include <rtconfig.h>

#ifdef __cplusplus
extern "C" {
#endif

B
bernard.xiong@gmail.com 已提交
28 29 30
/**
 * @addtogroup BasicDef
 */
D
dzzxzz 已提交
31

B
bernard.xiong@gmail.com 已提交
32 33
/*@{*/

qiuyiuestc's avatar
qiuyiuestc 已提交
34
/* RT-Thread version information */
D
dzzxzz 已提交
35
#define RT_VERSION                      1L      /**< major version number */
36
#define RT_SUBVERSION                   1L      /**< minor version number */
D
dzzxzz 已提交
37
#define RT_REVISION                     0L      /**< revise version number */
B
bernard.xiong@gmail.com 已提交
38

39
/* RT-Thread version */
D
dzzxzz 已提交
40
#define RTTHREAD_VERSION                ((RT_VERSION * 10000) + \
41
    (RT_SUBVERSION * 100) + RT_REVISION)
42

B
bernard.xiong@gmail.com 已提交
43
/* RT-Thread basic data type definitions */
D
dzzxzz 已提交
44 45 46 47 48 49 50
typedef signed   char                   rt_int8_t;      /**<  8bit integer type */
typedef signed   short                  rt_int16_t;     /**< 16bit integer type */
typedef signed   long                   rt_int32_t;     /**< 32bit integer type */
typedef unsigned char                   rt_uint8_t;     /**<  8bit unsigned integer type */
typedef unsigned short                  rt_uint16_t;    /**< 16bit unsigned integer type */
typedef unsigned long                   rt_uint32_t;    /**< 32bit unsigned integer type */
typedef int                             rt_bool_t;      /**< boolean type */
51 52

/* 32bit CPU */
D
dzzxzz 已提交
53 54
typedef long                            rt_base_t;      /**< Nbit CPU related date type */
typedef unsigned long                   rt_ubase_t;     /**< Nbit unsigned CPU related data type */
B
bernard.xiong@gmail.com 已提交
55

D
dzzxzz 已提交
56 57 58 59 60 61 62
typedef rt_base_t                       rt_err_t;       /**< Type for error number      */
typedef rt_uint32_t                     rt_time_t;      /**< Type for time stamp        */
typedef rt_uint32_t                     rt_tick_t;      /**< Type for tick count        */
typedef rt_base_t                       rt_flag_t;      /**< Type for flags             */
typedef rt_ubase_t                      rt_size_t;      /**< Type for size number       */
typedef rt_ubase_t                      rt_dev_t;       /**< Type for device            */
typedef rt_base_t                       rt_off_t;       /**< Type for offset            */
B
bernard.xiong@gmail.com 已提交
63

B
bernard.xiong@gmail.com 已提交
64
/* boolean type definitions */
65 66
#define RT_TRUE                         1               /**< boolean true  */
#define RT_FALSE                        0               /**< boolean fails */
D
dzzxzz 已提交
67

B
bernard.xiong@gmail.com 已提交
68
/*@}*/
69

B
bernard.xiong@gmail.com 已提交
70
/* maximum value of base type */
D
dzzxzz 已提交
71 72 73 74
#define RT_UINT8_MAX                    0xff            /* Maxium number of UINT8   */
#define RT_UINT16_MAX                   0xffff          /* Maxium number of UINT16  */
#define RT_UINT32_MAX                   0xffffffff      /* Maxium number of UINT32  */
#define RT_TICK_MAX                     RT_UINT32_MAX   /* Maxium number of tick    */
75

B
bernard.xiong 已提交
76
/* Compiler Related Definitions */
D
dzzxzz 已提交
77
#ifdef __CC_ARM                         /* ARM Compiler */
78 79 80 81 82 83 84 85 86 87 88
    #include <stdarg.h>
    #define SECTION(x)                  __attribute__((section(x)))
    #define UNUSED                      __attribute__((unused))
    #define ALIGN(n)                    __attribute__((aligned(n)))
    #define rt_inline                   static __inline
    /* module compiling */
    #ifdef RT_USING_MODULE
        #define RTT_API __declspec(dllimport)
    #else
        #define RTT_API __declspec(dllexport)
    #endif
89

D
dzzxzz 已提交
90
#elif defined (__IAR_SYSTEMS_ICC__)     /* for IAR Compiler */
91 92 93 94 95 96 97
    #include <stdarg.h>
    #define SECTION(x)                  @ x
    #define UNUSED
    #define PRAGMA(x)                   _Pragma(#x)
    #define ALIGN(n)                    PRAGMA(data_alignment=n)
    #define rt_inline                   static inline
    #define RTT_API
98

D
dzzxzz 已提交
99
#elif defined (__GNUC__)                /* GNU GCC Compiler */
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
    #ifdef RT_USING_NEWLIB
        #include <stdarg.h>
    #else
        #if __GNUC__ < 4
            typedef void *__sys_va_list;
            typedef __sys_va_list va_list;
            #define __va_rounded_size(type) \
                (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
            #define va_start(ap, lastarg)   \
                (ap = ((char *) &(lastarg) + __va_rounded_size(lastarg)))
            #define va_end(ap)  ((void)0)
            /*  little endian */
            #define va_arg(ap, type)    \
                (ap = (__sys_va_list) ((char *)(ap) + __va_rounded_size(type)),  \
                *((type *) (void *) ((char *)(ap) - __va_rounded_size(type))))
        #else
            typedef __builtin_va_list __gnuc_va_list;
            typedef __gnuc_va_list va_list;
            #define va_start(v,l)   __builtin_va_start(v,l)
            #define va_end(v)       __builtin_va_end(v)
            #define va_arg(v,l)     __builtin_va_arg(v,l)
        #endif
    #endif

    #define SECTION(x)                  __attribute__((section(x)))
    #define UNUSED                      __attribute__((unused))
    #define ALIGN(n)                    __attribute__((aligned(n)))
    #define rt_inline                   static __inline
    #define RTT_API
129 130
#endif

D
dzzxzz 已提交
131 132
/* event length */
#define RT_EVENT_LENGTH                 32
133 134

/* memory management option */
D
dzzxzz 已提交
135 136 137
#define RT_MM_PAGE_SIZE                 4096
#define RT_MM_PAGE_MASK                 (RT_MM_PAGE_SIZE - 1)
#define RT_MM_PAGE_BITS                 12
138 139 140 141

/**
 * @addtogroup Error
 */
D
dzzxzz 已提交
142

143
/*@{*/
D
dzzxzz 已提交
144

B
bernard.xiong@gmail.com 已提交
145
/* RT-Thread error code definitions */
D
dzzxzz 已提交
146 147 148 149 150 151 152
#define RT_EOK                          0               /**< There is no error       */
#define RT_ERROR                        1               /**< A generic error happens */
#define RT_ETIMEOUT                     2               /**< Timed out               */
#define RT_EFULL                        3               /**< The resource is full    */
#define RT_EEMPTY                       4               /**< The resource is empty   */
#define RT_ENOMEM                       5               /**< No memory               */
#define RT_ENOSYS                       6               /**< No system               */
qiuyiuestc's avatar
qiuyiuestc 已提交
153
#define RT_EBUSY                        7               /**< Busy                    */
154
#define RT_EIO                          8               /**< IO error                */
D
dzzxzz 已提交
155

156 157 158
/*@}*/

/**
B
bernard.xiong@gmail.com 已提交
159 160
 * @ingroup BasicDef
 *
161 162
 * @def RT_ALIGN(size, align)
 * Return the most contiguous size aligned at specified width. RT_ALIGN(13, 4)
163
 * would return 16.
B
bernard.xiong@gmail.com 已提交
164
 */
D
dzzxzz 已提交
165
#define RT_ALIGN(size, align)           (((size) + (align) - 1) & ~((align) - 1))
D
dzzxzz 已提交
166

B
bernard.xiong@gmail.com 已提交
167 168
/**
 * @ingroup BasicDef
169 170 171 172
 *
 * @def RT_ALIGN_DOWN(size, align)
 * Return the down number of aligned at specified width. RT_ALIGN_DOWN(13, 4)
 * would return 12. 
173
 */
D
dzzxzz 已提交
174
#define RT_ALIGN_DOWN(size, align)      ((size) & ~((align) - 1))
175 176

/**
B
bernard.xiong@gmail.com 已提交
177 178
 * @ingroup BasicDef
 *
179 180 181
 * @def RT_NULL
 * Similar as the \c NULL in C library.
 */
D
dzzxzz 已提交
182
#define RT_NULL                         ((void *)0)
183 184 185

struct rt_list_node
{
186 187
    struct rt_list_node                 *next;          /* point to next node. */
    struct rt_list_node                 *prev;          /* point to prev node. */
188
};
D
dzzxzz 已提交
189
typedef struct rt_list_node rt_list_t;                  /* Type for lists.     */
190 191 192 193

/**
 * @addtogroup KernelObject
 */
D
dzzxzz 已提交
194

195
/*@{*/
qiuyiuestc's avatar
qiuyiuestc 已提交
196 197 198 199

/*
 * kernel object macros
 */
D
dzzxzz 已提交
200
#define RT_OBJECT_FLAG_MODULE           0x80            /* is module object.   */
qiuyiuestc's avatar
qiuyiuestc 已提交
201

B
bernard.xiong@gmail.com 已提交
202
/**
203 204 205 206
 * Base structure of Kernel object
 */
struct rt_object
{
207 208 209
    char        name[RT_NAME_MAX];                      /**< name of kernel object      */
    rt_uint8_t  type;                                   /**< type of kernel object      */
    rt_uint8_t  flag;                                   /**< flag of kernel object      */
qiuyiuestc's avatar
qiuyiuestc 已提交
210

B
bernard.xiong@gmail.com 已提交
211
#ifdef RT_USING_MODULE
212
    void        *module_id;                             /**< id of application module   */
B
bernard.xiong@gmail.com 已提交
213
#endif
214
    rt_list_t   list;                                   /**< list node of kernel object */
215
};
D
dzzxzz 已提交
216 217 218 219 220 221 222 223 224 225 226 227
typedef struct rt_object *rt_object_t;                  /* Type for kernel objects.     */

/**
 *  The object type can be one of the follows with specific
 *  macros enabled:
 *  - Thread
 *  - Semaphore
 *  - Mutex
 *  - Event
 *  - MailBox
 *  - MessageQueue
 *  - MemPool
228
 *  - Device
D
dzzxzz 已提交
229 230 231
 *  - Timer
 *  - Unknown
 *  - Static
232 233 234
 */
enum rt_object_class_type
{
235
    RT_Object_Class_Thread = 0,                         /**< The object is a thread.                */
236
#ifdef RT_USING_SEMAPHORE
237
    RT_Object_Class_Semaphore,                          /**< The object is a semaphore.             */
238 239
#endif
#ifdef RT_USING_MUTEX
240
    RT_Object_Class_Mutex,                              /**< The object is a mutex.                 */
241 242
#endif
#ifdef RT_USING_EVENT
243
    RT_Object_Class_Event,                              /**< The object is a event.                 */
244 245
#endif
#ifdef RT_USING_MAILBOX
246
    RT_Object_Class_MailBox,                            /**< The object is a mail box.              */
247 248
#endif
#ifdef RT_USING_MESSAGEQUEUE
249 250 251 252
    RT_Object_Class_MessageQueue,                       /**< The object is a message queue.         */
#endif
#ifdef RT_USING_MEMHEAP
    RT_Object_Class_MemHeap,                            /**< The object is a memory heap            */
253 254
#endif
#ifdef RT_USING_MEMPOOL
255
    RT_Object_Class_MemPool,                            /**< The object is a memory pool.           */
256 257
#endif
#ifdef RT_USING_DEVICE
258
    RT_Object_Class_Device,                             /**< The object is a device                 */
259
#endif
260
    RT_Object_Class_Timer,                              /**< The object is a timer.                 */
261
#ifdef RT_USING_MODULE
262
    RT_Object_Class_Module,                             /**< The object is a module.                */
263
#endif
264 265
    RT_Object_Class_Unknown,                            /**< The object is unknown.                 */
    RT_Object_Class_Static = 0x80                       /**< The object is a static object.         */
266
};
267

B
bernard.xiong@gmail.com 已提交
268 269
/**
 * The information of the kernel object
270 271 272
 */
struct rt_object_information
{
273 274 275
    enum rt_object_class_type type;                     /**< object class type                      */
    rt_list_t object_list;                              /**< object list                            */
    rt_size_t object_size;                              /**< object size                            */
276
};
277 278 279 280 281

/**
 * The hook function call macro
 */
#ifdef RT_USING_HOOK
282 283
#define RT_OBJECT_HOOK_CALL(func, argv) \
    do { if ((func) != RT_NULL) func argv; } while (0)
284
#else
285
#define RT_OBJECT_HOOK_CALL(func, argv) 
286 287
#endif

288 289 290 291 292
/*@}*/

/**
 * @addtogroup Clock
 */
D
dzzxzz 已提交
293

294 295
/*@{*/

B
bernard.xiong@gmail.com 已提交
296
/**
297 298
 * clock & timer macros
 */
D
dzzxzz 已提交
299 300 301 302
#define RT_TIMER_FLAG_DEACTIVATED       0x0             /**< timer is deactive                      */
#define RT_TIMER_FLAG_ACTIVATED         0x1             /**< timer is active                        */
#define RT_TIMER_FLAG_ONE_SHOT          0x0             /**< one shot timer                         */
#define RT_TIMER_FLAG_PERIODIC          0x2             /**< periodic timer                         */
303

D
dzzxzz 已提交
304 305
#define RT_TIMER_FLAG_HARD_TIMER        0x0             /**< hard timer,the timer's callback function will be called in tick isr.     */
#define RT_TIMER_FLAG_SOFT_TIMER        0x4             /**< soft timer,the timer's callback function will be called in timer thread. */
306

D
dzzxzz 已提交
307 308 309 310
#define RT_TIMER_CTRL_SET_TIME          0x0             /**< set timer control command              */
#define RT_TIMER_CTRL_GET_TIME          0x1             /**< get timer control command              */
#define RT_TIMER_CTRL_SET_ONESHOT       0x2             /**< change timer to one shot               */
#define RT_TIMER_CTRL_SET_PERIODIC      0x3             /**< change timer to periodic               */
311

B
bernard.xiong@gmail.com 已提交
312
/**
313 314 315 316
 * timer structure
 */
struct rt_timer
{
317
    struct rt_object parent;                            /**< inherit from rt_object                 */
318

319
    rt_list_t list;                                     /**< the node of timer list                 */
320

321 322
    void (*timeout_func)(void *parameter);              /**< timeout function                       */
    void *parameter;                                    /**< timeout function's parameter           */
323

324 325
    rt_tick_t init_tick;                                /**< timer timeout tick                     */
    rt_tick_t timeout_tick;                             /**< timeout tick                           */
326
};
D
dzzxzz 已提交
327
typedef struct rt_timer *rt_timer_t;
D
dzzxzz 已提交
328

329 330 331 332 333
/*@}*/

/**
 * @addtogroup Thread
 */
D
dzzxzz 已提交
334

335 336 337 338 339 340
/*@{*/

/*
 * Thread
 */

B
bernard.xiong@gmail.com 已提交
341 342 343
/*
 * thread state definitions
 */
D
dzzxzz 已提交
344 345 346 347 348 349
#define RT_THREAD_INIT                  0x00                /**< Initialized status                 */
#define RT_THREAD_READY                 0x01                /**< Ready status                       */
#define RT_THREAD_SUSPEND               0x02                /**< Suspend status                     */
#define RT_THREAD_RUNNING               0x03                /**< Running status                     */
#define RT_THREAD_BLOCK                 RT_THREAD_SUSPEND   /**< Blocked status                     */
#define RT_THREAD_CLOSE                 0x04                /**< Closed status                      */
350

B
bernard.xiong@gmail.com 已提交
351 352 353
/**
 * thread control command definitions
 */
D
dzzxzz 已提交
354
#define RT_THREAD_CTRL_STARTUP          0x00                /**< Startup thread.                    */
D
dzzxzz 已提交
355 356 357
#define RT_THREAD_CTRL_CLOSE            0x01                /**< Close thread.                      */
#define RT_THREAD_CTRL_CHANGE_PRIORITY  0x02                /**< Change thread priority.            */
#define RT_THREAD_CTRL_INFO             0x03                /**< Get thread information.            */
358

B
bernard.xiong@gmail.com 已提交
359 360
/**
 * Thread structure
361 362 363
 */
struct rt_thread
{
364 365 366 367 368
    /* rt object */
    char        name[RT_NAME_MAX];                      /**< the name of thread                     */
    rt_uint8_t  type;                                   /**< type of object                         */
    rt_uint8_t  flags;                                  /**< thread's flags                         */
    
qiuyiuestc's avatar
qiuyiuestc 已提交
369
#ifdef RT_USING_MODULE
370
    void        *module_id;                             /**< id of application module               */
qiuyiuestc's avatar
qiuyiuestc 已提交
371
#endif
372

373 374
    rt_list_t   list;                                   /**< the object list                        */
    rt_list_t   tlist;                                  /**< the thread list                        */
375

376 377 378 379 380 381
    /* stack point and entry */
    void        *sp;                                    /**< stack point                            */
    void        *entry;                                 /**< entry                                  */
    void        *parameter;                             /**< parameter                              */
    void        *stack_addr;                            /**< stack address                          */
    rt_uint16_t stack_size;                             /**< stack size                             */
382

383 384
    /* error code */
    rt_err_t    error;                                  /**< error code                             */
385

386
    rt_uint8_t  stat;                                   /**< thread stat                            */
387

388 389 390
    /* priority */
    rt_uint8_t  current_priority;                       /**< current priority                       */
    rt_uint8_t  init_priority;                          /**< initialized priority                   */
391
#if RT_THREAD_PRIORITY_MAX > 32
392 393
    rt_uint8_t  number;
    rt_uint8_t  high_mask;
394
#endif
395
    rt_uint32_t number_mask;
396

B
bernard.xiong 已提交
397
#if defined(RT_USING_EVENT)
398 399 400
    /* thread event */
    rt_uint32_t event_set;
    rt_uint8_t  event_info;
401 402
#endif

403 404
    rt_ubase_t  init_tick;                              /**< thread's initialized tick              */
    rt_ubase_t  remaining_tick;                         /**< remaining tick                         */
405

406
    struct rt_timer thread_timer;                       /**< built-in thread timer                   */
407

408
    void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit      */
409

410
    rt_uint32_t user_data;                              /**< private user data beyond this thread  */
411
};
D
dzzxzz 已提交
412 413
typedef struct rt_thread *rt_thread_t;

414 415 416 417 418
/*@}*/

/**
 * @addtogroup IPC
 */
D
dzzxzz 已提交
419

420
/*@{*/
B
bernard.xiong@gmail.com 已提交
421 422

/**
B
bernard.xiong@gmail.com 已提交
423
 * IPC flags and control command definitions
424
 */
D
dzzxzz 已提交
425 426
#define RT_IPC_FLAG_FIFO                0x00            /**< FIFOed IPC. @ref IPC.                  */
#define RT_IPC_FLAG_PRIO                0x01            /**< PRIOed IPC. @ref IPC.                  */
427

D
dzzxzz 已提交
428 429
#define RT_IPC_CMD_UNKNOWN              0x00            /**< unknown IPC command                    */
#define RT_IPC_CMD_RESET                0x01            /**< reset IPC object                       */
430

D
dzzxzz 已提交
431 432
#define RT_WAITING_FOREVER              -1              /**< Block forever until get resource.      */
#define RT_WAITING_NO                   0               /**< Non-block.                             */
433

B
bernard.xiong@gmail.com 已提交
434
/**
435 436 437 438
 * Base structure of IPC object
 */
struct rt_ipc_object
{
439
    struct rt_object parent;                            /**< inherit from rt_object                 */
440

441
    rt_list_t suspend_thread;                           /**< threads pended on this resource        */
442 443 444
};

#ifdef RT_USING_SEMAPHORE
B
bernard.xiong@gmail.com 已提交
445 446
/**
 * Semaphore structure
447 448 449
 */
struct rt_semaphore
{
450
    struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
451

452
    rt_uint16_t value;                                  /**< value of semaphore.                    */
453
};
D
dzzxzz 已提交
454
typedef struct rt_semaphore *rt_sem_t;
455 456 457
#endif

#ifdef RT_USING_MUTEX
B
bernard.xiong@gmail.com 已提交
458 459
/**
 * Mutual exclusion (mutex) structure
460 461 462
 */
struct rt_mutex
{
463
    struct rt_ipc_object    parent;                     /**< inherit from ipc_object                */
464

465
    rt_uint16_t             value;                      /**< value of mutex                         */
466

467 468
    rt_uint8_t              original_priority;          /**< priority of last thread hold the mutex */
    rt_uint8_t              hold;                       /**< numbers of thread hold the mutex       */
469

470
    struct rt_thread        *owner;                     /**< current owner of mutex                 */
471
};
D
dzzxzz 已提交
472
typedef struct rt_mutex *rt_mutex_t;
473 474 475
#endif

#ifdef RT_USING_EVENT
B
bernard.xiong@gmail.com 已提交
476 477 478
/**
 * flag defintions in event
 */
D
dzzxzz 已提交
479 480 481
#define RT_EVENT_FLAG_AND               0x01            /**< logic and                              */
#define RT_EVENT_FLAG_OR                0x02            /**< logic or                               */
#define RT_EVENT_FLAG_CLEAR             0x04            /**< clear flag                             */
B
bernard.xiong@gmail.com 已提交
482

483
/*
B
bernard.xiong@gmail.com 已提交
484
 * event structure
485 486 487
 */
struct rt_event
{
488
    struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
489

490
    rt_uint32_t set;                                    /**< event set                              */
491
};
D
dzzxzz 已提交
492
typedef struct rt_event *rt_event_t;
493 494 495
#endif

#ifdef RT_USING_MAILBOX
B
bernard.xiong@gmail.com 已提交
496 497
/**
 * mailbox structure
498 499 500 501
 *
 */
struct rt_mailbox
{
502
    struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
503

504
    rt_uint32_t *msg_pool;                              /**< start address of message buffer        */
505

506
    rt_uint16_t size;                                   /**< size of message pool                   */
507

508 509
    rt_uint16_t entry;                                  /**< index of messages in msg_pool          */
    rt_uint16_t in_offset, out_offset;                  /**< in/output offset of the message buffer */
510

511
    rt_list_t suspend_sender_thread;                    /**< sender thread suspended on this mailbox */
512
};
D
dzzxzz 已提交
513
typedef struct rt_mailbox *rt_mailbox_t;
514 515 516
#endif

#ifdef RT_USING_MESSAGEQUEUE
B
bernard.xiong@gmail.com 已提交
517 518
/**
 * message queue structure
519 520 521
 */
struct rt_messagequeue
{
522
    struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
523

524
    void *msg_pool;                                     /**< start address of message queue         */
525

526 527
    rt_uint16_t msg_size;                               /**< message size of each message           */
    rt_uint16_t max_msgs;                               /**< max number of messages                 */
528

529
    rt_uint16_t entry;                                  /**< index of messages in the queue         */
530

531 532 533
    void *msg_queue_head;                               /**< list head                              */
    void *msg_queue_tail;                               /**< list tail                              */
    void *msg_queue_free;                               /**< pointer indicated the free node of queue */
534
};
D
dzzxzz 已提交
535
typedef struct rt_messagequeue *rt_mq_t;
536
#endif
D
dzzxzz 已提交
537

538 539
/*@}*/

D
dzzxzz 已提交
540
#ifdef RT_USING_MEMPOOL
541 542 543
/**
 * @addtogroup MM
 */
D
dzzxzz 已提交
544

545
/*@{*/
D
dzzxzz 已提交
546

547 548 549 550
/*
 * memory management
 * heap & partition
 */
D
dzzxzz 已提交
551

552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
/**
 * memory item on the heap
 */
struct rt_memheap_item
{
    rt_uint32_t magic;
    struct rt_memheap_item *next, *prev;
    struct rt_memheap_item *next_free, *prev_free;

    struct rt_memheap* pool_ptr;
};

/**
 * Base structure of memory heap object
 */
struct rt_memheap
{
    struct rt_object parent;

    /* pool start address and size */
    void *start_addr;

    rt_uint32_t pool_size;
    rt_uint32_t available_size;

    /* used block list */
    struct rt_memheap_item* block_list;

    /* free block list and free block list header */
    struct rt_memheap_item* free_list;
    struct rt_memheap_item  free_header;
};

B
bernard.xiong@gmail.com 已提交
585
/**
586 587 588 589
 * Base structure of Memory pool object
 */
struct rt_mempool
{
590
    struct rt_object parent;                        /**< inherit from rt_object                     */
591

592 593
    void        *start_address;                     /**< memory pool start                          */
    rt_size_t   size;                               /**< size of memory pool                        */
594

595 596
    rt_size_t   block_size;                         /**< size of memory blocks                      */
    rt_uint8_t  *block_list;                        /**< memory blocks list                         */
597

598 599
    rt_size_t   block_total_count;                  /**< numbers of memory block                    */
    rt_size_t   block_free_count;                   /**< numbers of free memory block               */
600

601 602
    rt_list_t   suspend_thread;                     /**< threads pended on this resource            */
    rt_size_t   suspend_thread_count;               /**< numbers of thread pended on this resource  */
603
};
D
dzzxzz 已提交
604
typedef struct rt_mempool *rt_mp_t;
D
dzzxzz 已提交
605

606
/*@}*/
D
dzzxzz 已提交
607
#endif
608 609 610 611 612

#ifdef RT_USING_DEVICE
/**
 * @addtogroup Device
 */
D
dzzxzz 已提交
613

614 615
/*@{*/

B
bernard.xiong@gmail.com 已提交
616 617
/**
 * device (I/O) class type
618 619 620
 */
enum rt_device_class_type
{
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
    RT_Device_Class_Char = 0,                       /**< character device                           */
    RT_Device_Class_Block,                          /**< block device                               */
    RT_Device_Class_NetIf,                          /**< net interface                              */
    RT_Device_Class_MTD,                            /**< memory device                              */
    RT_Device_Class_CAN,                            /**< CAN device                                 */
    RT_Device_Class_RTC,                            /**< RTC device                                 */
    RT_Device_Class_Sound,                          /**< Sound device                               */
    RT_Device_Class_Graphic,                        /**< Graphic device                             */
    RT_Device_Class_I2C,                            /**< I2C device                                 */
    RT_Device_Class_USBDevice,                      /**< USB slave device                           */
    RT_Device_Class_USBHost,                        /**< USB host bus                               */
    RT_Device_Class_SPIBUS,                         /**< SPI bus device                             */
    RT_Device_Class_SPIDevice,                      /**< SPI device                                 */
    RT_Device_Class_SDIO,                           /**< SDIO bus device                            */
    RT_Device_Class_Unknown                         /**< unknown device                             */
636 637
};

B
bernard.xiong@gmail.com 已提交
638 639 640
/**
 * device flags defitions
 */
D
dzzxzz 已提交
641
#define RT_DEVICE_FLAG_DEACTIVATE       0x000       /**< device is not not initialized              */
B
bernard.xiong@gmail.com 已提交
642

D
dzzxzz 已提交
643 644 645
#define RT_DEVICE_FLAG_RDONLY           0x001       /**< read only                                  */
#define RT_DEVICE_FLAG_WRONLY           0x002       /**< write only                                 */
#define RT_DEVICE_FLAG_RDWR             0x003       /**< read and write                             */
B
bernard.xiong@gmail.com 已提交
646

D
dzzxzz 已提交
647 648 649 650 651
#define RT_DEVICE_FLAG_REMOVABLE        0x004       /**< removable device                           */
#define RT_DEVICE_FLAG_STANDALONE       0x008       /**< standalone device                          */
#define RT_DEVICE_FLAG_ACTIVATED        0x010       /**< device is activated                        */
#define RT_DEVICE_FLAG_SUSPENDED        0x020       /**< device is suspended                        */
#define RT_DEVICE_FLAG_STREAM           0x040       /**< stream mode                                */
B
bernard.xiong@gmail.com 已提交
652

D
dzzxzz 已提交
653 654 655 656
#define RT_DEVICE_FLAG_INT_RX           0x100       /**< INT mode on Rx                             */
#define RT_DEVICE_FLAG_DMA_RX           0x200       /**< DMA mode on Rx                             */
#define RT_DEVICE_FLAG_INT_TX           0x400       /**< INT mode on Tx                             */
#define RT_DEVICE_FLAG_DMA_TX           0x800       /**< DMA mode on Tx                             */
B
bernard.xiong@gmail.com 已提交
657

D
dzzxzz 已提交
658 659 660 661 662
#define RT_DEVICE_OFLAG_CLOSE           0x000       /**< device is closed                           */
#define RT_DEVICE_OFLAG_RDONLY          0x001       /**< read only access                           */
#define RT_DEVICE_OFLAG_WRONLY          0x002       /**< write only access                          */
#define RT_DEVICE_OFLAG_RDWR            0x003       /**< read and write                             */
#define RT_DEVICE_OFLAG_OPEN            0x008       /**< device is opened                           */
B
bernard.xiong@gmail.com 已提交
663 664 665 666

/**
 * general device commands
 */
D
dzzxzz 已提交
667 668
#define RT_DEVICE_CTRL_RESUME           0x01        /**< resume device                              */
#define RT_DEVICE_CTRL_SUSPEND          0x02        /**< suspend device                             */
B
bernard.xiong@gmail.com 已提交
669 670 671 672

/**
 * special device commands
 */
D
dzzxzz 已提交
673 674 675 676 677 678
#define RT_DEVICE_CTRL_CHAR_STREAM      0x10        /**< stream mode on char device                 */
#define RT_DEVICE_CTRL_BLK_GETGEOME     0x10        /**< get geometry information                   */
#define RT_DEVICE_CTRL_NETIF_GETMAC     0x10        /**< get mac address                            */
#define RT_DEVICE_CTRL_MTD_FORMAT       0x10        /**< format a MTD device                        */
#define RT_DEVICE_CTRL_RTC_GET_TIME     0x10        /**< get time                                   */
#define RT_DEVICE_CTRL_RTC_SET_TIME     0x11        /**< set time                                   */
679

D
dzzxzz 已提交
680
typedef struct rt_device *rt_device_t;
B
bernard.xiong@gmail.com 已提交
681 682
/**
 * Device structure
683 684 685
 */
struct rt_device
{
686 687 688 689
    struct rt_object parent;                        /**< inherit from rt_object                     */

    enum rt_device_class_type type;                 /**< device type                                */
    rt_uint16_t flag, open_flag;                    /**< device flag and device open flag           */
690

691
    rt_uint8_t device_id;                           /* 0 - 255 */
692

693 694 695
    /* device call back */
    rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
    rt_err_t (*tx_complete)(rt_device_t dev, void* buffer);
696

697 698 699 700 701 702 703
    /* common device interface */
    rt_err_t  (*init)   (rt_device_t dev);
    rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);
    rt_err_t  (*close)  (rt_device_t dev);
    rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
    rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
    rt_err_t  (*control)(rt_device_t dev, rt_uint8_t cmd, void *args);
704 705

#ifdef RT_USING_DEVICE_SUSPEND
706 707
    rt_err_t (*suspend) (rt_device_t dev);
    rt_err_t (*resumed) (rt_device_t dev);
708 709
#endif

710
    void *user_data;                                /**< device private data                        */
711 712
};

B
bernard.xiong@gmail.com 已提交
713 714 715
/**
 * block device geometry structure
 */
716 717
struct rt_device_blk_geometry
{
718 719 720
    rt_uint32_t sector_count;                       /**< count of sectors                           */
    rt_uint32_t bytes_per_sector;                   /**< number of bytes per sector                 */
    rt_uint32_t block_size;                         /**< size to erase one block                    */
721
};
B
bernard.xiong@gmail.com 已提交
722 723

/**
D
dzzxzz 已提交
724
 * graphic device control command
B
bernard.xiong@gmail.com 已提交
725
 */
D
dzzxzz 已提交
726 727 728 729 730
#define RTGRAPHIC_CTRL_RECT_UPDATE  0
#define RTGRAPHIC_CTRL_POWERON      1
#define RTGRAPHIC_CTRL_POWEROFF     2
#define RTGRAPHIC_CTRL_GET_INFO     3
#define RTGRAPHIC_CTRL_SET_MODE     4
B
bernard.xiong@gmail.com 已提交
731 732

/* graphic deice */
D
dzzxzz 已提交
733
enum
B
bernard.xiong@gmail.com 已提交
734
{
735 736 737 738 739 740 741 742 743 744
    RTGRAPHIC_PIXEL_FORMAT_MONO = 0,
    RTGRAPHIC_PIXEL_FORMAT_GRAY4,
    RTGRAPHIC_PIXEL_FORMAT_GRAY16,
    RTGRAPHIC_PIXEL_FORMAT_RGB332,
    RTGRAPHIC_PIXEL_FORMAT_RGB444,
    RTGRAPHIC_PIXEL_FORMAT_RGB565,
    RTGRAPHIC_PIXEL_FORMAT_RGB565P,
    RTGRAPHIC_PIXEL_FORMAT_RGB666,
    RTGRAPHIC_PIXEL_FORMAT_RGB888,
    RTGRAPHIC_PIXEL_FORMAT_ARGB888
B
bernard.xiong@gmail.com 已提交
745
};
D
dzzxzz 已提交
746

B
bernard.xiong@gmail.com 已提交
747 748 749
/**
 * build a pixel position according to (x, y) coordinates.
 */
750
#define RTGRAPHIC_PIXEL_POSITION(x, y)  ((x << 16) | y)
B
bernard.xiong@gmail.com 已提交
751 752 753 754 755 756

/**
 * graphic device information structure
 */
struct rt_device_graphic_info
{
757 758 759
    rt_uint8_t  pixel_format;       /**< graphic format           */
    rt_uint8_t  bits_per_pixel;     /**< bits per pixel           */
    rt_uint16_t reserved;           /**< reserved field           */
B
bernard.xiong@gmail.com 已提交
760

761 762
    rt_uint16_t width;              /**< width of graphic device  */
    rt_uint16_t height;             /**< height of graphic device */
B
bernard.xiong@gmail.com 已提交
763

764
    rt_uint8_t *framebuffer;        /**< frame buffer             */
B
bernard.xiong@gmail.com 已提交
765 766 767 768 769 770 771
};

/**
 * rectangle information structure
 */
struct rt_device_rect_info
{
772 773
    rt_uint16_t x, y;               /**< x, y coordinate          */
    rt_uint16_t width, height;      /**< width and height         */
B
bernard.xiong@gmail.com 已提交
774
};
775 776 777 778 779 780

/**
 * graphic operations
 */
struct rt_device_graphic_ops
{
781 782
    void (*set_pixel) (const char *pixel, int x, int y);
    void (*get_pixel) (char *pixel, int x, int y);
783

784 785
    void (*draw_hline)(const char *pixel, int x1, int x2, int y);
    void (*draw_vline)(const char *pixel, int x, int y1, int y2);
786

787
    void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);
788
};
D
dzzxzz 已提交
789
#define rt_graphix_ops(device)    ((struct rt_device_graphic_ops *)(device->user_data))
D
dzzxzz 已提交
790

B
bernard.xiong@gmail.com 已提交
791
/*@}*/
D
dzzxzz 已提交
792
#endif
793

D
dzzxzz 已提交
794
#ifdef RT_USING_MODULE
B
bernard.xiong@gmail.com 已提交
795 796 797
/**
 * @addtogroup Module
 */
D
dzzxzz 已提交
798

B
bernard.xiong@gmail.com 已提交
799
/*@{*/
D
dzzxzz 已提交
800

qiuyiuestc's avatar
qiuyiuestc 已提交
801 802 803 804
/*
 * module system
 */

D
dzzxzz 已提交
805 806
#define RT_MODULE_FLAG_WITHENTRY        0x00        /* with entry point                             */
#define RT_MODULE_FLAG_WITHOUTENTRY     0x01        /* without entry point                          */
qiuyiuestc's avatar
qiuyiuestc 已提交
807

B
bernard.xiong@gmail.com 已提交
808 809 810
/**
 * Application Module structure
 */
qiuyiuestc's avatar
qiuyiuestc 已提交
811 812
struct rt_module
{
813
    struct rt_object parent;                        /**< inherit from object                        */
qiuyiuestc's avatar
qiuyiuestc 已提交
814

815
    rt_uint8_t  *module_space;                      /**< module memory space                        */
qiuyiuestc's avatar
qiuyiuestc 已提交
816

817 818 819 820
    void        *module_entry;                      /**< entry address of module's thread           */
    rt_thread_t module_thread;                      /**< stack size of module's thread              */
    rt_uint32_t stack_size;                         /**< priority of module's thread                */
    rt_uint32_t thread_priority;
qiuyiuestc's avatar
qiuyiuestc 已提交
821

qiuyiuestc's avatar
qiuyiuestc 已提交
822
#ifdef RT_USING_SLAB
823 824 825 826
    /* module memory allocator */
    void        *mem_list;                          /**< module's free memory list                  */
    void        *page_array;                        /**< module's using pages                       */
    rt_uint32_t page_cnt;                           /**< module's using pages count                 */
qiuyiuestc's avatar
qiuyiuestc 已提交
827
#endif
qiuyiuestc's avatar
qiuyiuestc 已提交
828

829 830
    rt_uint32_t nsym;                               /**< number of symbol in the module             */
    struct rt_module_symtab *symtab;                /**< module symbol table                        */
qiuyiuestc's avatar
qiuyiuestc 已提交
831

832 833 834 835
    rt_uint32_t nref;                               /**< reference count                            */
    
    /**< object in this module, module object is the last basic object type */
    struct rt_object_information module_object[RT_Object_Class_Unknown];
qiuyiuestc's avatar
qiuyiuestc 已提交
836
};
D
dzzxzz 已提交
837
typedef struct rt_module *rt_module_t;
qiuyiuestc's avatar
qiuyiuestc 已提交
838

839 840 841 842 843 844 845 846
/*@}*/
#endif

#ifdef __cplusplus
}
#endif

#endif