picoos.h

Go to the documentation of this file.
00001 /*
00002  * License:  Modified BSD license, see documentation below.
00003  *
00004  * This file is originally from the pico]OS realtime operating system
00005  * (http://picoos.sourceforge.net).
00006  *
00007  * CVS-ID $Id: picoos.h,v 1.27 2007/12/08 13:49:21 dkuschel Exp $
00008  *
00009  */
00010 
00244 #ifndef _PICOOS_H
00245 #define _PICOOS_H
00246 
00247 
00248 #define POS_VER_N           0x0101
00249 #define POS_VER_S           "1.0.1"
00250 #define POS_COPYRIGHT       "(c) 2004-2007, D.Kuschel"
00251 #define POS_STARTUPSTRING   "pico]OS " POS_VER_S "  " POS_COPYRIGHT
00252 
00253 #ifndef NULL
00254 #ifndef _HAVE_NULL
00255 #define _HAVE_NULL
00256 #define NULL ((void*)0)
00257 #endif
00258 #endif
00259 
00260 #ifndef DOX
00261 #define DOX  0
00262 #endif
00263 #if DOX==0
00264 
00265 #ifndef _POSPACK
00266 #ifdef __MYCPU__
00267 #define PICOSUBDIR  1
00268 #endif
00269 #endif
00270 
00271 #ifdef PICOSUBDIR
00272 /* required because of stupid CC65 compiler */
00273 #include <picoos/port.h>
00274 #include <picoos/poscfg.h>
00275 #else
00276 #include <port.h>
00277 #include <poscfg.h>
00278 #endif
00279 
00280 
00281 /*---------------------------------------------------------------------------
00282  *  CONFIGURATION
00283  *-------------------------------------------------------------------------*/
00284 
00285 /* test if all needed parameters are set */
00286 #ifndef MVAR_t
00287 #error  MVAR_t not defined
00288 #endif
00289 #ifndef MVAR_BITS
00290 #error  MVAR_BITS not defined
00291 #endif
00292 #ifndef POSCFG_ALIGNMENT
00293 #error  POSCFG_ALIGNMENT not defined
00294 #endif
00295 #ifndef POSCFG_MAX_PRIO_LEVEL
00296 #error  POSCFG_MAX_PRIO_LEVEL not defined
00297 #endif
00298 #ifndef POSCFG_MAX_TASKS
00299 #error  POSCFG_MAX_TASKS not defined
00300 #endif
00301 #ifndef POSCFG_MAX_EVENTS
00302 #error  POSCFG_MAX_EVENTS not defined
00303 #endif
00304 #ifndef POSCFG_MAX_MESSAGES
00305 #error  POSCFG_MAX_MESSAGES not defined
00306 #endif
00307 #ifndef POSCFG_MAX_TIMER
00308 #error  POSCFG_MAX_TIMER not defined
00309 #endif
00310 #ifndef POSCFG_SOFT_MTASK
00311 #error  POSCFG_SOFT_MTASK not defined
00312 #endif
00313 #ifndef POSCFG_CTXSW_COMBINE
00314 #error  POSCFG_CTXSW_COMBINE not defined
00315 #endif
00316 #ifndef POSCFG_REALTIME_PRIO
00317 #error  POSCFG_REALTIME_PRIO not defined
00318 #endif
00319 #ifndef POSCFG_ISR_INTERRUPTABLE
00320 #error  POSCFG_ISR_INTERRUPTABLE not defined
00321 #endif
00322 #ifndef POSCFG_ROUNDROBIN
00323 #error  POSCFG_ROUNDROBIN not defined
00324 #endif
00325 #ifndef POSCFG_TASKS_PER_PRIO
00326 #error  POSCFG_TASKS_PER_PRIO not defined
00327 #endif
00328 #ifndef POSCFG_FASTCODE
00329 #error  POSCFG_FASTCODE not defined
00330 #endif
00331 #ifndef POSCFG_SMALLCODE
00332 #error  POSCFG_SMALLCODE not defined
00333 #endif
00334 #ifndef POSCFG_ARGCHECK
00335 #error  POSCFG_ARGCHECK not defined
00336 #endif
00337 #ifndef POSCFG_MSG_MEMORY
00338 #error  POSCFG_MSG_MEMORY not defined
00339 #endif
00340 #ifndef POSCFG_MSG_BUFSIZE
00341 #error  POSCFG_MSG_BUFSIZE not defined
00342 #endif
00343 #ifndef POSCFG_DYNAMIC_MEMORY
00344 #error  POSCFG_DYNAMIC_MEMORY not defined
00345 #endif
00346 #ifndef POSCFG_DYNAMIC_REFILL
00347 #error  POSCFG_DYNAMIC_REFILL
00348 #endif
00349 #if POSCFG_DYNAMIC_MEMORY != 0
00350 #ifndef POS_MEM_ALLOC
00351 #error  POS_MEM_ALLOC not defined
00352 #endif
00353 #ifndef POS_MEM_ALLOC
00354 #error  POS_MEM_ALLOC not defined
00355 #endif
00356 #endif
00357 #ifndef POSCFG_CALLINITARCH
00358 #error  POSCFG_CALLINITARCH not defined
00359 #endif
00360 #ifndef POSCFG_LOCK_USEFLAGS
00361 #error  POSCFG_LOCK_USEFLAGS not defined
00362 #endif
00363 #if POSCFG_LOCK_USEFLAGS != 0
00364 #ifndef POSCFG_LOCK_FLAGSTYPE
00365 #error  POSCFG_LOCK_FLAGSTYPE not defined
00366 #endif
00367 #endif
00368 #ifndef POS_SCHED_LOCK
00369 #error  POS_SCHED_LOCK not defined
00370 #endif
00371 #ifndef POS_SCHED_UNLOCK
00372 #error  POS_SCHED_UNLOCK not defined
00373 #endif
00374 #ifndef HZ
00375 #error  HZ not defined
00376 #endif
00377 #ifndef POSCFG_TASKSTACKTYPE
00378 #error  POSCFG_TASKSTACKTYPE not defined
00379 #endif
00380 #ifndef POS_USERTASKDATA
00381 #error  POS_USERTASKDATA not defined
00382 #endif
00383 #ifndef POSCFG_FEATURE_YIELD
00384 #error  POSCFG_FEATURE_YIELD not defined
00385 #endif
00386 #ifndef POSCFG_FEATURE_SLEEP
00387 #error  POSCFG_FEATURE_SLEEP not defined
00388 #endif
00389 #ifndef POSCFG_FEATURE_EXIT
00390 #error  POSCFG_FEATURE_EXIT not defined
00391 #endif
00392 #ifndef POSCFG_FEATURE_GETPRIORITY 
00393 #error  POSCFG_FEATURE_GETPRIORITY  not defined
00394 #endif
00395 #ifndef POSCFG_FEATURE_SETPRIORITY
00396 #error  POSCFG_FEATURE_SETPRIORITY not defined
00397 #endif
00398 #ifndef POSCFG_FEATURE_SEMAPHORES
00399 #error  POSCFG_FEATURE_SEMAPHORES not defined
00400 #endif
00401 #ifndef POSCFG_FEATURE_SEMADESTROY
00402 #error  POSCFG_FEATURE_SEMADESTROY not defined
00403 #endif
00404 #ifndef POSCFG_FEATURE_SEMAWAIT
00405 #error  POSCFG_FEATURE_SEMAWAIT not defined
00406 #endif
00407 #ifndef POSCFG_FEATURE_MUTEXES
00408 #error  POSCFG_FEATURE_MUTEXES not defined
00409 #endif
00410 #ifndef POSCFG_FEATURE_MUTEXDESTROY
00411 #error  POSCFG_FEATURE_MUTEXDESTROY not defined
00412 #endif
00413 #ifndef POSCFG_FEATURE_MUTEXTRYLOCK
00414 #error  POSCFG_FEATURE_MUTEXTRYLOCK not defined
00415 #endif
00416 #ifndef POSCFG_FEATURE_GETTASK
00417 #error  POSCFG_FEATURE_GETTASK not defined
00418 #endif
00419 #ifndef POSCFG_FEATURE_TASKUNUSED
00420 #error  POSCFG_FEATURE_TASKUNUSED not defined
00421 #endif
00422 #ifndef POSCFG_FEATURE_MSGBOXES
00423 #error  POSCFG_FEATURE_MSGBOXES not defined
00424 #endif
00425 #ifndef POSCFG_FEATURE_MSGWAIT
00426 #error  POSCFG_FEATURE_MSGWAIT not defined
00427 #endif
00428 #ifndef POSCFG_FEATURE_INHIBITSCHED
00429 #error  POSCFG_FEATURE_INHIBITSCHED not defined
00430 #endif
00431 #ifndef POSCFG_FEATURE_JIFFIES
00432 #error  POSCFG_FEATURE_JIFFIES not defined
00433 #endif
00434 #ifndef POSCFG_FEATURE_TIMER
00435 #error  POSCFG_FEATURE_TIMER not defined
00436 #endif
00437 #ifndef POSCFG_FEATURE_TIMERDESTROY
00438 #error  POSCFG_FEATURE_TIMERDESTROY not defined
00439 #endif
00440 #ifndef POSCFG_FEATURE_TIMERFIRED
00441 #error  POSCFG_FEATURE_TIMERFIRED not defined
00442 #endif
00443 #ifndef POSCFG_FEATURE_FLAGS
00444 #error  POSCFG_FEATURE_FLAGS not defined
00445 #endif
00446 #ifndef POSCFG_FEATURE_FLAGDESTROY
00447 #error  POSCFG_FEATURE_FLAGDESTROY not defined
00448 #endif
00449 #ifndef POSCFG_FEATURE_FLAGWAIT
00450 #error  POSCFG_FEATURE_FLAGWAIT not defined
00451 #endif
00452 #ifndef POSCFG_FEATURE_SOFTINTS
00453 #error  POSCFG_FEATURE_SOFTINTS not defined
00454 #else
00455 #ifndef POSCFG_FEATURE_SOFTINTDEL
00456 #error  POSCFG_FEATURE_SOFTINTDEL not defined
00457 #endif
00458 #ifndef POSCFG_SOFTINTERRUPTS
00459 #error  POSCFG_SOFTINTERRUPTS not defined
00460 #endif
00461 #ifndef POSCFG_SOFTINTQUEUELEN
00462 #error  POSCFG_SOFTINTQUEUELEN not defined
00463 #endif
00464 #endif
00465 #ifndef POSCFG_FEATURE_IDLETASKHOOK
00466 #error  POSCFG_FEATURE_IDLETASKHOOK not defined
00467 #endif
00468 #ifndef POSCFG_FEATURE_ERRNO
00469 #error  POSCFG_FEATURE_ERRNO not defined
00470 #endif
00471 #ifndef POSCFG_FEATURE_ATOMICVAR
00472 #error  POSCFG_FEATURE_ATOMICVAR not defined
00473 #endif
00474 #ifndef POSCFG_FEATURE_LISTS
00475 #error  POSCFG_FEATURE_LISTS not defined
00476 #else
00477 #ifndef POSCFG_FEATURE_LISTJOIN
00478 #error  POSCFG_FEATURE_LISTJOIN not defined
00479 #endif
00480 #ifndef POSCFG_FEATURE_LISTLEN
00481 #define POSCFG_FEATURE_LISTLEN  1
00482 #endif
00483 #endif
00484 #ifndef POSCFG_FEATURE_DEBUGHELP
00485 #define POSCFG_FEATURE_DEBUGHELP  0
00486 #endif
00487 #ifdef _DBG
00488 #if POSCFG_FEATURE_DEBUGHELP
00489 #define POS_DEBUGHELP
00490 #endif
00491 #endif
00492 #ifndef POSCFG_PORTMUTEX
00493 #define POSCFG_PORTMUTEX  0
00494 #endif
00495 
00496 /* parameter range checking */
00497 #if (POSCFG_DYNAMIC_MEMORY != 0) && (POSCFG_DYNAMIC_REFILL != 0)
00498 #define SYS_POSTALLOCATE    1
00499 #else
00500 #define SYS_POSTALLOCATE    0
00501 #endif
00502 #if (MVAR_BITS != 8) && (MVAR_BITS != 16) && (MVAR_BITS != 32)
00503 #error MVAR_BITS must be 8, 16 or 32
00504 #endif
00505 #if POSCFG_MAX_PRIO_LEVEL == 0
00506 #error POSCFG_MAX_PRIO_LEVEL must not be zero
00507 #endif
00508 #if (POSCFG_ROUNDROBIN != 0) && (POSCFG_MAX_PRIO_LEVEL > MVAR_BITS)
00509 #error POSCFG_MAX_PRIO_LEVEL must not exceed MVAR_BITS
00510 #endif 
00511 #if (POSCFG_ROUNDROBIN == 0) && (POSCFG_MAX_PRIO_LEVEL > (MVAR_BITS*MVAR_BITS))
00512 #error POSCFG_MAX_PRIO_LEVEL must not exceed (MVAR_BITS * MVAR_BITS)
00513 #endif 
00514 #if (POSCFG_MAX_TASKS < 2) && (SYS_POSTALLOCATE == 0)
00515 #error POSCFG_MAX_TASKS is less than 2
00516 #endif
00517 #if (POSCFG_MAX_TASKS > (POSCFG_TASKS_PER_PRIO * POSCFG_MAX_PRIO_LEVEL))
00518 #error POSCFG_MAX_TASKS is much to big
00519 #endif
00520 #if (POSCFG_MAX_EVENTS < 1) && (SYS_POSTALLOCATE == 0)
00521 #error POSCFG_MAX_EVENTS must be at least 1
00522 #endif
00523 #if POSCFG_TASKS_PER_PRIO > MVAR_BITS
00524 #error POSCFG_TASKS_PER_PRIO can not exceed MVAR_BITS
00525 #endif
00526 #if (POSCFG_TASKS_PER_PRIO < 2) && (POSCFG_ROUNDROBIN != 0)
00527 #error POSCFG_TASKS_PER_PRIO must be at least 2
00528 #endif
00529 #if (POSCFG_TASKS_PER_PRIO != 1) && (POSCFG_ROUNDROBIN == 0)
00530 #error POSCFG_TASKS_PER_PRIO must be 1 when round robin scheduling is disabled
00531 #endif
00532 #if ((POSCFG_TASKS_PER_PRIO % 3) == 0) || ((POSCFG_TASKS_PER_PRIO % 5) == 0)
00533 #error POSCFG_TASKS_PER_PRIO must be 1/2/4/8/16 or 32
00534 #endif
00535 #if (POSCFG_REALTIME_PRIO >= POSCFG_MAX_PRIO_LEVEL) && (POSCFG_ROUNDROBIN != 0)
00536 #error POSCFG_REALTIME_PRIO must be less than POSCFG_MAX_PRIO_LEVEL
00537 #endif
00538 #if POSCFG_FEATURE_MSGBOXES != 0
00539 #if (POSCFG_MAX_MESSAGES < 2) && (SYS_POSTALLOCATE == 0)
00540 #error POSCFG_MAX_MESSAGES must be at least 2
00541 #endif
00542 #if POSCFG_MSG_BUFSIZE < 1
00543 #error POSCFG_MSG_BUFSIZE must be at least 1
00544 #endif
00545 #endif
00546 #if (POSCFG_FEATURE_TIMER != 0)
00547 #if (POSCFG_MAX_TIMER == 0) && (SYS_POSTALLOCATE == 0)
00548 #error POSCFG_MAX_TIMER must be at least 1
00549 #endif
00550 #endif
00551 #if (POSCFG_TASKSTACKTYPE < 0) || (POSCFG_TASKSTACKTYPE > 2)
00552 #error POSCFG_TASKSTACKTYPE must be 0, 1 or 2
00553 #endif
00554 #if POSCFG_ALIGNMENT == 0
00555 #undef POSCFG_ALIGNMENT
00556 #define POSCFG_ALIGNMENT  1
00557 #else
00558 #if ((POSCFG_ALIGNMENT % 3) == 0) || ((POSCFG_ALIGNMENT % 5) == 0)
00559 #error POSCFG_ALIGNMENT must be 1/2/4/8/16/32/64/128/256 etc.
00560 #endif
00561 #endif
00562 #if POSCFG_FEATURE_SOFTINTS != 0
00563 #if POSCFG_SOFTINTERRUPTS == 0
00564 #error POSCFG_SOFTINTERRUPTS must be greater than 0
00565 #endif
00566 #if POSCFG_SOFTINTQUEUELEN < 2
00567 #error POSCFG_SOFTINTQUEUELEN must be at least 2
00568 #endif
00569 #endif
00570 
00571 
00572 /* parameter reconfiguration */
00573 #ifndef POSCFG_TASKCB_USERSPACE
00574 #define POSCFG_TASKCB_USERSPACE     0
00575 #endif
00576 #if POSCFG_FEATURE_SEMAPHORES == 0
00577 #undef POSCFG_FEATURE_SEMADESTROY
00578 #define POSCFG_FEATURE_SEMADESTROY  0
00579 #endif
00580 #if POSCFG_FEATURE_FLAGS == 0
00581 #undef POSCFG_FEATURE_FLAGDESTROY
00582 #define POSCFG_FEATURE_FLAGDESTROY  0
00583 #endif
00584 #if POSCFG_FEATURE_MUTEXES == 0
00585 #undef POSCFG_FEATURE_MUTEXDESTROY
00586 #define POSCFG_FEATURE_MUTEXDESTROY  0
00587 #else
00588 #if (POSCFG_FEATURE_MUTEXDESTROY != 0) && (POSCFG_FEATURE_SEMADESTROY == 0)
00589 #undef POSCFG_FEATURE_SEMADESTROY
00590 #define POSCFG_FEATURE_SEMADESTROY 1
00591 #endif
00592 #endif
00593 #if (POSCFG_FEATURE_MSGBOXES != 0) && (SYS_POSTALLOCATE == 0)
00594 #define SYS_MSGBOXEVENTS  2
00595 #else
00596 #define SYS_MSGBOXEVENTS  0
00597 #endif
00598 #if (POSCFG_FEATURE_MSGBOXES != 0) && (POSCFG_FEATURE_GETTASK == 0)
00599 #undef POSCFG_FEATURE_GETTASK
00600 #define POSCFG_FEATURE_GETTASK 1
00601 #endif
00602 #if (POSCFG_FEATURE_SEMAWAIT != 0) || (POSCFG_FEATURE_MSGWAIT != 0)
00603 #define SYS_TASKDOUBLELINK  1
00604 #else
00605 #define SYS_TASKDOUBLELINK  0
00606 #endif
00607 #define SYS_EVENTS_USED  \
00608       (POSCFG_FEATURE_MUTEXES | POSCFG_FEATURE_MSGBOXES | \
00609        POSCFG_FEATURE_FLAGS | POSCFG_FEATURE_LISTS)
00610 #define SYS_FEATURE_EVENTS  (POSCFG_FEATURE_SEMAPHORES | SYS_EVENTS_USED)
00611 #define SYS_FEATURE_EVENTFREE  (POSCFG_FEATURE_SEMADESTROY | \
00612           POSCFG_FEATURE_MUTEXDESTROY | POSCFG_FEATURE_FLAGDESTROY | \
00613           POSCFG_FEATURE_LISTS)
00614 #if (POSCFG_FEATURE_MSGBOXES != 0) && (POSCFG_FEATURE_EXIT != 0)
00615 #undef  SYS_FEATURE_EVENTFREE
00616 #define SYS_FEATURE_EVENTFREE  1
00617 #endif
00618 #ifndef POSCFG_FEATURE_LARGEJIFFIES
00619 #if MVAR_BITS < 16
00620 #define POSCFG_FEATURE_LARGEJIFFIES  1
00621 #else
00622 #define POSCFG_FEATURE_LARGEJIFFIES  0
00623 #endif
00624 #endif
00625 #ifndef POSCALL
00626 #define POSCALL
00627 #endif
00628 
00629 #endif /* DOX!=0 */
00630 
00631 
00632 
00633 /*---------------------------------------------------------------------------
00634  *  SOME DEFINITIONS AND MACROS
00635  *-------------------------------------------------------------------------*/
00636 
00637 #ifdef _POSCORE_C
00638 #define POSEXTERN
00639 #define POSFROMEXT  extern
00640 #else
00641 #define POSEXTERN   extern
00642 #define POSFROMEXT
00643 #endif
00644 
00645 #if POSCFG_ROUNDROBIN == 0
00646 #define SYS_TASKTABSIZE_X  MVAR_BITS
00647 #define SYS_TASKTABSIZE_Y  ((POSCFG_MAX_PRIO_LEVEL+MVAR_BITS-1)/MVAR_BITS)
00648 #else
00649 #define SYS_TASKTABSIZE_X  POSCFG_TASKS_PER_PRIO
00650 #define SYS_TASKTABSIZE_Y  POSCFG_MAX_PRIO_LEVEL
00651 #endif
00652 
00653 #define SYS_TASKSTATE (POSCFG_FEATURE_TASKUNUSED | POSCFG_FEATURE_MSGBOXES)
00654 
00655 #if POSCFG_LOCK_USEFLAGS != 0
00656 #define POS_LOCKFLAGS   POSCFG_LOCK_FLAGSTYPE flags
00657 #else
00658 #define POS_LOCKFLAGS   do { } while(0)
00659 #endif
00660 
00661 #define POSTASKSTATE_UNUSED      0
00662 #define POSTASKSTATE_ZOMBIE      1
00663 #define POSTASKSTATE_ACTIVE      2
00664 
00665 #define INFINITE   ((UINT_t)~0)
00666 
00667 
00668 
00669 /*---------------------------------------------------------------------------
00670  *  ERROR CODES
00671  *-------------------------------------------------------------------------*/
00672 
00687 #define E_OK        0
00688 
00690 #define E_FAIL      1
00691 
00693 #define E_NOMEM     2
00694 
00696 #define E_ARG       3
00697 
00699 #define E_FORB      4
00700 
00702 #define E_NOMORE    5
00703 
00705 #define E_NOTFOUND  6
00706 
00711 /*---------------------------------------------------------------------------
00712  *  MACROS
00713  *-------------------------------------------------------------------------*/
00714 
00720 #if (DOX==0) && (HZ <= 1000)
00721 #define MS(msec)  (((UINT_t)(msec)<(1000/HZ)) ? \
00722                     ((UINT_t)1) : ((UINT_t)((1L*HZ*(UINT_t)(msec))/1000)))
00723 #else
00724 #define MS(msec)  ((UINT_t)((1L*HZ*(UINT_t)(msec))/1000))
00725 #endif
00726 
00727 
00728 
00729 /*---------------------------------------------------------------------------
00730  *  DATA TYPES
00731  *-------------------------------------------------------------------------*/
00732 
00738 typedef signed MVAR_t     VAR_t;
00739 
00745 typedef unsigned MVAR_t   UVAR_t;
00746 
00747 #ifndef MINT_t
00748 #define MINT_t int
00749 #endif
00750 
00759 typedef signed MINT_t     INT_t;
00760 
00770 typedef unsigned MINT_t   UINT_t;
00771 
00772 #ifndef MPTR_t
00773 #define MPTR_t long
00774 #endif
00775 
00786 typedef unsigned MPTR_t   MEMPTR_t;
00787 
00788 #if (DOX!=0) || (POSCFG_FEATURE_LARGEJIFFIES == 0)
00789 
00792 typedef VAR_t             SJIF_t;
00796 typedef UVAR_t            JIF_t;
00797 #else
00798 typedef INT_t             SJIF_t;
00799 typedef UINT_t            JIF_t;
00800 #endif
00801 
00805 typedef void (*POSTASKFUNC_t)(void* arg);
00806 
00813 typedef void (*POSINTFUNC_t)(UVAR_t arg);
00814 
00815 #if (DOX!=0) ||(POSCFG_FEATURE_IDLETASKHOOK != 0)
00816 
00817 typedef void (*POSIDLEFUNC_t)(void);
00818 #endif
00819 
00820 /* forward declarations (just dummies) */
00821 struct POSSEMA;
00822 struct POSMUTEX;
00823 struct POSFLAG;
00824 struct POSTIMER;
00825 
00829 typedef struct POSSEMA *POSSEMA_t;
00830 
00834 typedef struct POSMUTEX *POSMUTEX_t;
00835 
00839 typedef struct POSFLAG *POSFLAG_t;
00840 
00844 typedef struct POSTIMER *POSTIMER_t;
00845 
00849 typedef volatile INT_t  POSATOMIC_t;
00850 
00851 #if (DOX!=0) || (POSCFG_FEATURE_LISTS != 0)
00852 struct POSLIST;
00853 struct POSLISTHEAD {
00854   struct POSLIST* volatile  prev;
00855   struct POSLIST* volatile  next;
00856   POSSEMA_t       volatile  sema;
00857   UVAR_t          volatile  flag;
00858 #if POSCFG_FEATURE_LISTLEN != 0
00859   UINT_t          volatile  length;
00860 #endif
00861 };
00862 struct POSLIST {
00863   struct POSLIST* volatile  prev;
00864   struct POSLIST* volatile  next;
00865 #if POSCFG_FEATURE_LISTLEN != 0
00866   struct POSLISTHEAD* volatile head;
00867 #endif
00868 };
00873 typedef struct POSLIST POSLIST_t;
00878 typedef struct POSLISTHEAD POSLISTHEAD_t;
00879 #endif
00880 
00881 
00901 typedef struct POSTASK  *POSTASK_t; /* forward declaration */
00902 
00903 
00904 
00905 /*---------------------------------------------------------------------------
00906  *  DEFINITIONS FOR GENERIC "findbit" FUNCTION  (file fbit_gen.c)
00907  *-------------------------------------------------------------------------*/
00908 
00909 #ifndef POSCFG_FBIT_USE_LUTABLE
00910 #define POSCFG_FBIT_USE_LUTABLE  0
00911 #endif
00912 #if (POSCFG_FBIT_USE_LUTABLE > 1) && (POSCFG_ROUNDROBIN == 0)
00913 #undef POSCFG_FBIT_USE_LUTABLE
00914 #define POSCFG_FBIT_USE_LUTABLE 1
00915 #endif
00916 #ifndef FINDBIT
00917 #if POSCFG_FBIT_USE_LUTABLE == 1
00918 #if POSCFG_ROUNDROBIN == 0
00919 #ifndef _FBIT_GEN_C
00920 extern VAR_t const p_pos_fbittbl[256];
00921 #endif
00922 #define FINDBIT(x)  p_pos_fbittbl[x] 
00923 #else
00924 UVAR_t POSCALL p_pos_findbit(const UVAR_t bitfield, UVAR_t rrOffset);
00925 #define FINDBIT(x, o)  p_pos_findbit(x, o)
00926 #endif
00927 #elif POSCFG_FBIT_USE_LUTABLE == 2
00928 #ifndef _FBIT_GEN_C
00929 extern VAR_t const p_pos_fbittbl_rr[8][256];
00930 #endif
00931 #define FINDBIT(x, o)  p_pos_fbittbl_rr[o][x]
00932 #endif
00933 #endif /* !FINDBIT */
00934 
00935 
00936 
00937 /*---------------------------------------------------------------------------
00938  *  GLOBAL VARIABLES
00939  *-------------------------------------------------------------------------*/
00940 
00949 POSEXTERN volatile POSTASK_t posCurrentTask_g;
00950 
00959 POSEXTERN volatile POSTASK_t posNextTask_g;
00960 
00967 #ifndef _POSCORE_C
00968 POSEXTERN volatile UVAR_t    posInInterrupt_g;
00969 #else
00970 POSEXTERN volatile UVAR_t    posInInterrupt_g = 1;
00971 #endif
00972 
00979 #ifndef _POSCORE_C
00980 POSEXTERN volatile UVAR_t    posRunning_g;
00981 #else
00982 POSEXTERN volatile UVAR_t    posRunning_g = 0;
00983 #endif
00984 
00985 
00986 #if DOX!=0
00987 
00992 VAR_t   errno;
00993 #endif
00994 #if POSCFG_FEATURE_ERRNO != 0
00995 #ifdef errno
00996 #undef errno
00997 #endif
00998 POSEXTERN VAR_t* _errno_p(void);
00999 #define errno (*_errno_p())
01000 #endif
01001 
01002 
01003 
01004 /*---------------------------------------------------------------------------
01005  *  PROTOTYPES OF INTERNAL FUNCTIONS
01006  *-------------------------------------------------------------------------*/
01007 
01142 /* findbit  function or macro definition */
01143 #if (DOX!=0) || (POSCFG_ROUNDROBIN == 0)
01144 #ifdef FINDBIT
01145 #define POS_FINDBIT(bf)          FINDBIT(bf, 0)
01146 #define POS_FINDBIT_EX(bf, ofs)  FINDBIT(bf, 0)
01147 #else  /* FINDBIT */
01148 POSFROMEXT UVAR_t POSCALL p_pos_findbit(const UVAR_t bitfield);  /* arch_c.c */
01149 #define POS_FINDBIT(bf)          p_pos_findbit(bf)
01150 #define POS_FINDBIT_EX(bf, ofs)  p_pos_findbit(bf)
01151 #endif /* FINDBIT */
01152 #else  /* POSCFG_ROUNDROBIN */
01153 #ifdef FINDBIT
01154 #define POS_FINDBIT(bf)          FINDBIT(bf, 0)
01155 #define POS_FINDBIT_EX(bf, ofs)  FINDBIT(bf, ofs)
01156 #else  /* FINDBIT */
01157 POSFROMEXT UVAR_t POSCALL p_pos_findbit(const UVAR_t bitfield, UVAR_t rrOffset);  /* arch_c.c */
01158 #define POS_FINDBIT(bf)          p_pos_findbit(bf, 0)
01159 #define POS_FINDBIT_EX(bf, ofs)  p_pos_findbit(bf, ofs)
01160 #endif /* FINDBIT */
01161 #endif /* POSCFG_ROUNDROBIN */
01162 
01163 #if DOX!=0
01164 
01173 POSFROMEXT UVAR_t POSCALL p_pos_findbit(const UVAR_t bitfield);  
01174 
01185 POSFROMEXT UVAR_t POSCALL p_pos_findbit(const UVAR_t bitfield, UVAR_t rrOffset); 
01186 #endif
01187 
01188 #if (DOX!=0) || (POSCFG_CALLINITARCH != 0)
01189 
01200 POSFROMEXT void POSCALL p_pos_initArch(void);
01201 #endif
01202 
01203 #if (DOX!=0) || (POSCFG_TASKSTACKTYPE == 0)
01204 
01223 POSFROMEXT void POSCALL p_pos_initTask(POSTASK_t task, void *stackstart,
01224                                        POSTASKFUNC_t funcptr,
01225                                        void *funcarg);  /* arch_c.c */
01226 #endif
01227 #if (DOX!=0) || (POSCFG_TASKSTACKTYPE == 1)
01228 
01252 POSFROMEXT VAR_t POSCALL p_pos_initTask(POSTASK_t task, UINT_t stacksize,
01253                                 POSTASKFUNC_t funcptr,
01254                                 void *funcarg);  /* arch_c.c */
01273 POSFROMEXT void POSCALL p_pos_freeStack(POSTASK_t task);/* arch_c.c */
01274 #endif
01275 
01276 #if (DOX!=0) || (POSCFG_PORTMUTEX != 0)
01277 
01285 POSFROMEXT void POSCALL p_pos_lock(void);/* arch_c.c */
01286 
01290 POSFROMEXT void POSCALL p_pos_unlock(void);/* arch_c.c */
01291 #endif
01292 
01293 #if (DOX!=0) || (POSCFG_TASKSTACKTYPE == 2)
01294 
01317 POSFROMEXT VAR_t POSCALL p_pos_initTask(POSTASK_t task, POSTASKFUNC_t funcptr,
01318                                         void *funcarg);  /* arch_c.c */
01319 
01336 POSFROMEXT void POSCALL p_pos_freeStack(POSTASK_t task);/* arch_c.c */
01337 #endif
01338 
01352 POSFROMEXT void POSCALL p_pos_startFirstContext(void);   /* arch_c.c */
01353 
01368 POSFROMEXT void POSCALL p_pos_softContextSwitch(void);   /* arch_c.c */
01369 
01383 POSFROMEXT void POSCALL p_pos_intContextSwitch(void);    /* arch_c.c */
01384 
01393 POSEXTERN void POSCALL c_pos_intEnter(void);            /* picoos.c */
01394 
01403 POSEXTERN void POSCALL c_pos_intExit(void);             /* picoos.c */
01404 
01437 POSEXTERN void POSCALL c_pos_timerInterrupt(void);      /* picoos.c */
01438 
01443 /*---------------------------------------------------------------------------
01444  *  PROTOTYPES OF EXPORTED FUNCTIONS  (USER API)
01445  *-------------------------------------------------------------------------*/
01446 
01452 #if (DOX!=0) || (POSCFG_FEATURE_YIELD != 0)
01453 
01461 POSEXTERN void POSCALL posTaskYield(void);
01462 #endif
01463 
01464 #if (DOX!=0) || (POSCFG_FEATURE_SLEEP != 0)
01465 
01479 POSEXTERN void POSCALL posTaskSleep(UINT_t ticks);
01480 #endif
01481 
01482 #if (DOX!=0) || (POSCFG_TASKSTACKTYPE == 0)
01483 
01499 POSEXTERN POSTASK_t POSCALL posTaskCreate(POSTASKFUNC_t funcptr, void *funcarg,
01500                                           VAR_t priority, void *stackstart);
01501 
01517 POSEXTERN void POSCALL posInit(POSTASKFUNC_t firstfunc, void *funcarg,
01518                                VAR_t priority,
01519                                void *stackFirstTask, void *stackIdleTask);
01520 #endif
01521 #if (DOX!=0) || (POSCFG_TASKSTACKTYPE == 1)
01522 
01541 POSEXTERN POSTASK_t POSCALL posTaskCreate(POSTASKFUNC_t funcptr, void *funcarg,
01542                                           VAR_t priority, UINT_t stacksize);
01543 
01559 POSEXTERN void POSCALL posInit(POSTASKFUNC_t firstfunc, void *funcarg,
01560                                VAR_t priority, UINT_t taskStackSize,
01561                                UINT_t idleStackSize);
01562 #endif
01563 #if (DOX!=0) || (POSCFG_TASKSTACKTYPE == 2)
01564 
01580 POSEXTERN POSTASK_t POSCALL posTaskCreate(POSTASKFUNC_t funcptr, void *funcarg,
01581                                           VAR_t priority);
01582 
01596 POSEXTERN void POSCALL posInit(POSTASKFUNC_t firstfunc, void *funcarg,
01597                                VAR_t priority);
01598 
01599 #endif
01600 
01601 
01602 #if (DOX!=0) || (POSCFG_FEATURE_EXIT != 0)
01603 
01610 POSEXTERN void POSCALL posTaskExit(void);
01611 #endif
01612 
01613 #if (DOX!=0) || (POSCFG_FEATURE_GETTASK != 0)
01614 
01622 POSEXTERN POSTASK_t POSCALL posTaskGetCurrent(void);
01623 #endif
01624 
01625 #if (DOX!=0) || (POSCFG_FEATURE_TASKUNUSED != 0)
01626 
01639 POSEXTERN VAR_t POSCALL posTaskUnused(POSTASK_t taskhandle);
01640 #endif
01641 
01642 #if (DOX!=0) || (POSCFG_FEATURE_SETPRIORITY != 0)
01643 
01656 POSEXTERN VAR_t POSCALL posTaskSetPriority(POSTASK_t taskhandle,
01657                                            VAR_t priority);
01658 #endif
01659 
01660 #if (DOX!=0) || (POSCFG_FEATURE_GETPRIORITY != 0)
01661 
01670 POSEXTERN VAR_t POSCALL posTaskGetPriority(POSTASK_t taskhandle);
01671 #endif
01672 
01673 #if (DOX!=0) || (POSCFG_FEATURE_INHIBITSCHED != 0)
01674 
01685 POSEXTERN void POSCALL posTaskSchedLock(void);
01686 
01696 POSEXTERN void POSCALL posTaskSchedUnlock(void);
01697 #endif
01698 
01699 #if (DOX!=0) || (POSCFG_TASKCB_USERSPACE > 0)
01700 
01708 POSEXTERN void* POSCALL posTaskGetUserspace(void);
01709 #endif
01710 
01711 #if (DOX!=0) || (POSCFG_FEATURE_IDLETASKHOOK != 0)
01712 
01730 POSEXTERN POSIDLEFUNC_t POSCALL posInstallIdleTaskHook(POSIDLEFUNC_t idlefunc);
01731 #endif
01732 
01735 /*-------------------------------------------------------------------------*/
01736 
01737 #if (DOX!=0) || (SYS_FEATURE_EVENTS != 0)
01738 
01777 POSEXTERN POSSEMA_t POSCALL posSemaCreate(INT_t initcount);
01778 
01779 #if (DOX!=0) || (SYS_FEATURE_EVENTFREE != 0)
01780 
01790 POSEXTERN void POSCALL posSemaDestroy(POSSEMA_t sema);
01791 #endif
01792 
01805 #if (DOX!=0) || (POSCFG_SMALLCODE == 0) || (POSCFG_FEATURE_SEMAWAIT == 0)
01806 POSEXTERN VAR_t POSCALL posSemaGet(POSSEMA_t sema);
01807 #else
01808 /* this define is for small code and it saves stack memory */
01809 #define  posSemaGet(sema)  posSemaWait(sema, INFINITE)
01810 #endif
01811 
01823 POSEXTERN VAR_t POSCALL posSemaSignal(POSSEMA_t sema);
01824 
01825 #if (DOX!=0) || (POSCFG_FEATURE_SEMAWAIT != 0)
01826 
01846 POSEXTERN VAR_t POSCALL posSemaWait(POSSEMA_t sema, UINT_t timeoutticks);
01847 #endif
01848 
01849 #endif /* SYS_FEATURE_EVENTS */
01850 
01852 /*-------------------------------------------------------------------------*/
01853 
01854 #if (DOX!=0) || (POSCFG_FEATURE_MUTEXES != 0)
01855 
01876 POSEXTERN POSMUTEX_t POSCALL posMutexCreate(void);
01877 
01878 #if (DOX!=0) || (POSCFG_FEATURE_MUTEXDESTROY != 0)
01879 
01889 POSEXTERN void POSCALL posMutexDestroy(POSMUTEX_t mutex);
01890 #endif
01891 
01892 #if (DOX!=0) || (POSCFG_FEATURE_MUTEXTRYLOCK != 0)
01893 
01908 POSEXTERN VAR_t POSCALL posMutexTryLock(POSMUTEX_t mutex);
01909 #endif
01910 
01923 POSEXTERN VAR_t POSCALL posMutexLock(POSMUTEX_t mutex);
01924 
01935 POSEXTERN VAR_t POSCALL posMutexUnlock(POSMUTEX_t mutex);
01936 
01937 #endif /* POSCFG_FEATURE_MUTEXES */
01938 
01940 /*-------------------------------------------------------------------------*/
01941 
01942 #if (DOX!=0) || (POSCFG_FEATURE_MSGBOXES != 0)
01943 
01965 #if (DOX!=0) || (POSCFG_MSG_MEMORY != 0)
01966 
01979 POSEXTERN void* POSCALL posMessageAlloc(void);
01980 
01993 POSEXTERN void POSCALL posMessageFree(void *buf);
01994 #endif
01995 
02013 POSEXTERN VAR_t POSCALL posMessageSend(void *buf, POSTASK_t taskhandle);
02014 
02030 #if (DOX!=0) || (POSCFG_SMALLCODE == 0) || (POSCFG_FEATURE_MSGWAIT == 0)
02031 POSEXTERN void* POSCALL posMessageGet(void);
02032 #else
02033 /* this define is for small code and it saves stack memory */
02034 #define     posMessageGet()  posMessageWait(INFINITE)
02035 #endif
02036 
02049 POSEXTERN VAR_t POSCALL posMessageAvailable(void);
02050 
02051 #if (DOX!=0) || (POSCFG_FEATURE_MSGWAIT != 0)
02052 
02077 POSEXTERN void* POSCALL posMessageWait(UINT_t timeoutticks);
02078 #endif
02079 
02080 #endif  /* POSCFG_FEATURE_MSGBOXES */
02081 
02083 /*-------------------------------------------------------------------------*/
02084 
02085 #if (DOX!=0) || (POSCFG_FEATURE_FLAGS != 0)
02086 
02106 POSEXTERN POSFLAG_t POSCALL posFlagCreate(void);
02107 
02108 #if (DOX!=0) || (POSCFG_FEATURE_FLAGDESTROY != 0)
02109 
02119 POSEXTERN void POSCALL posFlagDestroy(POSFLAG_t flg);
02120 #endif
02121 
02134 POSEXTERN VAR_t POSCALL posFlagSet(POSFLAG_t flg, UVAR_t flgnum);
02135 
02150 POSEXTERN VAR_t POSCALL posFlagGet(POSFLAG_t flg, UVAR_t mode);
02151 
02152 #if (DOX!=0) || (POSCFG_FEATURE_FLAGWAIT != 0)
02153 
02172 POSEXTERN VAR_t POSCALL posFlagWait(POSFLAG_t flg, UINT_t timeoutticks);
02173 #endif
02174 
02175 #define POSFLAG_MODE_GETSINGLE   0
02176 #define POSFLAG_MODE_GETMASK     1
02177 
02178 #endif  /* POSCFG_FEATURE_FLAGS */
02179 
02181 /*-------------------------------------------------------------------------*/
02182 
02204 #if DOX!=0
02205 #define HZ (timerticks per second)
02206 #endif
02207 
02217 #if (DOX!=0) || (POSCFG_FEATURE_JIFFIES != 0)
02218 #if (DOX!=0) || (POSCFG_FEATURE_LARGEJIFFIES == 0)
02219 POSEXTERN  volatile JIF_t  jiffies;
02220 #else
02221 POSEXTERN  JIF_t POSCALL posGetJiffies(void);
02222 #define jiffies  posGetJiffies()
02223 #endif
02224 
02235 #define POS_TIMEAFTER(x, y)    ((((SJIF_t)(x)) - ((SJIF_t)(y))) >= 0)
02236 
02237 #endif  /* POSCFG_FEATURE_JIFFIES */
02238 
02239 #if (DOX!=0) || (POSCFG_FEATURE_TIMER != 0)
02240 
02250 POSEXTERN POSTIMER_t POSCALL posTimerCreate(void);
02251 
02269 POSEXTERN VAR_t POSCALL posTimerSet(POSTIMER_t tmr, POSSEMA_t sema,
02270                                     UINT_t waitticks, UINT_t periodticks);
02282 POSEXTERN VAR_t POSCALL posTimerStart(POSTIMER_t tmr);
02283 
02294 POSEXTERN VAR_t POSCALL posTimerStop(POSTIMER_t tmr);
02295 
02296 #if (DOX!=0) || (POSCFG_FEATURE_TIMERDESTROY != 0)
02297 
02307 POSEXTERN void POSCALL posTimerDestroy(POSTIMER_t tmr);
02308 #endif
02309 #if (DOX!=0) || (POSCFG_FEATURE_TIMERFIRED != 0)
02310 
02322 POSEXTERN VAR_t POSCALL posTimerFired(POSTIMER_t tmr);
02323 #endif
02324 
02325 #endif  /* POSCFG_FEATURE_TIMER */
02326 
02328 /*-------------------------------------------------------------------------*/
02329 
02330 #if (DOX!=0) || (POSCFG_FEATURE_SOFTINTS != 0)
02331 
02377 POSEXTERN void POSCALL posSoftInt(UVAR_t intno, UVAR_t param);
02378 
02392 POSEXTERN VAR_t POSCALL posSoftIntSetHandler(UVAR_t intno,
02393                                              POSINTFUNC_t inthandler);
02394 
02395 #if (DOX!=0) || (POSCFG_FEATURE_SOFTINTDEL != 0)
02396 
02409 POSEXTERN VAR_t POSCALL posSoftIntDelHandler(UVAR_t intno);
02410 #endif
02411 
02412 #endif  /* POSCFG_FEATURE_SOFTINTS */
02413 
02415 /*-------------------------------------------------------------------------*/
02416 
02417 #if (DOX!=0) || (POSCFG_FEATURE_ATOMICVAR != 0)
02418 
02443 POSEXTERN void POSCALL posAtomicSet(POSATOMIC_t *var, INT_t value);
02444 
02455 POSEXTERN INT_t POSCALL posAtomicGet(POSATOMIC_t *var);
02456 
02467 POSEXTERN INT_t POSCALL posAtomicAdd(POSATOMIC_t *var, INT_t value);
02468 
02479 POSEXTERN INT_t POSCALL posAtomicSub(POSATOMIC_t *var, INT_t value);
02480 
02481 #endif /* POSCFG_FEATURE_ATOMICVAR */
02482 
02485 /*-------------------------------------------------------------------------*/
02486 
02487 #if (DOX!=0) || (POSCFG_FEATURE_LISTS != 0)
02488 
02503 #define POSLIST_HEAD  0
02504 #define POSLIST_TAIL  1
02505 
02521 POSEXTERN void POSCALL posListAdd(POSLISTHEAD_t *listhead, UVAR_t pos,
02522                                   POSLIST_t *new);
02523 
02555 POSEXTERN POSLIST_t* POSCALL posListGet(POSLISTHEAD_t *listhead, UVAR_t pos,
02556                                         UINT_t timeout);
02557 
02566 POSEXTERN void POSCALL posListRemove(POSLIST_t *listelem);
02567 
02568 #if (DOX!=0) || (POSCFG_FEATURE_LISTJOIN != 0)
02569 
02588 POSEXTERN void POSCALL posListJoin(POSLISTHEAD_t *baselisthead, UVAR_t pos,
02589                                    POSLISTHEAD_t *joinlisthead);
02590 #endif
02591 
02592 #if (DOX!=0) || (POSCFG_FEATURE_LISTLEN != 0)
02593 
02604 POSEXTERN UINT_t POSCALL posListLen(POSLISTHEAD_t *listhead);
02605 #endif
02606 
02618 POSEXTERN void POSCALL posListInit(POSLISTHEAD_t *listhead);
02619 
02627 POSEXTERN void POSCALL posListTerm(POSLISTHEAD_t *listhead);
02628 
02629 #if (DOX!=0)
02630 
02642 #define POSLIST_ELEMENT(elem, type, member)
02643 #else
02644 #define POSLIST_ELEMENT(elem, type, member) \
02645         ((type*)((char*)(elem)-(char*)(&((type*)NULL)->member)))
02646 #endif
02647 
02651 #define POSLIST_IS_EMPTY(plisthead) \
02652           ((plisthead)->next == (POSLIST_t*)(plisthead))
02653 
02657 #define POSLIST_NEXT_ENTRY(plist)               (plist)->next
02658 
02662 #define POSLIST_PREV_ENTRY(plist)               (plist)->prev
02663 
02667 #define POSLIST_FIRST_ENTRY(plisthead)          (plisthead)->next
02668 
02672 #define POSLIST_LAST_ENTRY(plisthead)           (plisthead)->prev
02673 
02677 #define POSLIST_IS_FIRST_ENTRY(element) ((element)->prev==(element)->head)
02678 
02682 #define POSLIST_IS_LAST_ENTRY(element)  ((element)->next==(element)->head)
02683 
02686 #define POSLIST_IS_END(plisthead, element) \
02687           ((element)==(POSLIST_t*)(plisthead))
02688 
02689 
02690 #if (DOX!=0)
02691 
02707 #define POSLIST_FOR_EACH_ENTRY(plisthead, runvar)
02708 #else
02709 #define POSLIST_FOR_EACH_ENTRY(plisthead, runvar) \
02710   for (runvar = POSLIST_FIRST_ENTRY(plisthead);   \
02711        !POSLIST_IS_END(plisthead, runvar);        \
02712        runvar = POSLIST_NEXT_ENTRY(runvar))
02713 #endif
02714 
02715 #if (DOX!=0)
02716 
02737 #define POSLIST_FOREACH_BEGIN(plisthead, runvar, type, listmember)
02738 #else
02739 #define POSLIST_FOREACH_BEGIN(plisthead, runvar, type, listmember) \
02740   do { POSLIST_t *r, *n; \
02741     for (r = POSLIST_FIRST_ENTRY(plisthead); \
02742          !POSLIST_IS_END(plisthead, r); r = n) { \
02743          n = POSLIST_NEXT_ENTRY(r); \
02744       runvar = POSLIST_ELEMENT(r, type, listmember);
02745 #endif
02746 
02747 #if (DOX!=0)
02748 
02754 #define POSLIST_FOREACH_END
02755 #else
02756 #define POSLIST_FOREACH_END \
02757   } } while(0)
02758 #endif
02759 
02760 #endif /* POSCFG_FEATURE_LISTS */
02761 
02764 /*---------------------------------------------------------------------------
02765  *  DEBUG FEATURES
02766  *-------------------------------------------------------------------------*/
02767 
02812 #if (DOX!=0) || defined(HAVE_PLATFORM_ASSERT)
02813 
02821 #define P_ASSERT(text,x) \
02822   if (!(x)) POSCALL p_pos_assert((const char*)(text), __FILE__, __LINE__)
02823 #else
02824 #define P_ASSERT(text,x)  do { } while(0)
02825 #endif
02826 
02827 #if (DOX!=0) || defined(POS_DEBUGHELP)
02828 
02833 enum PTASKSTATE
02834 {
02835   task_notExisting = 0,  
02836   task_created     = 1,  
02837   task_running     = 2,  
02838   task_suspended   = 3,  
02839   task_sleeping    = 4,  
02840   task_waitingForSemaphore = 5, 
02841   task_waitingForSemaphoreWithTimeout = 6, 
02843   task_waitingForMutex = 7, 
02844   task_waitingForMutexWithTimeout = 8,  
02846   task_waitingForFlag  = 9, 
02847   task_waitingForFlagWithTimeout = 10, 
02849   task_waitingForMessage = 11, 
02850   task_waitingForMessageWithTimeout = 12   
02852 };
02853 typedef enum PTASKSTATE PTASKSTATE;
02854 
02859 enum PEVENTTYPE
02860 {
02861   event_semaphore = 0,  
02862   event_mutex     = 1,  
02863   event_flags     = 2   
02864 };
02865 typedef enum PEVENTTYPE PEVENTTYPE;
02866 
02876 typedef struct PICOEVENT
02877 {
02878   struct PICOEVENT  *next;  
02880   struct PICOEVENT  *prev;  
02882 #if DOX
02883   PEVENTTYPE        type;   
02886 #else
02887   enum PEVENTTYPE   type;
02888 #endif
02889   void              *handle;
02891   const char        *name;  
02893   INT_t             counter;
02897 } PICOEVENT;
02898 
02908 typedef struct PICOTASK
02909 {
02910   struct PICOTASK   *next;  
02912   struct PICOTASK   *prev;  
02914   POSTASK_t         handle; 
02916   POSTASKFUNC_t     func;   
02918   const char        *name;  
02920 #if DOX
02921   PTASKSTATE        state;  
02924 #else
02925   enum PTASKSTATE   state;
02926 #endif
02927   struct PICOEVENT  *event; 
02929   UINT_t            timeout;
02931 } PICOTASK;
02932 
02933 #if DOX
02934 
02956 #define POS_SETTASKNAME(taskhandle, taskname)
02957 
02977 #define POS_SETEVENTNAME(eventhandle, name)
02978 
02979 #else
02980 #define POS_SETTASKNAME(taskhandle, taskname)  \
02981   do { if ((taskhandle) != NULL) (taskhandle)->deb.name = taskname;} while(0)
02982 #define POS_SETEVENTNAME(eventhandle, name) \
02983   posdeb_setEventName(eventhandle, name)
02984 POSEXTERN void posdeb_setEventName(void *event, const char *name);
02985 #endif
02986 
02987 #ifdef _POSCORE_C
02988 struct PICOTASK  *picodeb_taskhistory[3];
02989 struct PICOTASK  *picodeb_tasklist = NULL;
02990 struct PICOEVENT *picodeb_eventlist = NULL;
02991 #else
02992 
03006 extern struct PICOTASK  *picodeb_taskhistory[3];
03007 
03020 extern struct PICOTASK  *picodeb_tasklist;
03021 
03036 extern struct PICOEVENT *picodeb_eventlist;
03037 #endif
03038 
03039 #else /* POS_DEBUGHELP */
03040 
03041 #define POS_SETTASKNAME(taskhandle, name)  do { } while(0)
03042 #define POS_SETEVENTNAME(eventhandle, name)  do { } while(0)
03043 
03044 #endif /* POS_DEBUGHELP */
03045 
03048 /* ==== END OF USER API ==== */
03049 
03050 
03051 
03052 /*---------------------------------------------------------------------------
03053  *  INTERNAL DEFINITIONS
03054  *-------------------------------------------------------------------------*/
03055 
03056 #ifdef PICOS_PRIVINCL
03057 
03058 #if MVAR_BITS == 8
03059 #ifndef _POSCORE_C
03060 POSEXTERN UVAR_t posShift1lTab_g[8];
03061 #endif
03062 #define pos_shift1l(bits)   posShift1lTab_g[(UVAR_t)(bits)]
03063 #else
03064 #define pos_shift1l(bits)   (((UVAR_t)1)<<(bits))
03065 #endif
03066 
03067 #endif /* PICOS_PRIV_H */
03068 
03069 /*-------------------------------------------------------------------------*/
03070 
03071 /* include the header of the nano layer */
03072 
03073 #ifdef POSNANO
03074 #ifdef POSCFG_ENABLE_NANO
03075 #undef POSCFG_ENABLE_NANO
03076 #endif
03077 #define POSCFG_ENABLE_NANO  1
03078 #else
03079 #ifndef POSCFG_ENABLE_NANO
03080 #define POSCFG_ENABLE_NANO  0
03081 #endif
03082 #endif
03083 #if POSCFG_ENABLE_NANO != 0
03084 #ifdef PICOSUBDIR
03085 /* required because of stupid CC65 compiler */
03086 #include <picoos\pos_nano.h>
03087 #else
03088 #include <pos_nano.h>
03089 #endif
03090 #endif
03091 
03092 /*-------------------------------------------------------------------------*/
03093 
03094 /* defaults for hooks */
03095 
03096 #ifndef POSCFG_TASKEXIT_HOOK
03097 #define POSCFG_TASKEXIT_HOOK  0
03098 #endif
03099 
03100 /*-------------------------------------------------------------------------*/
03101 
03102 /* fully define the task structure */
03103 
03104 #ifndef NOS_TASKDATA
03105 #define NOS_TASKDATA
03106 #endif
03107 
03108 #if POSCFG_TASKEXIT_HOOK != 0
03109 typedef enum {
03110  texh_exitcalled,
03111  texh_freestackmem
03112 } texhookevent_t;
03113 typedef void (*POSTASKEXITFUNC_t)(POSTASK_t task, texhookevent_t event);
03114 #endif
03115 
03116 struct POSTASK {
03117     POS_USERTASKDATA
03118     NOS_TASKDATA
03119 #if POSCFG_TASKCB_USERSPACE > 0
03120     UVAR_t      usrspace[(POSCFG_TASKCB_USERSPACE + POSCFG_ALIGNMENT +
03121                          sizeof(UVAR_t)-2) / sizeof(UVAR_t)];
03122 #endif
03123 #if POSCFG_TASKEXIT_HOOK != 0
03124     POSTASKEXITFUNC_t  exithook;
03125 #endif
03126 #if DOX==0
03127 #if POSCFG_ARGCHECK > 1
03128     UVAR_t      magic;
03129 #endif
03130 #if SYS_TASKDOUBLELINK != 0
03131     struct POSTASK  *prev;
03132 #endif
03133     struct POSTASK  *next;
03134     UVAR_t      bit_x;
03135 #if SYS_TASKTABSIZE_Y > 1
03136     UVAR_t      bit_y;
03137     UVAR_t      idx_y;
03138 #endif
03139 #ifndef POS_DEBUGHELP
03140     UINT_t      ticks;
03141 #endif
03142 #if SYS_TASKSTATE != 0
03143     UVAR_t      state;
03144 #endif
03145 #if POSCFG_FEATURE_ERRNO != 0
03146     VAR_t       error;
03147 #endif
03148 #if POSCFG_FEATURE_MSGBOXES != 0
03149     UVAR_t      msgwait;
03150     POSSEMA_t   msgsem;
03151     void        *firstmsg;
03152     void        *lastmsg;
03153 #endif
03154 #ifdef POS_DEBUGHELP
03155     struct PICOTASK  deb;
03156 #endif
03157 #endif /* !DOX */
03158 };
03159 
03160 
03161 #endif /* _PICOOS_H */
03162 

Generated on Sat Dec 8 14:53:02 2007 for pico]OS by  doxygen 1.5.4