# System + Communication + Diagnostic\r
MOD_AVAIL+=CANIF CANTP COM DCM DEM DET ECUM IOHWAB KERNEL PDUR WDGM RTE\r
# Additional\r
-MOD_AVAIL+=RAMLOG \r
+MOD_AVAIL+=RAMLOG KERNEL_EXTRA\r
#endif\r
\r
#if defined(__GNUC__)\r
-#define SECTION_BALIGN(_align ) __attribute__ ((aligned (_align)));\r
+#define SECTION_BALIGN(_align ) __attribute__ ((aligned (_align)))\r
#else\r
#error SECTION_BALIGN not defined for compiler\r
#endif\r
\r
\r
#if defined(__GNUC__)\r
- #define SECTION_RAMLOG __attribute__ ((section (".ramlog")));\r
+ #define SECTION_RAMLOG __attribute__ ((section (".ramlog")))\r
#elif defined(__CWCC__)\r
#pragma section RW ".ramlog" ".ramlog"\r
#define SECTION_RAMLOG __declspec(section ".ramlog")\r
\r
OsCounterType *cPtr = Os_CfgGetCounter(Os_Arc_OsTickCounter);\r
#if defined(USE_KERNEL_EXTRA)\r
- OsPcbType *pcbPtr;\r
+ OsTaskVarType *pcbPtr;\r
#endif\r
\r
Os_Sys.tick++;\r
\r
#if defined(USE_KERNEL_EXTRA)\r
/* Check sleep() (ST_WAITING) tasks */\r
- TAILQ_FOREACH(pcbPtr, &os_sys.timerHead, timerEntry ) {\r
+ TAILQ_FOREACH(pcbPtr, &Os_Sys.timerHead, timerEntry ) {\r
--pcbPtr->timerDec;\r
if( pcbPtr->timerDec <= 0 ) {\r
/* Remove from the timer queue */\r
- TAILQ_REMOVE(&os_sys.timerHead, pcbPtr, timerEntry);\r
+ TAILQ_REMOVE(&Os_Sys.timerHead, pcbPtr, timerEntry);\r
/* ... and add to the ready queue */\r
Os_TaskMakeReady(pcbPtr);\r
}\r
/* TODO: Arch specific regs .. make space for them later...*/\r
uint32_t regs[16]; // TASK\r
#if defined(USE_KERNEL_EXTRA)\r
- TAILQ_ENTRY(OsPcb) timerEntry; // TASK\r
+ TAILQ_ENTRY(OsTaskVar) timerEntry; // TASK\r
int32_t timerDec;\r
#endif\r
/* List of PCB's */\r
OP_TERMINATE_TASK = 8,\r
OP_SCHEDULE = 16,\r
OP_CHAIN_TASK = 32,\r
- OP_RELEASE_RESOURCE = 64\r
+ OP_RELEASE_RESOURCE = 64,\r
OP_SLEEP = 128,\r
-\r
} OpType ;\r
\r
/*\r
#if defined(USE_KERNEL_EXTRA)\r
\r
/* List of PCB's to be put in ready list when timeout */\r
- TAILQ_HEAD(,OsPcb) timerHead; // TASK\r
+ TAILQ_HEAD(,OsTaskVar) timerHead; // TASK\r
#endif\r
\r
/* List of all pcb's,\r
OS_DEBUG(D_TASK,"Removed %s from ready list\n",pcb->name);\r
}\r
\r
+// Sleeping\r
+#if defined(USE_KERNEL_EXTRA)\r
+static inline void Os_TaskMakeSleeping( OsTaskVarType *pcb )\r
+{\r
+ assert( pcb->state & (ST_READY|ST_RUNNING) );\r
+\r
+ pcb->state = ST_WAITING | ST_SLEEPING;\r
+ TAILQ_REMOVE(&Os_Sys.ready_head,pcb,ready_list);\r
+ OS_DEBUG(D_TASK,"Removed %s from ready list\n",pcb->name);\r
+}\r
+#endif\r
+\r
// Terminate task\r
static inline void Os_TaskMakeSuspended( OsTaskVarType *pcb )\r
{\r
TAILQ_INIT(& Os_Sys.ready_head);
// TAILQ_INIT(& Os_Sys.pcb_head);
#if defined(USE_KERNEL_EXTRA)
- TAILQ_INIT(& os_sys.timerHead);
+ TAILQ_INIT(& Os_Sys.timerHead);
#endif
// Calc interrupt stack
*/\r
\r
StatusType Sleep( TickType sleep ) {\r
- OsPcbType *pcbPtr = Os_TaskGetCurrent();\r
+ OsTaskVarType *pcbPtr;\r
uint32_t flags;\r
\r
Irq_Save(flags);\r
\r
+ pcbPtr = Os_TaskGetCurrent();\r
\r
- if (pcbPtr->proc_type != PROC_EXTENDED) {\r
+ if (pcbPtr->constPtr->proc_type != PROC_EXTENDED) {\r
return E_OS_ACCESS;\r
}\r
\r
\r
if ( Os_SchedulerResourceIsFree() ) {\r
if( sleep != 0 ) {\r
- TAILQ_INSERT_TAIL(&os_sys.timerHead,pcbPtr,timerEntry);\r
+ TAILQ_INSERT_TAIL(&Os_Sys.timerHead,pcbPtr,timerEntry);\r
pcbPtr->timerDec = sleep;\r
Os_Dispatch(OP_SLEEP);\r
} else {\r