guitask.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:5k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : GUITASK.C
  16. Purpose     : Saves/Restores task context with supported OSs.
  17.               It also uses a resource semaphore.
  18.   The following externals are used and should typically be defined
  19.   in GUI_X.c:
  20.   
  21.     U32  GUI_X_GetTaskId();
  22.     void GUI_X_Unlock();
  23.     void GUI_X_Lock();
  24. ----------------------------------------------------------------------
  25. Version-Date---Author-Explanation
  26. ----------------------------------------------------------------------
  27. 3.02a   020722 RS     Use of macro GUI_DEBUG_ERROROUT_IF in order
  28.                       to simplify th code.
  29. 3.02    020514 RS     Avoided nested calls of GUI_X_Lock, GUI_X_Unlock
  30.                       (because some RTOSes, such as CMX and u/C-OS
  31.                       could not handle this easily)
  32. 3.00    010425 RS     Cleanup for emWin Version 3.00
  33.                       a) Dummy routines added to avoid link errors
  34.                         in case some emWin modules are compiled with
  35.                         different settings
  36. 1.00.01 990926 RS     Fix in order to make sure init task has no
  37.                       context of its own (_CurrentTaskNo =-1)
  38. 1.00.00 990918 RS     Initial version for version control purposes.
  39.                       This is a generic version which can be used with
  40.                       both emWin b/w and emWin GSC; it is based on the
  41.                       Context saver of emWin b/w.
  42. ---------------------------END-OF-HEADER------------------------------
  43. */
  44. #include <stddef.h>           /* needed for definition of NULL */
  45. #include "GUI_Protected.H"
  46. #include "GUIDEBUG.H"
  47. /*********************************************************************
  48. *
  49. *       Configuration defaults
  50. *
  51. *********************************************************************
  52. */
  53. #ifndef GUI_MAXTASK
  54.   #define GUI_MAXTASK (10)
  55. #endif
  56. #if GUI_OS
  57. /*********************************************************************
  58. *
  59. *       Static data
  60. *
  61. *********************************************************************
  62. */
  63. static struct {
  64.   U32  TaskID;
  65.   GUI_CONTEXT Context;
  66. } _Save[GUI_MAXTASK];
  67. static int _CurrentTaskNo = -1;
  68. static int _EntranceCnt   =  0;
  69. static U32 _TaskIDLock = 0;
  70. /*********************************************************************
  71. *
  72. *       Static functions
  73. *
  74. *********************************************************************
  75. */
  76. static int _GetTaskNo(void) {
  77.   int i;
  78.   for (i=0; i< GUI_MAXTASK; i++) {
  79.     U32 TaskId = GUI_X_GetTaskId();
  80.     if (_Save[i].TaskID == TaskId)
  81.       return i;
  82.     if (_Save[i].TaskID == 0) {
  83.       _Save[i].TaskID = TaskId;
  84.       return i;
  85.     }
  86.   }
  87.   GUI_DEBUG_ERROROUT("No Context available for task ... (increase GUI_MAXTASK)");
  88.   return 0;
  89. }
  90. /*********************************************************************
  91. *
  92. *       Public functions
  93. *
  94. *********************************************************************
  95. */
  96. void GUI_Unlock(void) {
  97.   if (--_EntranceCnt == 0) {
  98.     GUI_X_Unlock();
  99.   }
  100.   /* Test if _EntranceCnt is in reasonable range ... Not required in release builds */
  101.   GUI_DEBUG_ERROROUT_IF((_EntranceCnt < 0), "GUITASK.c: GUI_Unlock() _EntranceCnt underflow ");
  102. }
  103. void GUI_Lock(void) {
  104.   if (_EntranceCnt == 0) {
  105.     GUI_X_Lock();
  106.     _TaskIDLock = GUI_X_GetTaskId();         /* Save task ID */
  107.   } else {
  108.     if (_TaskIDLock != GUI_X_GetTaskId()) {
  109.       GUI_X_Lock();
  110.       _TaskIDLock = GUI_X_GetTaskId();         /* Save task ID */
  111.     }
  112.   }
  113.   if (++_EntranceCnt == 1) {
  114.     int TaskNo = _GetTaskNo();
  115.     if (TaskNo != _CurrentTaskNo) {
  116.       /* Save data of current task */
  117.       if (_CurrentTaskNo>=0) {  /* Make sure _CurrentTaskNo is valid */
  118.         _Save[_CurrentTaskNo].Context = GUI_Context;
  119.       }
  120.       /* Load data of this task */
  121.       GUI_Context = _Save[TaskNo].Context;
  122.       _CurrentTaskNo = TaskNo;
  123.     }
  124.   }
  125.   /* Test if _EntranceCnt is in reasonable range ... Not required in release builds */
  126.   GUI_DEBUG_ERROROUT_IF((_EntranceCnt>12), "GUITASK.c: GUI_Lock() _EntranceCnt overflow ");
  127. }
  128. void GUITASK_Init(void) 
  129. {
  130.   int i;
  131.   _CurrentTaskNo =-1;   /* Invalidate */
  132.   GUI_X_InitOS();
  133.   for (i=0; i<GUI_MAXTASK; i++) {
  134.     _Save[i].Context = GUI_Context;
  135. _Save[i].TaskID  = 0;
  136.   }
  137. }
  138. #else
  139. /*********************************************************************
  140. *
  141. *       Dummy Kernel routines
  142. The routines below are dummies in case configuration tells us not
  143. to use any kernel. In this case the routines below should
  144. not be required, but it can not hurt to have them. The linker
  145. will eliminate them anyhow.
  146. */
  147. void GUI_Unlock(void) {}
  148. void GUI_Lock(void) {}
  149. void GUITASK_Init(void) {}
  150. void GUITASK_StoreDefaultContext(void) {}
  151. #endif