]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Fixes to Sleep()
authormahi <devnull@localhost>
Tue, 23 Aug 2011 22:09:36 +0000 (00:09 +0200)
committermahi <devnull@localhost>
Tue, 23 Aug 2011 22:09:36 +0000 (00:09 +0200)
boards/mpc551xsim/examples/os_simple/config/Os_Cfg.c
boards/mpc551xsim/examples/os_simple/config/Os_Cfg.h
boards/mpc551xsim/examples/os_simple/os_simple_mpc551xsim.arxml
include/Os.h
system/kernel/sleep.c

index 41920d3f5908bfdb1fdc42d6fcd9cb72bc46a0fd..c804960f803ebdd43cf56838380bd924d93ec9c1 100644 (file)
@@ -10,7 +10,7 @@
 * Generator version:       2.0.34\r
 *\r
 * Generated by Arctic Studio (http://arccore.com) \r
-*           on Wed Jun 22 23:21:44 CEST 2011\r
+*           on Sun Aug 21 22:59:02 CEST 2011\r
 */\r
 \r
        \r
@@ -30,7 +30,7 @@ OsTickType OsTickFreq = 1000;
 \r
 \r
 // ###############################    DEBUG OUTPUT     #############################\r
-uint32 os_dbg_mask = 0;\r
+uint32 os_dbg_mask = D_RESOURCE |D_SCHTBL |D_EVENT |D_TASK |D_ALARM;\r
  \r
 // ###############################    APPLICATIONS     #############################\r
 GEN_APPLICATION_HEAD = {\r
index cfe5bb540b3ba8d3378a1f74e7fd2a9cdcbcc727..29ba162319f2dbba9ec7e4f4350901bb7cc3622c 100644 (file)
@@ -10,7 +10,7 @@
 * Generator version:       2.0.34\r
 *\r
 * Generated by Arctic Studio (http://arccore.com) \r
-*           on Wed Jun 22 23:21:44 CEST 2011\r
+*           on Sun Aug 21 22:59:02 CEST 2011\r
 */\r
 \r
 
@@ -90,7 +90,7 @@ void eTask2( void );
 #define OS_LINKED_RESOURCE_CNT 0\r
 #define OS_APPLICATION_CNT             1\r
 #define OS_SERVICE_CNT                 0  /* ARCTICSTUDIO_GENERATOR_TODO */\r
-#define CFG_OS_DEBUG                           STD_OFF\r
+#define CFG_OS_DEBUG                           STD_ON\r
 \r
 #define OS_SC1                                                 STD_ON  /* NOT CONFIGURABLE IN TOOLS */\r
 #define OS_USE_APPLICATIONS                    STD_ON\r
index 9605d52fe0d3114e0424b83fdf4fe05654caa9d7..dd01a5c6199d811b18ac87bacf9deb4cd901d1aa 100644 (file)
                 </INTEGER-VALUE>\r
                 <BOOLEAN-VALUE>\r
                   <DEFINITION-REF DEST="BOOLEAN-PARAM-DEF">/ArcCore/Os/OsOS/ArcCoreOsUseDebug</DEFINITION-REF>\r
-                  <VALUE>false</VALUE>\r
+                  <VALUE>true</VALUE>\r
                 </BOOLEAN-VALUE>\r
                 <BOOLEAN-VALUE>\r
                   <DEFINITION-REF DEST="BOOLEAN-PARAM-DEF">/ArcCore/Os/OsOS/ArcCoreOsDebugTask</DEFINITION-REF>\r
-                  <VALUE>false</VALUE>\r
+                  <VALUE>true</VALUE>\r
                 </BOOLEAN-VALUE>\r
                 <BOOLEAN-VALUE>\r
                   <DEFINITION-REF DEST="BOOLEAN-PARAM-DEF">/ArcCore/Os/OsOS/ArcCoreOsDebugAlarm</DEFINITION-REF>\r
-                  <VALUE>false</VALUE>\r
+                  <VALUE>true</VALUE>\r
                 </BOOLEAN-VALUE>\r
                 <BOOLEAN-VALUE>\r
                   <DEFINITION-REF DEST="BOOLEAN-PARAM-DEF">/ArcCore/Os/OsOS/ArcCoreOsDebugResource</DEFINITION-REF>\r
-                  <VALUE>false</VALUE>\r
+                  <VALUE>true</VALUE>\r
                 </BOOLEAN-VALUE>\r
                 <BOOLEAN-VALUE>\r
                   <DEFINITION-REF DEST="BOOLEAN-PARAM-DEF">/ArcCore/Os/OsOS/ArcCoreOsDebugScheduleTable</DEFINITION-REF>\r
-                  <VALUE>false</VALUE>\r
+                  <VALUE>true</VALUE>\r
                 </BOOLEAN-VALUE>\r
                 <BOOLEAN-VALUE>\r
                   <DEFINITION-REF DEST="BOOLEAN-PARAM-DEF">/ArcCore/Os/OsOS/ArcCoreOsDebugEvent</DEFINITION-REF>\r
-                  <VALUE>false</VALUE>\r
+                  <VALUE>true</VALUE>\r
                 </BOOLEAN-VALUE>\r
                 <INTEGER-VALUE>\r
                   <DEFINITION-REF DEST="INTEGER-PARAM-DEF">/ArcCore/Os/OsOS/ArcOsIsrMaxCount</DEFINITION-REF>\r
index eb6ef358dce8c989b31e56f90555a43ad314d557..65442783cfbd8d8cecf05035c79ca41efb5c86ed 100644 (file)
@@ -453,7 +453,11 @@ typedef enum {
     OSServiceId_GetElapsedValue,\r
     OSServiceId_TerminateApplication,\r
     OSServiceId_AllowAccess,\r
-    OSServiceId_GetApplicationState\r
+    OSServiceId_GetApplicationState,\r
+\r
+#if defined(USE_KERNEL_EXTRA)\r
+    OSServiceId_Sleep,\r
+#endif\r
 } OsServiceIdType;\r
 \r
 typedef struct OsError {\r
index 8d337f02476c172eff1b2eb69e215d6a3c5f3307..c7b39941c8b631056a6dad92965b6bae2338f28c 100644 (file)
@@ -1,5 +1,6 @@
 \r
 #include "Os.h"\r
+#include "application.h"\r
 #include "internal.h"\r
 #include "task_i.h"\r
 #include "sys.h"\r
  * tasks. If sleep is 0 it will just call the dispatcher to\r
  * see if there is anything with higher priority to run.\r
  *\r
- *\r
+ * Sleep(0) only makes sense from a NON task (since they highest\r
+ * prio task is always running). SetEvent() nor ActivateTask() will\r
+ * activate a sleeping task.\r
  *
  * @param sleep
  * @return E_OS_ACCESS if called from a basic task\r
  *         E_OS_RESOURCE called while holding a resource\r
- *
+ *         E_OS_CALLEVEL if called from interrupt context\r
+ *         E_OK if called from a FULL task\r
  */\r
 \r
 StatusType Sleep( TickType sleep ) {\r
+       StatusType rv = E_OK;\r
        OsTaskVarType *pcbPtr;\r
        uint32_t flags;\r
 \r
-       Irq_Save(flags);\r
 \r
        pcbPtr = Os_SysTaskGetCurr();\r
 \r
        if (pcbPtr->constPtr->proc_type != PROC_EXTENDED) {\r
-               return E_OS_ACCESS;\r
+               rv = E_OS_ACCESS;\r
+               goto err;\r
+       }\r
+\r
+       /* Check that we are not calling from interrupt context */\r
+       if( Os_Sys.intNestCnt != 0 ) {\r
+               rv =  E_OS_CALLEVEL;\r
+               goto err;\r
        }\r
 \r
        if ( Os_TaskOccupiesResources(pcbPtr) ) {\r
-               return E_OS_RESOURCE;\r
+               rv =  E_OS_RESOURCE;\r
+               goto err;\r
        }\r
 \r
+       Irq_Save(flags);\r
+\r
        if ( Os_SchedulerResourceIsFree() ) {\r
                if( sleep != 0 ) {\r
                        TAILQ_INSERT_TAIL(&Os_Sys.timerHead,pcbPtr,timerEntry);\r
                        pcbPtr->timerDec = sleep;\r
                        Os_Dispatch(OP_SLEEP);\r
                } else {\r
-                       Os_Dispatch(OP_SCHEDULE);\r
-               }\r
 \r
+                       if( Os_SysTaskGetCurr()->constPtr->scheduling != NON ) {\r
+                               return E_OK;\r
+                       }\r
+\r
+                       OsTaskVarType *topTask = Os_TaskGetTop();\r
+                       if( topTask->activePriority  != pcbPtr->activePriority ) {\r
+                               Os_Dispatch(OP_SCHEDULE);\r
+                       }\r
+               }\r
        }\r
 \r
        Irq_Restore(flags);\r
-       return E_OK;\r
+\r
+       OS_STD_END_1(OSServiceId_Sleep,sleep);\r
 }\r