rtdef.h 31.8 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
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
227
 *  - MemHeap
D
dzzxzz 已提交
228
 *  - MemPool
229
 *  - Device
D
dzzxzz 已提交
230
 *  - Timer
231
 *  - Module
D
dzzxzz 已提交
232 233
 *  - Unknown
 *  - Static
234 235 236
 */
enum rt_object_class_type
{
237
    RT_Object_Class_Thread = 0,                         /**< The object is a thread.                */
238
#ifdef RT_USING_SEMAPHORE
239
    RT_Object_Class_Semaphore,                          /**< The object is a semaphore.             */
240 241
#endif
#ifdef RT_USING_MUTEX
242
    RT_Object_Class_Mutex,                              /**< The object is a mutex.                 */
243 244
#endif
#ifdef RT_USING_EVENT
245
    RT_Object_Class_Event,                              /**< The object is a event.                 */
246 247
#endif
#ifdef RT_USING_MAILBOX
248
    RT_Object_Class_MailBox,                            /**< The object is a mail box.              */
249 250
#endif
#ifdef RT_USING_MESSAGEQUEUE
251 252 253 254
    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            */
255 256
#endif
#ifdef RT_USING_MEMPOOL
257
    RT_Object_Class_MemPool,                            /**< The object is a memory pool.           */
258 259
#endif
#ifdef RT_USING_DEVICE
260
    RT_Object_Class_Device,                             /**< The object is a device                 */
261
#endif
262
    RT_Object_Class_Timer,                              /**< The object is a timer.                 */
263
#ifdef RT_USING_MODULE
264
    RT_Object_Class_Module,                             /**< The object is a module.                */
265
#endif
266 267
    RT_Object_Class_Unknown,                            /**< The object is unknown.                 */
    RT_Object_Class_Static = 0x80                       /**< The object is a static object.         */
268
};
269

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

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

290 291 292 293 294
/*@}*/

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

296 297
/*@{*/

B
bernard.xiong@gmail.com 已提交
298
/**
299 300
 * clock & timer macros
 */
D
dzzxzz 已提交
301 302 303 304
#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                         */
305

D
dzzxzz 已提交
306 307
#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. */
308

D
dzzxzz 已提交
309 310 311 312
#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               */
313

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

321
    rt_list_t list;                                     /**< the node of timer list                 */
322

323 324
    void (*timeout_func)(void *parameter);              /**< timeout function                       */
    void *parameter;                                    /**< timeout function's parameter           */
325

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

331 332 333 334 335
/*@}*/

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

337 338 339 340 341 342
/*@{*/

/*
 * Thread
 */

B
bernard.xiong@gmail.com 已提交
343 344 345
/*
 * thread state definitions
 */
D
dzzxzz 已提交
346 347 348 349 350 351
#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                      */
352

B
bernard.xiong@gmail.com 已提交
353 354 355
/**
 * thread control command definitions
 */
D
dzzxzz 已提交
356
#define RT_THREAD_CTRL_STARTUP          0x00                /**< Startup thread.                    */
D
dzzxzz 已提交
357 358 359
#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.            */
360

B
bernard.xiong@gmail.com 已提交
361 362
/**
 * Thread structure
363 364 365
 */
struct rt_thread
{
366 367 368 369 370
    /* 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 已提交
371
#ifdef RT_USING_MODULE
372
    void        *module_id;                             /**< id of application module               */
qiuyiuestc's avatar
qiuyiuestc 已提交
373
#endif
374

375 376
    rt_list_t   list;                                   /**< the object list                        */
    rt_list_t   tlist;                                  /**< the thread list                        */
377

378 379 380 381 382 383
    /* 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                             */
384

385 386
    /* error code */
    rt_err_t    error;                                  /**< error code                             */
387

388
    rt_uint8_t  stat;                                   /**< thread stat                            */
389

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

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

405 406
    rt_ubase_t  init_tick;                              /**< thread's initialized tick              */
    rt_ubase_t  remaining_tick;                         /**< remaining tick                         */
407

408
    struct rt_timer thread_timer;                       /**< built-in thread timer                   */
409

410
    void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit      */
411

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

416 417 418 419 420
/*@}*/

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

422
/*@{*/
B
bernard.xiong@gmail.com 已提交
423 424

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

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

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

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

443
    rt_list_t suspend_thread;                           /**< threads pended on this resource        */
444 445 446
};

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

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

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

467
    rt_uint16_t             value;                      /**< value of mutex                         */
468

469 470
    rt_uint8_t              original_priority;          /**< priority of last thread hold the mutex */
    rt_uint8_t              hold;                       /**< numbers of thread hold the mutex       */
471

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

