00001
00002
00003
00004
00005
00006
00007
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
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
00283
00284
00285
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
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
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
00630
00631
00632
00633
00634
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
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
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
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
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;
00902
00903
00904
00905
00906
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
00934
00935
00936
00937
00938
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
01006
01007
01142
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
01148 POSFROMEXT UVAR_t POSCALL p_pos_findbit(const UVAR_t bitfield);
01149 #define POS_FINDBIT(bf) p_pos_findbit(bf)
01150 #define POS_FINDBIT_EX(bf, ofs) p_pos_findbit(bf)
01151 #endif
01152 #else
01153 #ifdef FINDBIT
01154 #define POS_FINDBIT(bf) FINDBIT(bf, 0)
01155 #define POS_FINDBIT_EX(bf, ofs) FINDBIT(bf, ofs)
01156 #else
01157 POSFROMEXT UVAR_t POSCALL p_pos_findbit(const UVAR_t bitfield, UVAR_t rrOffset);
01158 #define POS_FINDBIT(bf) p_pos_findbit(bf, 0)
01159 #define POS_FINDBIT_EX(bf, ofs) p_pos_findbit(bf, ofs)
01160 #endif
01161 #endif
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);
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);
01273 POSFROMEXT void POSCALL p_pos_freeStack(POSTASK_t task);
01274 #endif
01275
01276 #if (DOX!=0) || (POSCFG_PORTMUTEX != 0)
01277
01285 POSFROMEXT void POSCALL p_pos_lock(void);
01286
01290 POSFROMEXT void POSCALL p_pos_unlock(void);
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);
01319
01336 POSFROMEXT void POSCALL p_pos_freeStack(POSTASK_t task);
01337 #endif
01338
01352 POSFROMEXT void POSCALL p_pos_startFirstContext(void);
01353
01368 POSFROMEXT void POSCALL p_pos_softContextSwitch(void);
01369
01383 POSFROMEXT void POSCALL p_pos_intContextSwitch(void);
01384
01393 POSEXTERN void POSCALL c_pos_intEnter(void);
01394
01403 POSEXTERN void POSCALL c_pos_intExit(void);
01404
01437 POSEXTERN void POSCALL c_pos_timerInterrupt(void);
01438
01443
01444
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
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
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
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
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
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
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
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
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
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
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
02761
02764
02765
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
03040
03041 #define POS_SETTASKNAME(taskhandle, name) do { } while(0)
03042 #define POS_SETEVENTNAME(eventhandle, name) do { } while(0)
03043
03044 #endif
03045
03048
03049
03050
03051
03052
03053
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
03068
03069
03070
03071
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
03086 #include <picoos\pos_nano.h>
03087 #else
03088 #include <pos_nano.h>
03089 #endif
03090 #endif
03091
03092
03093
03094
03095
03096 #ifndef POSCFG_TASKEXIT_HOOK
03097 #define POSCFG_TASKEXIT_HOOK 0
03098 #endif
03099
03100
03101
03102
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
03158 };
03159
03160
03161 #endif
03162