vxwTaskLib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:30k
源码类别:

VxWorks

开发平台:

C/C++

  1. // VXWTask/vxwTaskLib.h - task class
  2. // Copyright 1995-1999 Wind River Systems, Inc. 
  3. // modification history
  4. // --------------------
  5. // 01c,08mar99,jdi  doc: fixed wrong cross-references.
  6. // 01b,23feb99,fle  doc : made it refgen compliant
  7. // 01c,21feb99,jdi  added library section, checked in documentation.
  8. // 01b,29sep95,rhp  documented.
  9. // 01a,15jun95,srh  written.
  10. // DESCRIPTION
  11. // This library provides the interface to the VxWorks task management
  12. // facilities.  This class library provides task control services,
  13. // programmatic access to task information and debugging features, and
  14. // higher-level task information display routines.
  15. //
  16. // TASK CREATION
  17. // Tasks are created with the constructor VXWTask::VXWTask().  Task
  18. // creation consists of the following:  allocation of memory for the stack
  19. // and task control block (WIND_TCB), initialization of the WIND_TCB, and
  20. // activation of the WIND_TCB.  Special needs may require the use of the
  21. // lower-level method VXWTask::activate().
  22. //
  23. // Tasks in VxWorks execute in the most privileged state of the underlying
  24. // architecture.  In a shared address space, processor privilege offers no
  25. // protection advantages and actually hinders performance.
  26. //
  27. // There is no limit to the number of tasks created in VxWorks, as long as
  28. // sufficient memory is available to satisfy allocation requirements.
  29. //
  30. // TASK DELETION
  31. // If a task exits its "main" routine, specified during task creation,
  32. // the kernel implicitly calls exit() to delete the task.  Tasks can
  33. // be deleted with the exit() routine, or explicitly with the <delete>
  34. // operator, which arranges to call the class destructor
  35. // VXWTask::~VXWTask().
  36. //
  37. // Task deletion must be handled with extreme care, due to the inherent
  38. // difficulties of resource reclamation.  Deleting a task that owns a
  39. // critical resource can cripple the system, since the resource may no longer
  40. // be available.  Simply returning a resource to an available state is not a
  41. // viable solution, since the system can make no assumption as to the state
  42. // of a particular resource at the time a task is deleted.
  43. //
  44. // A task can protect itself from deletion by taking a
  45. // mutual-exclusion semaphore created with the SEM_DELETE_SAFE option
  46. // (see vxwSemLib for more information).  Many VxWorks system resources
  47. // are protected in this manner, and application designers may wish to
  48. // consider this facility where dynamic task deletion is a
  49. // possibility.
  50. //
  51. // The sigLib facility may also be used to allow a task to
  52. // execute clean-up code before actually expiring.
  53. //
  54. // TASK CONTROL
  55. // The following methods control task state: VXWTask::resume(),
  56. // VXWTask::suspend(), VXWTask::restart(), VXWTask::priority(),
  57. // and VXWTask::registers().
  58. //
  59. // TASK SCHEDULING
  60. // VxWorks schedules tasks on the basis of priority.  Tasks may have
  61. // priorities ranging from 0, the highest priority, to 255, the lowest
  62. // priority.  The priority of a task in VxWorks is dynamic, and an existing
  63. // task's priority can be changed or examined using VXWTask:priority().
  64. //
  65. // INCLUDE FILES: taskLib.h
  66. //
  67. // SEE ALSO: taskLib, taskHookLib, VXWSem,
  68. // kernelLib,
  69. // .pG "Basic OS"
  70. //
  71. // SECTION: 1C
  72. //
  73. #ifndef vxwTaskLib_h
  74. #define vxwTaskLib_h
  75. #include "vxWorks.h"
  76. #include "envLib.h"
  77. #include "errnoLib.h"
  78. #include "sigLib.h"
  79. #include "taskArchLib.h"
  80. #include "taskLib.h"
  81. #include "taskVarLib.h"
  82. #include "vxwObject.h"
  83. #include "vxwErr.h"
  84. class VXWTask : virtual public VXWIdObject
  85.     {
  86.   public:
  87. //_ VXWTask Public Constructors
  88. ///////////////////////////////////////////////////////////////////////////////
  89. //
  90. // VXWTask::VXWTask - initialize a task object
  91. //
  92. // This constructor creates a task object from the task ID of an existing task.
  93. // Because of the VxWorks convention that a task ID of 0 refers to the calling
  94. // task, this constructor can be used to derive a task object for the
  95. // calling task, as follows:
  96. // .CS
  97. // myTask = VXWTask (0);
  98. // .CE
  99. //
  100. // RETURNS: N/A
  101. //
  102. // SEE ALSO: taskLib, VXWTask::~VXWTask(), sp()
  103.     VXWTask (int tid)
  104. : tid_ (tid), managePrivateEnv_ (FALSE)
  105. {
  106. }
  107. ///////////////////////////////////////////////////////////////////////////////
  108. //
  109. // VXWTask::VXWTask - create and spawn a task
  110. //
  111. // This constructor creates and activates a new task with a specified priority
  112. // and options.
  113. //
  114. // A task may be assigned a name as a debugging aid.  This name appears
  115. // in displays generated by various system information facilities such as
  116. // i().  The name may be of arbitrary length and content, but the current
  117. // VxWorks convention is to limit task names to ten characters and prefix
  118. // them with a "t".  If <name> is specified as NULL, an ASCII name is
  119. // assigned to the task of the form "t<n>" where <n> is an integer which
  120. // increments as new tasks are spawned.
  121. //
  122. // The only resource allocated to a spawned task is a stack of a specified
  123. // size <stackSize>, which is allocated from the system memory partition.
  124. // Stack size should be an even integer.  A task control block (TCB) is
  125. // carved from the stack, as well as any memory required by the task name.
  126. // The remaining memory is the task's stack and every byte is filled with the
  127. // value 0xEE for the checkStack() facility.  See the manual entry for
  128. // checkStack() for stack-size checking aids.
  129. //
  130. // The entry address <entryPt> is the address of the "main" routine of the task.
  131. // The routine is called after the C environment is set up.
  132. // The specified routine is called with the ten arguments provided.
  133. // Should the specified main routine return, a call to exit() is
  134. // made automatically.
  135. //
  136. // Note that ten (and only ten) arguments must be passed for the
  137. // spawned function.
  138. //
  139. // Bits in the options argument may be set to run with the following modes:
  140. // .iP VX_FP_TASK 22
  141. // execute with floating-point coprocessor support.
  142. // .iP VX_PRIVATE_ENV
  143. // include private environment support.
  144. // .iP VX_NO_STACK_FILL
  145. // do not fill the stack for use by checkstack().
  146. // .iP VX_UNBREAKABLE
  147. // do not allow breakpoint debugging.
  148. // .LP
  149. // See the definitions in taskLib.h.
  150. //
  151. // RETURNS: N/A
  152. //
  153. // SEE ALSO: VXWTask::~VXWTask(), VXWTask::activate(), sp(),
  154. // .pG "Basic OS"
  155.     VXWTask (char       * name,
  156.      int   priority,
  157.      int   options,
  158.      int   stackSize,
  159.      FUNCPTR   entryPoint,
  160.      int   arg1=0,
  161.      int   arg2=0,
  162.      int   arg3=0,
  163.      int   arg4=0,
  164.      int   arg5=0,
  165.      int   arg6=0,
  166.      int   arg7=0,
  167.      int   arg8=0,
  168.      int   arg9=0,
  169.      int   arg10=0)
  170. : tid_ (taskSpawn (name,
  171.    priority,
  172.    options,
  173.    stackSize,
  174.    entryPoint,
  175.    arg1,
  176.    arg2,
  177.    arg3,
  178.    arg4,
  179.    arg5,
  180.    arg6,
  181.    arg7,
  182.    arg8,
  183.    arg9,
  184.    arg10)), managePrivateEnv_ (FALSE)
  185. {
  186. if (tid_ == ERROR)
  187.     vxwThrowErrno ();
  188. }
  189. ///////////////////////////////////////////////////////////////////////////////
  190. //
  191. // VXWTask::VXWTask - initialize a task with a specified stack
  192. //
  193. // This constructor initializes user-specified regions of memory for a task
  194. // stack and control block instead of allocating them from memory.
  195. // This constructor uses the specified pointers to the WIND_TCB
  196. // and stack as the components of the task.  This allows, for example, the
  197. // initialization of a static WIND_TCB variable.  It also allows for special
  198. // stack positioning as a debugging aid.
  199. //
  200. // As in other constructors, a task may be given a name.  If no name is
  201. // specified, this constructor creates a task without a name (rather 
  202. // than assigning a default name).  
  203. //
  204. // Other arguments are the same as in the previous constructor.  This
  205. // constructor does not activate the task.  This must be done by calling
  206. // VXWTask::activate().
  207. //
  208. // Normally, tasks should be started using the previous constructor rather
  209. // than this one,
  210. // except when additional control is required for task memory allocation or
  211. // a separate task activation is desired.
  212. //
  213. // RETURNS: OK, or ERROR if the task cannot be initialized.
  214. //
  215. // SEE ALSO: VXWTask::activate()
  216.     VXWTask (WIND_TCB * pTcb,
  217.      char       * name,
  218.      int   priority,
  219.      int   options,
  220.      char * pStackBase,
  221.      int   stackSize,
  222.      FUNCPTR   entryPoint,
  223.      int   arg1=0,
  224.      int   arg2=0,
  225.      int   arg3=0,
  226.      int   arg4=0,
  227.      int   arg5=0,
  228.      int   arg6=0,
  229.      int   arg7=0,
  230.      int   arg8=0,
  231.      int   arg9=0,
  232.      int   arg10=0)
  233. : tid_ (-1), managePrivateEnv_ (FALSE)
  234. {
  235. if (taskInit (pTcb,
  236.       name,
  237.       priority,
  238.       options,
  239.       pStackBase,
  240.       stackSize,
  241.       entryPoint,
  242.       arg1,
  243.       arg2,
  244.       arg3,
  245.       arg4,
  246.       arg5,
  247.       arg6,
  248.       arg7,
  249.       arg8,
  250.       arg9,
  251.       arg10) != OK)
  252.     vxwThrowErrno ();
  253. else
  254.     tid_ = int (pTcb);
  255. }
  256. ///////////////////////////////////////////////////////////////////////////////
  257. //
  258. // VXWTask::~VXWTask - delete a task
  259. //
  260. // This destructor causes the task to cease to exist and deallocates the
  261. // stack and WIND_TCB memory resources.  Upon deletion, all routines specified
  262. // by taskDeleteHookAdd() are called in the context of the deleting task.
  263. //
  264. // RETURNS: N/A
  265. //
  266. // SEE ALSO: excLib, taskDeleteHookAdd(), VXWTask::VXWTask(),
  267. // .pG "Basic OS"
  268.     virtual ~VXWTask ()
  269. {
  270. if (managePrivateEnv_ && envPrivateDestroy (tid_) != OK)
  271.     vxwThrowErrno ();
  272. if (taskDelete (tid_) != OK)
  273.     vxwThrowErrno ();
  274. }
  275. //_ VXWTask Public Member Functions
  276. ///////////////////////////////////////////////////////////////////////////////
  277. //
  278. // VXWTask::activate - activate a task
  279. //
  280. // This routine activates tasks created by the form of the constructor 
  281. // that does not automatically activate a task.  Without activation, a
  282. // task is ineligible for CPU allocation by the scheduler.
  283. // 
  284. // RETURNS: OK, or ERROR if the task cannot be activated.
  285. //
  286. // SEE ALSO: VXWTask::VXWTask()
  287.     STATUS activate ()
  288. {
  289. return taskActivate (tid_);
  290. }
  291. ///////////////////////////////////////////////////////////////////////////////
  292. //
  293. // VXWTask::deleteForce - delete a task without restriction
  294. //
  295. // This routine deletes a task even if the task is protected from deletion.  
  296. // It is similar to VXWTask::~VXWTask().  Upon deletion, all routines
  297. // specified by taskDeleteHookAdd() are called in the context of the
  298. // deleting task.
  299. //
  300. // CAVEATS
  301. // This routine is intended as a debugging aid, and is generally inappropriate
  302. // for applications.  Disregarding a task's deletion protection could leave the
  303. // the system in an unstable state or lead to system deadlock.
  304. //
  305. // The system does not protect against simultaneous VXWTask:deleteForce() calls.
  306. // Such a situation could leave the system in an unstable state.
  307. //
  308. // RETURNS: OK, or ERROR if the task cannot be deleted.
  309. //
  310. // SEE ALSO: taskDeleteHookAdd(), VXWTask::~VXWTask()
  311.     STATUS deleteForce ()
  312. {
  313. return taskDeleteForce (tid_);
  314. }
  315. ///////////////////////////////////////////////////////////////////////////////
  316. //
  317. // VXWTask::envCreate - create a private environment
  318. //
  319. // This routine creates a private set of environment variables for a specified
  320. // task, if the environment variable task create hook is not installed.
  321. //
  322. // RETURNS: OK, or ERROR if memory is insufficient.
  323. //
  324. // SEE ALSO: envLib
  325.     STATUS envCreate (int envSource)
  326. {
  327. STATUS rval = OK;
  328. if (envPrivateCreate (tid_, envSource) != OK)
  329.     rval = ERROR;
  330. managePrivateEnv_ = TRUE;
  331. return rval;
  332. }
  333. ///////////////////////////////////////////////////////////////////////////////
  334. //
  335. // VXWTask::errNo - retrieve error status value
  336. //
  337. // This routine gets the error status for the task.
  338. //
  339. // RETURNS:
  340. // The error status value contained in `errno'.
  341. //
  342.     int errNo () const
  343. {
  344. return errnoOfTaskGet (tid_);
  345. }
  346. ///////////////////////////////////////////////////////////////////////////////
  347. //
  348. // VXWTask::errNo - set error status value 
  349. //
  350. // This routine sets the error status value for its task.
  351. //
  352. // RETURNS: OK.
  353.     STATUS errNo (int errorValue)
  354. {
  355. return errnoOfTaskSet (tid_, errorValue);
  356. }
  357. ///////////////////////////////////////////////////////////////////////////////
  358. //
  359. // VXWTask::id - reveal task ID 
  360. //
  361. // This routine reveals the task ID for its task. The task ID is necessary
  362. // to call C routines that affect or inquire on a task.
  363. //
  364. // RETURNS: task ID
  365. //
  366. // SEE ALSO: taskLib
  367.     int id () const
  368. {
  369. return tid_;
  370. }
  371. ///////////////////////////////////////////////////////////////////////////////
  372. //
  373. // VXWTask::info - get information about a task
  374. //
  375. // This routine fills in a specified task descriptor (TASK_DESC) for its
  376. // task.  The information in the task descriptor is, for the most
  377. // part, a copy of information kept in the task control block (WIND_TCB).
  378. // The TASK_DESC structure is useful for common information and avoids
  379. // dealing directly with the unwieldy WIND_TCB.
  380. //
  381. // NOTE
  382. // Examination of WIND_TCBs should be restricted to debugging aids.
  383. //
  384. // RETURNS: OK
  385.     STATUS info (TASK_DESC *pTaskDesc) const
  386. {
  387. return taskInfoGet (tid_, pTaskDesc);
  388. }
  389. ///////////////////////////////////////////////////////////////////////////////
  390. //
  391. // VXWTask::isReady - check if task is ready to run
  392. //
  393. // This routine tests the status field of its task to determine
  394. // whether the task is ready to run.
  395. //
  396. // RETURNS: TRUE if the task is ready, otherwise FALSE.
  397.     BOOL isReady () const
  398. {
  399. return taskIsReady (tid_);
  400. }
  401. ///////////////////////////////////////////////////////////////////////////////
  402. //
  403. // VXWTask::isSuspended - check if task is suspended
  404. //
  405. // This routine tests the status field of its task to determine
  406. // whether the task is suspended.
  407. //
  408. // RETURNS: TRUE if the task is suspended, otherwise FALSE.
  409.     BOOL isSuspended () const
  410. {
  411. return taskIsSuspended (tid_);
  412. }
  413. ///////////////////////////////////////////////////////////////////////////////
  414. //
  415. // VXWTask::kill - send a signal to task
  416. //
  417. // This routine sends a signal <signo> to its task.
  418. //
  419. // RETURNS: OK (0), or ERROR (-1) if the signal number is invalid.
  420. //
  421. // ERRNO: EINVAL
  422.     int kill (int signo)
  423. {
  424. return ::kill (tid_, signo);
  425. }
  426. ///////////////////////////////////////////////////////////////////////////////
  427. //
  428. // VXWTask::name - get the name associated with a task ID
  429. //
  430. // This routine returns a pointer to the name of its task, if
  431. // it has a name; otherwise it returns NULL.
  432. //
  433. // RETURNS: A pointer to the task name, or NULL.
  434.     char * name () const
  435. {
  436. return taskName (tid_);
  437. }
  438. ///////////////////////////////////////////////////////////////////////////////
  439. //
  440. // VXWTask::options - examine task options
  441. //
  442. // This routine gets the current execution options of its task.
  443. // The option bits returned indicate the following modes:
  444. // .iP VX_FP_TASK 22
  445. // execute with floating-point coprocessor support.
  446. // .iP VX_PRIVATE_ENV
  447. // include private environment support (see envLib).
  448. // .iP VX_NO_STACK_FILL
  449. // do not fill the stack for use by checkstack().
  450. // .iP VX_UNBREAKABLE
  451. // do not allow breakpoint debugging.
  452. // .LP
  453. // For definitions, see taskLib.h.
  454. //
  455. // RETURNS: OK.
  456.     STATUS options (int *pOptions) const
  457. {
  458. return taskOptionsGet (tid_, pOptions);
  459. }
  460. ///////////////////////////////////////////////////////////////////////////////
  461. //
  462. // VXWTask::options - change task options
  463. //
  464. // This routine changes the execution options of its task.
  465. // The only option that can be changed after a task has been created is:
  466. // .iP VX_UNBREAKABLE 21
  467. // do not allow breakpoint debugging.
  468. // .LP
  469. // For definitions, see taskLib.h.
  470. //
  471. // RETURNS: OK.
  472.     STATUS options (int mask, int newOptions)
  473. {
  474. return taskOptionsSet (tid_, mask, newOptions);
  475. }
  476. ///////////////////////////////////////////////////////////////////////////////
  477. //
  478. // VXWTask::priority - examine the priority of task
  479. //
  480. // This routine reports the current priority of its task.
  481. // The current priority is copied to the integer pointed to by <pPriority>.
  482. //
  483. // RETURNS: OK.
  484.     STATUS priority (int *pPriority) const
  485. {
  486. return taskPriorityGet (tid_, pPriority);
  487. }
  488. ///////////////////////////////////////////////////////////////////////////////
  489. //
  490. // VXWTask::priority - change the priority of a task
  491. //
  492. // This routine changes its task's priority to a specified priority.
  493. // Priorities range from 0, the highest priority, to 255, the lowest priority.
  494. //
  495. // RETURNS: OK.
  496.     STATUS priority (int newPriority)
  497. {
  498. return taskPrioritySet (tid_, newPriority);
  499. }
  500. ///////////////////////////////////////////////////////////////////////////////
  501. //
  502. // VXWTask::registers - set a task's registers
  503. //
  504. // This routine loads a specified register set <pRegs> into the
  505. // task's TCB.
  506. //
  507. // NOTE
  508. // This routine only works well if the task is known not to be in the ready
  509. // state.  Suspending the task before changing the register set is
  510. // recommended.
  511. //
  512. // RETURNS: OK.
  513. //
  514. // SEE ALSO: VXWTask::suspend()
  515.     STATUS registers (const REG_SET *pRegs)
  516. {
  517. return taskRegsSet (tid_, (REG_SET *)(pRegs));
  518. }
  519. ///////////////////////////////////////////////////////////////////////////////
  520. //
  521. // VXWTask::registers - get task registers from the TCB
  522. //
  523. // This routine gathers task information kept in the TCB.  It copies the
  524. // contents of the task's registers to the register structure <pRegs>.
  525. //
  526. // NOTE
  527. // This routine only works well if the task is known to be in a stable,
  528. // non-executing state.  Self-examination, for instance, is not advisable,
  529. // as results are unpredictable.
  530. //
  531. // RETURNS: OK.
  532. //
  533. // SEE ALSO: VXWTask::suspend()
  534.     STATUS registers (REG_SET *pRegs) const
  535. {
  536. return taskRegsGet (tid_, pRegs);
  537. }
  538. ///////////////////////////////////////////////////////////////////////////////
  539. //
  540. // VXWTask::restart - restart task
  541. //
  542. // This routine "restarts" its task.  The task is first terminated, and then
  543. // reinitialized with the same ID, priority, options, original entry point,
  544. // stack size, and parameters it had when it was terminated.  Self-restarting
  545. // of a calling task is performed by the exception task.  
  546. //
  547. // NOTE
  548. // If the task has modified any of its start-up parameters, the restarted
  549. // task will start with the changed values.
  550. //
  551. // RETURNS: OK, or ERROR if the task could not be restarted.
  552.     STATUS restart ()
  553. {
  554. return taskRestart (tid_);
  555. }
  556. ///////////////////////////////////////////////////////////////////////////////
  557. //
  558. // VXWTask::resume - resume task
  559. //
  560. // This routine resumes its task.  Suspension is cleared, and
  561. // the task operates in the remaining state.
  562. //
  563. // RETURNS: OK, or ERROR if the task cannot be resumed.
  564.     STATUS resume ()
  565. {
  566. return taskResume (tid_);
  567. }
  568. ///////////////////////////////////////////////////////////////////////////////
  569. //
  570. // VXWTask::show - display the contents of task registers
  571. //
  572. // This routine displays the register contents of its task
  573. // on standard output.
  574. //
  575. // EXAMPLE: The following shell command line displays the register of a task
  576. // `vxwT28':
  577. // .CS 4
  578. // -> vxwT28.show ()
  579. // .CE
  580. //
  581. // The example prints on standard output a display like the following
  582. // (68000 family):
  583. // .CS
  584. // d0     =        0   d1     =        0    d2    =    578fe    d3     =        1
  585. // d4     =   3e84e1   d5     =   3e8568    d6    =        0    d7     = ffffffff
  586. // a0     =        0   a1     =        0    a2    =    4f06c    a3     =    578d0
  587. // a4     =   3fffc4   a5     =        0    fp    =   3e844c    sp     =   3e842c
  588. // sr     =     3000   pc     =    4f0f2
  589. // .CE
  590. //
  591. // RETURNS: N/A
  592.     void show () const
  593. {
  594. taskRegsShow (tid_);
  595. }
  596. ///////////////////////////////////////////////////////////////////////////////
  597. //
  598. // VXWTask::show - display task information from TCBs
  599. //
  600. // This routine displays the contents of its task's task control block (TCB).
  601. // If <level> is 1, it also displays task options
  602. // and registers.  If <level> is 2, it displays all tasks.
  603. //
  604. // The TCB display contains the following fields:
  605. //
  606. // .TS
  607. // tab(|);
  608. // lf3 lf3
  609. // l l .
  610. // Field  | Meaning
  611. // _
  612. // NAME   | Task name
  613. // ENTRY  | Symbol name or address where task began execution
  614. // TID    | Task ID
  615. // PRI    | Priority
  616. // STATUS | Task status, as formatted by taskStatusString()
  617. // PC     | Program counter
  618. // SP     | Stack pointer
  619. // ERRNO  | Most recent error code for this task
  620. // DELAY  | If task is delayed, number of clock ticks remaining in delay (0 otherwise)
  621. // .TE
  622. //
  623. // EXAMPLE:
  624. // The following example shows the TCB contents for a task named `t28':
  625. // .CS
  626. // 
  627. //     NAME        ENTRY    TID    PRI  STATUS      PC       SP    ERRNO  DELAY
  628. //   ---------- --------- -------- --- --------- -------- -------- ------ -----
  629. //   t28        _appStart 20efcac   1 READY      201dc90  20ef980      0     0
  630. // 
  631. //   stack: base 0x20efcac  end 0x20ed59c  size 9532   high 1452   margin 8080
  632. // 
  633. //   options: 0x1e
  634. //   VX_UNBREAKABLE      VX_DEALLOC_STACK    VX_FP_TASK         VX_STDIO
  635. // 
  636. // 
  637. //   D0 =       0   D4 =       0   A0 =       0   A4 =        0
  638. //   D1 =       0   D5 =       0   A1 =       0   A5 =  203a084   SR =     3000
  639. //   D2 =       0   D6 =       0   A2 =       0   A6 =  20ef9a0   PC =  2038614
  640. //   D3 =       0   D7 =       0   A3 =       0   A7 =  20ef980
  641. // .CE
  642. //
  643. // RETURNS: N/A
  644. //
  645. // SEE ALSO:
  646. // VXWTaskstatusString(),
  647. // .tG "The Tornado Shell"
  648.     STATUS show (int level) const
  649. {
  650. return taskShow (tid_, level);
  651. }
  652. ///////////////////////////////////////////////////////////////////////////////
  653. //
  654. // VXWTask::sigqueue - send a queued signal to task
  655. // 
  656. // The routine sigqueue() sends to its task the signal specified by <signo> with
  657. // the signal-parameter value specified by <value>.
  658. //
  659. // RETURNS: OK (0), or ERROR (-1) if the signal number is invalid,
  660. // or if there are no queued-signal buffers available.
  661. //
  662. // ERRNO: EINVAL EAGAIN
  663.     int sigqueue (int signo, const union sigval value)
  664. {
  665. return ::sigqueue (tid_, signo, value);
  666. }
  667. #if   (CPU_FAMILY == MC680X0)
  668. ///////////////////////////////////////////////////////////////////////////////
  669. //
  670. // VXWTask::SRSet - set the task status register (MC680x0, MIPS, i386/i486)
  671. //
  672. // SYNOPSIS (I80X86)
  673. // .CS
  674. // STATUS SRSet
  675. //     (
  676. //     UINT sr
  677. //     )
  678. // .CE
  679. //
  680. // SYNOPSIS (MIPS)
  681. // .CS
  682. // STATUS SRSet
  683. //     (
  684. //     UINT32 sr
  685. //     )
  686. // .CE
  687. //
  688. // This routine sets the status register of a task that is not running;
  689. // that is, you must not call this->SRSet().
  690. // Debugging facilities use this routine to set the trace bit in the 
  691. // status register of a task that is being single-stepped.
  692. //
  693. // RETURNS: OK.
  694.     STATUS SRSet (UINT16 sr)
  695. #elif (CPU_FAMILY == I80X86)
  696.     STATUS SRSet (UINT sr)
  697. #elif (CPU_FAMILY == MIPS)
  698.     STATUS SRSet (UINT32 sr)
  699. #endif
  700. #if (CPU_FAMILY == MC680X0) || (CPU_FAMILY == I80X86) || (CPU_FAMILY == MIPS)
  701. {
  702. return taskSRSet (tid_, sr);
  703. }
  704. #endif
  705. ///////////////////////////////////////////////////////////////////////////////
  706. //
  707. // VXWTask::statusString - get task status as a string
  708. //
  709. // This routine deciphers the WIND task status word in the TCB for its
  710. // task, and copies the appropriate string to <pString>.
  711. // 
  712. // The formatted string is one of the following:
  713. //
  714. // .TS
  715. // tab(|);
  716. // lf3 lf3
  717. // l l .
  718. // String   | Meaning
  719. // _
  720. // READY    | Task is not waiting for any resource other than the CPU.
  721. // PEND     | Task is blocked due to the unavailability of some resource.
  722. // DELAY    | Task is asleep for some duration.
  723. // SUSPEND  | Task is unavailable for execution (but not suspended, delayed, or pended).
  724. // DELAY+S  | Task is both delayed and suspended.
  725. // PEND+S   | Task is both pended and suspended.
  726. // PEND+T   | Task is pended with a timeout.
  727. // PEND+S+T | Task is pended with a timeout, and also suspended.
  728. // &...+I  | Task has inherited priority (+I may be appended to any string above).
  729. // DEAD     | Task no longer exists.
  730. // .TE
  731. //
  732. // RETURNS: OK.
  733.     STATUS statusString (char *pString) const
  734. {
  735. return taskStatusString (tid_, pString);
  736. }
  737. ///////////////////////////////////////////////////////////////////////////////
  738. //
  739. // VXWTask::suspend - suspend task
  740. //
  741. // This routine suspends its task.  Suspension is additive:  thus, tasks
  742. // can be delayed and suspended, or pended and suspended.  Suspended, delayed
  743. // tasks whose delays expire remain suspended.  Likewise, suspended,
  744. // pended tasks that unblock remain suspended only.
  745. //
  746. // Care should be taken with asynchronous use of this facility.  The 
  747. // task is suspended regardless of its current state.  The task could, for
  748. // instance, have mutual exclusion to some system resource, such as the network
  749. // or system memory partition.  If suspended during such a time, the facilities
  750. // engaged are unavailable, and the situation often ends in deadlock.
  751. //
  752. // This routine is the basis of the debugging and exception handling packages.
  753. // However, as a synchronization mechanism, this facility should be rejected 
  754. // in favor of the more general semaphore facility.
  755. //
  756. // RETURNS: OK, or ERROR if the task cannot be suspended.
  757.     STATUS suspend ()
  758. {
  759. return taskSuspend (tid_);
  760. }
  761. ///////////////////////////////////////////////////////////////////////////////
  762. //
  763. // VXWTask::tcb - get the task control block
  764. //
  765. // This routine returns a pointer to the task control block (WIND_TCB) for
  766. // its task.  Although all task state information is contained in the
  767. // TCB, users must not modify it directly.  To change registers, for instance,
  768. // use VXWTask::registers().
  769. //
  770. // RETURNS: A pointer to a WIND_TCB.
  771.     WIND_TCB * tcb () const
  772. {
  773. return taskTcb (tid_);
  774. }
  775. ///////////////////////////////////////////////////////////////////////////////
  776. //
  777. // VXWTask::varAdd - add a task variable to task
  778. //
  779. // This routine adds a specified variable <pVar> (4-byte memory location) to
  780. // its task's context.  After calling this routine, the variable is
  781. // private to the task.  The task can access and modify the variable, but
  782. // the modifications are not visible to other tasks, and other tasks'
  783. // modifications to that variable do not affect the value seen by the
  784. // task.  This is accomplished by saving and restoring the variable's initial
  785. // value each time a task switch occurs to or from the calling task.
  786. //
  787. // This facility can be used when a routine is to be spawned repeatedly as
  788. // several independent tasks.  Although each task has its own stack,
  789. // and thus separate stack variables, they all share the same static and
  790. // global variables.  To make a variable f2notfP shareable, the routine can
  791. // call VXWTask::varAdd() to make a separate copy of the variable for each
  792. // task, but all at the same physical address.
  793. //
  794. // Note that task variables increase the task switch time to and from the
  795. // tasks that own them.  Therefore, it is desirable to limit the number of
  796. // task variables that a task uses.  One efficient way to use task variables 
  797. // is to have a single task variable that is a pointer to a dynamically 
  798. // allocated structure containing the task's private data.
  799. //
  800. // EXAMPLE:
  801. // Assume that three identical tasks are spawned with a main routine called
  802. // f2operator()f1.  All three use the structure OP_GLOBAL for all variables
  803. // that are specific to a particular incarnation of the task.  The following
  804. // code fragment shows how this is set up:
  805. //
  806. // .CS
  807. // OP_GLOBAL *opGlobal;  // ptr to operator task's global variables
  808. // VXWTask   me;         // task object for self
  809. //
  810. // void operator
  811. //     (
  812. //     int opNum         // number of this operator task 
  813. //     )
  814. //     {
  815. //     me = VXWTask (0); // task object for running task
  816. //     if (me.varAdd ((int *)&opGlobal) != OK)
  817. //         {
  818. //         printErr ("operator%d: can't VXWTask::varAdd opGlobalen", opNum);
  819. //         me.suspend ();
  820. //         }
  821. //
  822. //     if ((opGlobal = (OP_GLOBAL *) malloc (sizeof (OP_GLOBAL))) == NULL)
  823. //         {
  824. //         printErr ("operator%d: can't malloc opGlobalen", opNum);
  825. //         me.suspend ();
  826. //         }
  827. //     ...
  828. //     }
  829. // .CE
  830. //
  831. // RETURNS:
  832. // OK, or ERROR if memory is insufficient for the task variable descriptor.
  833. //
  834. // SEE ALSO: VXWTask::varDelete(), VXWTask::varGet(), VXWTask::varSet()
  835.     STATUS varAdd (int * pVar)
  836. {
  837. return taskVarAdd (tid_, pVar);
  838. }
  839. ///////////////////////////////////////////////////////////////////////////////
  840. //
  841. // VXWTask::varDelete - remove a task variable from task
  842. //
  843. // This routine removes a specified task variable, <pVar>, from its
  844. // task's context.  The private value of that variable is lost.
  845. //
  846. // RETURNS
  847. // OK, or
  848. // ERROR if the task variable does not exist for the task.
  849. //
  850. // SEE ALSO: VXWTask::varAdd(), VXWTask::varGet(), VXWTask:varSet()
  851.     STATUS varDelete (int * pVar)
  852. {
  853. return taskVarDelete (tid_, pVar);
  854. }
  855. ///////////////////////////////////////////////////////////////////////////////
  856. //
  857. // VXWTask::varGet - get the value of a task variable
  858. //
  859. // This routine returns the private value of a task variable for its
  860. // task.  The task is usually not the calling task,
  861. // which can get its private value by directly accessing the variable.
  862. // This routine is provided primarily for debugging purposes.
  863. //
  864. // RETURNS:
  865. // The private value of the task variable, or
  866. // ERROR if the task does not own the task variable.
  867. //
  868. // SEE ALSO: VXWTask::varAdd(), VXWTask::varDelete(), VXWTask::varSet()
  869.     int varGet (int * pVar) const
  870. {
  871. return taskVarGet (tid_, pVar);
  872. }
  873. ///////////////////////////////////////////////////////////////////////////////
  874. //
  875. // VXWTask::varInfo - get a list of task variables
  876. //
  877. // This routine provides the calling task with a list of all of the task
  878. // variables of its task.  The unsorted array of task variables is
  879. // copied to <varList>.
  880. //
  881. // CAVEATS
  882. // Kernel rescheduling is disabled while task variables are
  883. // looked up.  
  884. //
  885. // There is no guarantee that all the task variables are still
  886. // valid or that new task variables have not been created by the time this
  887. // routine returns.
  888. //
  889. // RETURNS: The number of task variables in the list.
  890.     int varInfo (TASK_VAR varList[], int maxVars) const
  891. {
  892. return taskVarInfo (tid_, varList, maxVars);
  893. }
  894. ///////////////////////////////////////////////////////////////////////////////
  895. //
  896. // VXWTask::varSet - set the value of a task variable
  897. //
  898. // This routine sets the private value of the task variable for a specified
  899. // task.  The specified task is usually not the calling task, which can set
  900. // its private value by directly modifying the variable.  This routine is
  901. // provided primarily for debugging purposes.
  902. //
  903. // RETURNS:
  904. // OK, or ERROR if the task does not own the task variable.
  905. //
  906. // SEE ALSO: VXWTask::varAdd(), VXWTask::varDelete(), VXWTask::varGet()
  907.     STATUS varSet (int * pVar, int value)
  908. {
  909. return taskVarSet (tid_, pVar, value);
  910. }
  911.   protected:
  912.     VXWTask ()
  913. {
  914. }
  915.     VXWTask (const VXWTask &)
  916. {
  917. }
  918.     VXWTask & operator = (const VXWTask &)
  919. {
  920. return *this;
  921. }
  922.     virtual void * myValue ();
  923.     int tid_;
  924.     BOOL managePrivateEnv_;
  925.     };
  926. #endif /* ifndef vxwTaskLib_h */