dspLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dspLib.c - dsp support library */
  2. /* Copyright 1998-2000 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01c,14sep00,hk   changed dspInit() to call dspArchInit() always for SH.
  8. 01b,12mar99,jmb  Moved code causing scalabilty problems to target/src/config.
  9. 01a,22jul98,mem  written.
  10. */
  11. /*
  12. DESCRIPTION
  13. This library provides a general interface to the dsp.
  14. To activate dsp support, dspInit() must be called before any
  15. tasks using the dsp are spawned.  This is done automatically by
  16. the root task, usrRoot(), in usrConfig.c when INCLUDE_DSP is defined in
  17. configAll.h.
  18. For information about architecture-dependent dsp routines, see
  19. the manual entry for dspArchLib.
  20. VX_DSP_TASK OPTION
  21. Saving and restoring dsp registers adds to the context switch
  22. time of a task.  Therefore, dsp registers are not saved
  23. and restored for every task.  Only those tasks spawned with the task
  24. option VX_DSP_TASK will have dsp registers saved and restored.
  25. .RS 4 4
  26. %NOTE:  If a task does any dsp operations,
  27. it must be spawned with VX_DSP_TASK.
  28. .RE
  29. INTERRUPT LEVEL
  30. DSP registers are not saved and restored for interrupt
  31. service routines connected with intConnect().  However, if necessary,
  32. an interrupt service routine can save and restore dsp registers
  33. by calling routines in dspArchLib.
  34. INCLUDE FILES: dspLib.h
  35. SEE ALSO: dspArchLib, dspShow, intConnect(),
  36. .pG "Basic OS"
  37. */
  38. #include "vxWorks.h"
  39. #include "objLib.h"
  40. #include "private/taskLibP.h"
  41. #include "taskArchLib.h"
  42. #include "taskHookLib.h"
  43. #include "memLib.h"
  44. #include "iv.h"
  45. #include "regs.h"
  46. #include "logLib.h"
  47. #include "dspLib.h"
  48. /* externals */
  49. /* globals */
  50. FUNCPTR dspCreateHookRtn = NULL;  /* arch dependent create hook routine */
  51. FUNCPTR dspDisplayHookRtn = NULL; /* arch dependent display routine */
  52. /* forward declarations */
  53. LOCAL void dspCreateHook (WIND_TCB *pTcb);
  54. LOCAL void dspSwapHook (WIND_TCB *pOldTcb, WIND_TCB *pNewTcb);
  55. /******************************************************************************
  56. *
  57. * dspInit - initialize dsp support
  58. *
  59. * This routine initializes dsp support and must be
  60. * called before using the dsp.  This is done
  61. * automatically by the root task, usrRoot(), in usrConfig.c when INCLUDE_DSP
  62. * is defined in configAll.h.
  63. * RETURNS: N/A
  64. */
  65. void dspInit (void)
  66.     {
  67. #if (CPU_FAMILY == SH)
  68.     dspArchInit (); /* SH7729 (SH3-DSP) specific initialization */
  69. #endif
  70.     if (dspProbe() == OK)
  71. {
  72. taskCreateHookAdd ((FUNCPTR) dspCreateHook);
  73. taskSwapHookAdd ((FUNCPTR) dspSwapHook);
  74. #if (CPU_FAMILY != SH)
  75.         dspArchInit ();
  76. #endif
  77. }
  78.     }
  79. /******************************************************************************
  80. *
  81. * dspCreateHook - initialize dsp support for task
  82. *
  83. * Carves a dsp context from the end of the stack.
  84. *
  85. * RETURNS: N/A
  86. *
  87. * NOMANUAL
  88. */
  89. LOCAL void dspCreateHook
  90.     (
  91.     WIND_TCB *pTcb /* newly create task tcb */
  92.     )
  93.     {
  94.     /* check for option bit and presence of dsp support */
  95.     if (pTcb->options & VX_DSP_TASK)
  96. {
  97. /* allocate space for saving context and registers */
  98. pTcb->pDspContext = (DSP_CONTEXT *)
  99.   taskStackAllot ((int) pTcb, sizeof (DSP_CONTEXT));
  100. if (pTcb->pDspContext == NULL)
  101.     return;
  102. taskSwapHookAttach ((FUNCPTR) dspSwapHook, (int) pTcb, TRUE, FALSE);
  103. taskLock ();
  104. dspArchTaskCreateInit (pTcb->pDspContext);
  105. taskUnlock ();
  106. if (dspCreateHookRtn != NULL)
  107.     (*dspCreateHookRtn) (pTcb);
  108. }
  109.     }
  110. /******************************************************************************
  111. *
  112. * dspSwapHook - swap in task dsp registers
  113. *
  114. * This routine is the task swap hook that implements the task dsp
  115. * coprocessor registers facility.  It swaps the current and saved values of
  116. * all the task coprocessor registers of the last dsp task and the
  117. * in-coming dsp task.
  118. *
  119. * RETURNS: N/A
  120. *
  121. * NOMANUAL
  122. */
  123. LOCAL void dspSwapHook
  124.     (
  125.     WIND_TCB *pOldTcb, /* task tcb switching out */
  126.     WIND_TCB *pNewTcb /* task tcb switching in */
  127.     )
  128.     {
  129.     if (pTaskLastDspTcb == pNewTcb)
  130. return;
  131.     /* save task coprocessor registers into last dsp task */
  132.     if (pTaskLastDspTcb != NULL) 
  133. dspSave (pTaskLastDspTcb->pDspContext);
  134.     /* restore task coprocessor registers of incoming task */
  135.     dspRestore (pNewTcb->pDspContext);
  136.     pTaskLastDspTcb = pNewTcb;
  137.     }