#ifdef RT_USING_EVENT
B
bernard.xiong@gmail.com 已提交
478 479 480
/**
 * flag defintions in event
 */
D
dzzxzz 已提交
481 482 483
#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 已提交
484

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

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

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

506
    rt_uint32_t *msg_pool;                              /**< start address of message buffer        */
507

508
    rt_uint16_t size;                                   /**< size of message pool                   */
509

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

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

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

526
    void *msg_pool;                                     /**< start address of message queue         */
527

528 529
    rt_uint16_t msg_size;                               /**< message size of each message           */
    rt_uint16_t max_msgs;                               /**< max number of messages                 */
530

531
    rt_uint16_t entry;                                  /**< index of messages in the queue         */
532

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

540 541
/*@}*/

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

547
/*@{*/
D
dzzxzz 已提交
548

549 550 551 552
/*
 * memory management
 * heap & partition
 */
D
dzzxzz 已提交
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 585 586
/**
 * 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 已提交
587
/**
588 589 590 591
 * Base structure of Memory pool object
 */
struct rt_mempool
{
592
    struct rt_object parent;                        /**< inherit from rt_object                     */
593

594 595
    void        *start_address;                     /**< memory pool start                          */
    rt_size_t   size;                               /**< size of memory pool                        */
596

597 598
    rt_size_t   block_size;                         /**< size of memory blocks                      */
    rt_uint8_t  *block_list;                        /**< memory blocks list                         */
599

600 601
    rt_size_t   block_total_count;                  /**< numbers of memory block                    */
    rt_size_t   block_free_count;                   /**< numbers of free memory block               */
602

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

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

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

616 617
/*@{*/

B
bernard.xiong@gmail.com 已提交
618 619
/**
 * device (I/O) class type
620 621 622
 */
enum rt_device_class_type
{
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637
    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                             */
638 639
};

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

D
dzzxzz 已提交
645 646 647
#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 已提交
648

D
dzzxzz 已提交
649 650 651 652 653
#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 已提交
654

D
dzzxzz 已提交
655 656 657 658
#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 已提交
659

D
dzzxzz 已提交
660 661 662 663 664
#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 已提交
665 666 667 668

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

/**
 * special device commands
 */
D
dzzxzz 已提交
675 676 677 678 679 680
#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                                   */
681

D
dzzxzz 已提交
682
typedef struct rt_device *rt_device_t;
B
bernard.xiong@gmail.com 已提交
683 684
/**
 * Device structure
685 686 687
 */
struct rt_device
{
688 689 690 691
    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           */
692

693
    rt_uint8_t device_id;                           /* 0 - 255 */
694

695 696 697
    /* 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);
698

699 700 701 702 703 704 705
    /* 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);
706 707

#ifdef RT_USING_DEVICE_SUSPEND
708 709
    rt_err_t (*suspend) (rt_device_t dev);
    rt_err_t (*resumed) (rt_device_t dev);
710 711
#endif

712
    void *user_data;                                /**< device private data                        */
713 714
};

B
bernard.xiong@gmail.com 已提交
715 716 717
/**
 * block device geometry structure
 */
718 719
struct rt_device_blk_geometry
{
720 721 722
    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                    */
723
};
B
bernard.xiong@gmail.com 已提交
724 725

/**
D
dzzxzz 已提交
726
 * graphic device control command
B
bernard.xiong@gmail.com 已提交
727
 */
D
dzzxzz 已提交
728 729 730 731 732
#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 已提交
733 734

/* graphic deice */
D
dzzxzz 已提交
735
enum
B
bernard.xiong@gmail.com 已提交
736
{
737 738 739 740 741 742 743 744 745 746
    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 已提交
747
};
D
dzzxzz 已提交
748

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

/**
 * graphic device information structure
 */
struct rt_device_graphic_info
{
759 760 761
    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 已提交
762

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

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

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

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

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

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

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

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

B
bernard.xiong@gmail.com 已提交
801
/*@{*/
D
dzzxzz 已提交
802

qiuyiuestc's avatar
qiuyiuestc 已提交
803 804 805 806
/*
 * module system
 */

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

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

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

819 820 821 822
    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 已提交
823

qiuyiuestc's avatar
qiuyiuestc 已提交
824
#ifdef RT_USING_SLAB
825 826 827 828
    /* 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 已提交
829
#endif
qiuyiuestc's avatar
qiuyiuestc 已提交
830

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

834 835 836 837
    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 已提交
838
};
D
dzzxzz 已提交
839
typedef struct rt_module *rt_module_t;
qiuyiuestc's avatar
qiuyiuestc 已提交
840

841 842 843 844 845 846 847 848
/*@}*/
#endif

#ifdef __cplusplus
}
#endif

#endif