#include "system_stm32f10x.h"
\r
//#define USE_TRACE 1\r
-//#define USE_DEBUG 1\r
+//#define USE_DEBUG_PRINT 1\r
#include "Trace.h"\r
\r
typedef struct {\r
\r
\r
\r
-#if defined(USE_DEBUG)\r
+#if defined(USE_DEBUG_PRINT)\r
{\r
uint32 extal = Mcu_Global.config->McuClockSettingConfig[Mcu_Global.clockSetting].McuClockReferencePointFrequency;\r
uint32 f_sys;\r
#include "Ramlog.h"\r
\r
#define USE_TRACE 1\r
-#define USE_DEBUG 1\r
+#define USE_DEBUG_PRINT 1\r
#include "Trace.h"
#include <assert.h>
#include <string.h>
-//#define USE_DEBUG 1
+//#define USE_DEBUG_PRINT 1
#include "Trace.h"
#define MODULE_NAME "/driver/Eep"
#include "irq.h"\r
\r
//#define USE_TRACE 1\r
-//#define USE_DEBUG 1\r
+//#define USE_DEBUG_PRINT 1\r
#include "Trace.h"\r
\r
#define SYSCLOCK_SELECT_PLL 0x2\r
#endif\r
\r
\r
-#if defined(USE_DEBUG)\r
+#if defined(USE_DEBUG_PRINT)\r
{\r
uint32 extal = Mcu_Global.config->McuClockSettingConfig[Mcu_Global.clockSetting].McuClockReferencePointFrequency;\r
uint32 f_sys;\r
#include <stdlib.h>
//#define USE_TRACE 1
-//#define USE_DEBUG 1
+//#define USE_DEBUG_PRINT 1
#undef DEBUG_LVL
#define DEBUG_LVL DEBUG_HIGH
#include "Trace.h"
DEBUG(DEBUG_MEDIUM,"%s: sync/polled mode\n",MODULE_NAME);
}
-#if defined(USE_DEBUG) && ( DEBUG_LVL <= DEBUG_HIGH )
+#if defined(USE_DEBUG_PRINT) && ( DEBUG_LVL <= DEBUG_HIGH )
Spi_PrintSeqInfo( seqConfig );
#endif
#include "mpc55xx.h"\r
#include "asm_book_e.h"
\r
-#define USE_DEBUG\r
+#define USE_DEBUG_PRINT\r
#include "Trace.h"\r
\r
/**\r
#include "Spi_Cfg.h"
//#define USE_TRACE 1
-//#define USE_DEBUG 1
+//#define USE_DEBUG_PRINT 1
#undef DEBUG_LVL
#define DEBUG_LVL DEBUG_LOW
#include "Trace.h"
#include "Spi_Cfg.h"
//#define USE_TRACE 1
-//#define USE_DEBUG 1
+//#define USE_DEBUG_PRINT 1
#undef DEBUG_LVL
#define DEBUG_LVL DEBUG_LOW
#include "Trace.h"
#include "Spi_Cfg.h"
//#define USE_TRACE 1
-//#define USE_DEBUG 1
+//#define USE_DEBUG_PRINT 1
#undef DEBUG_LVL
#define DEBUG_LVL DEBUG_LOW
#include "Trace.h"
#include "Spi_Cfg.h"
//#define USE_TRACE 1
-//#define USE_DEBUG 1
+//#define USE_DEBUG_PRINT 1
#undef DEBUG_LVL
#define DEBUG_LVL DEBUG_LOW
#include "Trace.h"
#include <stdio.h>
#include <assert.h>
#define USE_TRACE 1
-#define USE_DEBUG 1
+#define USE_DEBUG_PRINT 1
#include "Trace.h"
/* Notification callback from channel 0 */
#include "Mcu.h"\r
#include "arc.h"
\r
-#define USE_DEBUG\r
+#define USE_DEBUG_PRINT\r
#include "Trace.h"\r
\r
// How many errors to keep in error log.\r
#include "Mcu.h"\r
#include "arc.h"
\r
-#define USE_DEBUG\r
+#define USE_DEBUG_PRINT\r
#include "Trace.h"\r
\r
// How many errors to keep in error log.\r
*\r
* Macro's for debugging and tracing\r
*\r
- * Define USE_DEBUG and DBG_LEVEL either globally( e.g. a makefile )\r
+ * Define USE_DEBUG_PRINT and DBG_LEVEL either globally( e.g. a makefile )\r
* or in a specific file. The DBG_LEVEL macro controls the amount\r
* of detail you want in the debug printout.\r
* There are 3 levels:\r
#define CH_ISR 0\r
#define CH_PROC 1\r
\r
-#if defined(USE_DEBUG)\r
+#if defined(USE_DEBUG_PRINT)\r
#define DEBUG(_level,...) \\r
do { \\r
if(_level>=DEBUG_LVL) { \\r
#define DEBUG(_level,...)\r
#endif\r
\r
-#if defined(USE_DEBUG)\r
+#if defined(USE_DEBUG_PRINT)\r
#define dbg_printf(format,...) simple_printf(format,## __VA_ARGS__ )\r
#else\r
#define dbg_printf(format,...)\r
export Q\r
export TOPDIR = $(CURDIR)\r
export CFG_DEBUG ?= n\r
+export CFG_USE_DEBUG_PRINT\r
ifeq ($(CFG_DEBUG),n)\r
export CFG_RELEASE = y\r
endif\r
@echo ""\r
\r
def-$(USE_DBG_PRINTF) += USE_DBG_PRINTF\r
+def-$(USE_DEBUG_PRINT) += USE_DEBUG_PRINT\r
\r
\r
export CFG_MCU \r
//#include <stdio.h>\r
#include <string.h>\r
\r
-//#define USE_DEBUG\r
+//#define USE_DEBUG_PRINT\r
#include "Trace.h"\r
#define MODULE_NAME "/driver/Fls_25"\r
\r
void Os_ResourceReleaseInternal( void );
-static inline void Os_ResourceCheckAndRelease( OsPcbType *pcb ) {
+/**
+ *
+ * @return 1 - if any resources were found.
+ */
+static inline _Bool Os_ResourceCheckAndRelease( OsPcbType *pcb ) {
+ _Bool rv = 0;
if( !TAILQ_EMPTY(&pcb->resource_head) ) {
OsResourceType *rPtr;
ReleaseResource(rPtr->nr);
/* Requirements are a little fuzzy here, no explicit
* requirement for this.
+ *
+ * For OSEK this is a req.
*/
ERRORHOOK(E_OS_RESOURCE);
+ rv = 1;
}
}
+ return rv;
}
\r
rsrc_p = Oil_GetResource(i);
topPrio = 0;
- for( int pi; pi < Oil_GetTaskCnt(); pi++) {
+ for( int pi = 0; pi < Oil_GetTaskCnt(); pi++) {
pcb_p = os_get_pcb(pi);
if(pcb_p->resourceAccess & (1<<i) ) {
// Init counter.. with alarms and schedule tables
os_counter_init();
Os_SchTblInit();
- os_resource_init();
// Put all tasks in the pcb list
// Put the one that belong in the ready queue there
Os_ContextInit(tmp_pcb);
}
+ TAILQ_INIT(&tmp_pcb->resource_head);
+
Os_AddTask(tmp_pcb);
DEBUG(DEBUG_LOW,"pid:%d name:%s prio:%d\n",tmp_pcb->pid,tmp_pcb->name,tmp_pcb->prio);
}
+ os_resource_init();
+
// Now all tasks should be created.
}
Os_ArchFirstCall();
- /** @req OS070 */
- Os_ResourceCheckAndRelease(pcb);
-
/** @req OS239 */
Irq_Disable();
if( Os_IrqAnyDisabled() ) {
Os_TaskMakeRunning(pcb);
Os_ArchFirstCall();
- /** @req OS070 */
- Os_ResourceCheckAndRelease(pcb);
/** @req OS239 */
Irq_Disable();
}
-#define USE_DEBUG
+#define USE_DEBUG_PRINT
#include "Trace.h"
// we come here from
* state into ready state all its events are cleared.*/
pcb->ev_set = 0;
pcb->ev_wait = 0;
- } else {
- Os_StackSetup(pcb);
- OsArch_SetTaskEntry(pcb);
- Os_ArchSetupContext(pcb);
}
+ Os_StackSetup(pcb);
+ OsArch_SetTaskEntry(pcb);
+ Os_ArchSetupContext(pcb);
Os_TaskMakeReady(pcb);
} else {
os_std_printf(D_TASK,"TerminateTask %s\n",curr_pcb->name);\r
#if (OS_STATUS_EXTENDED == STD_ON )
+
+
if( os_sys.int_nest_cnt != 0 ) {
rv = E_OS_CALLEVEL;
goto err;
}
+
+ /** @req OS070 */
+ if( Os_ResourceCheckAndRelease(curr_pcb) == 1 ) {
+ rv = E_OS_RESOURCE;
+ goto err;
+
+ }
+
+
#endif
-\r
+
+
Irq_Save(flags);
--curr_pcb->activations;
+
+
// assert(curr_pcb->activations>=0);
/*@req OSEK TerminateTask
* terminating the current instance of the task automatically puts the next
* instance of the same task into the ready state
*/
- if( curr_pcb->activations == 0 ) {
+ if( curr_pcb->activations <= 0 ) {
+ curr_pcb->activations = 0;
Os_TaskMakeSuspended(curr_pcb);
} else {
/* We need to add ourselves to the ready list again,
/* extended */\r
GEN_ETASK(etask_master,1,FULL,true/*auto*/, NULL/*rsrc*/, 0 ),\r
\r
- GEN_ETASK(etask_sup_l,2,FULL,false/*auto*/, NULL/*rsrc*/, 0 ),\r
- GEN_ETASK(etask_sup_m,3,FULL,false/*auto*/, NULL/*rsrc*/, 0 ),\r
- GEN_ETASK(etask_sup_h,4,FULL,false/*auto*/, NULL/*rsrc*/, 0 ),\r
+ GEN_ETASK(etask_sup_l,2,FULL,false/*auto*/, NULL/*rsrc*/, (1<<2)|(1<<3)|(1<<4) ),\r
+ GEN_ETASK(etask_sup_m,4,FULL,false/*auto*/, NULL/*rsrc*/, (1<<2)|(1<<3)|(1<<4) ),\r
+ GEN_ETASK(etask_sup_h,6,FULL,false/*auto*/, NULL/*rsrc*/, (1<<2)|(1<<3)|(1<<4) ),\r
\r
/* basic */\r
- GEN_BTASK(btask_sup_l,2,FULL,false/*auto*/, NULL/*rsrc*/, 0, 1 ),\r
- GEN_BTASK(btask_sup_m,3,FULL,false/*auto*/, NULL/*rsrc*/, 0, 1 ),\r
- GEN_BTASK(btask_sup_h,4,FULL,false/*auto*/, NULL/*rsrc*/, 0, 1 ),\r
+ GEN_BTASK(btask_sup_l,2,FULL,false/*auto*/, NULL/*rsrc*/, (1<<2)|(1<<3)|(1<<4), 1 ),\r
+ GEN_BTASK(btask_sup_m,4,FULL,false/*auto*/, NULL/*rsrc*/, (1<<2)|(1<<3)|(1<<4), 1 ),\r
+ GEN_BTASK(btask_sup_h,6,FULL,false/*auto*/, NULL/*rsrc*/, (1<<2)|(1<<3)|(1<<4), 1 ),\r
\r
GEN_ISR_2( TASK_ID_os_tick, "dec", OsTick, /*prio*/ 11, INTC_VECTOR_EXCEPTION_DEC ),\r
#if 0\r
#ifndef OS_TEST_H_\r
#define OS_TEST_H_\r
\r
-#include "test_framework.h"\r
+#include "test_framework.h"
+#include "Trace.h"\r
\r
typedef void (*test_func_t)( void );\r
\r
#define TEST_FAIL(_text) test_fail((_text), __FILE__, __LINE__, __FUNCTION__ )\r
#define TEST_OK() test_ok();\r
-#define TEST_ASSERT(_cond) if(!(_cond)) { TEST_FAIL(#_cond); }\r
+#define TEST_ASSERT(_cond) if(!(_cond)) { TEST_FAIL(#_cond); }
+#define TEST_RUN() dbg_printf("Running test %d\n",test_nr);
+\r
\r
extern int test_suite;\r
extern int test_nr;
\r
#define SECTION_BSS_SUPER __attribute__ ((aligned (16),section(".bss")))\r
#define SECTION_BSS_USER __attribute__ ((aligned (16),section(".bss")))\r
+
+#define OS_STR__(x) #x
+#define OS_STRSTR__(x) OS_STR__(x)
+
+#define DECLARE_TEST_BTASK(_nr, _task1, _task2, _task3 ) \
+ __attribute__ ((section (".test_btask"))) const test_func_t btask_sup_matrix_ ## _nr[3] = { _task1, _task2, _task3 }
+
+#define DECLARE_TEST_ETASK(_nr, _task1, _task2, _task3 ) \
+ __attribute__ ((section (".test_etask"))) const test_func_t etask_sup_matrix_ ## _nr[3] = { _task1, _task2, _task3 }
\r
#define DECLARE_TASKS(_nr) \\r
void etask_sup_l_##_nr( void ); \\r
\r
int btaskRunCnt = 0;\r
\r
+static int status_100 = 0;\r
+\r
void isr_l(void ) {\r
StatusType rv;\r
switch(test_nr) {\r
StatusType rv;\r
\r
while (!done) {\r
+ TEST_RUN();\r
+\r
switch (test_nr) {\r
case 1:\r
/*@req E_OS_ID ActivateTask */\r
case 10:\r
/*@req E_OS_RESOURCE TerminateTask\r
* Terminate a task that still holds resources\r
- * */\r
- rv = ActivateTask(TASK_ID_btask_sup_h);\r
+ * This is done in the TASK_ID_btask_sup_m task..\r
+ */\r
+ rv = ActivateTask(TASK_ID_btask_sup_m);\r
TEST_ASSERT(rv == E_OK);\r
+ test_nr++;\r
break;\r
case 11:\r
/*@req E_OS_CALLEVEL TerminateTask */\r
/*@req E_OS_ID ChainTask */\r
rv = ChainTask(TASK_ID_ILL);\r
TEST_ASSERT(rv == E_OS_ID);\r
- test_nr++;\r
+ test_nr = 100;\r
case 21:\r
/*@req E_OS_LIMIT ChainTask */\r
case 22:\r
break;\r
\r
case 100:\r
- /*@req Scheduler test\r
- * The first task(oldest) task of the same priority should be scheduled first\r
- * E.g. From M task do ActivateTask()\r
- */\r
- /* Change to higher prio */\r
+ /* Check that tasks as run in priority order and that the oldest task\r
+ * of the same priority should be scheduled first.\r
+ * 1. esup_l: Activate(sup_m)\r
+ * 2. bsup_m: Activate(sup_l) (should not be taken)\r
+ * 3. bsup_m: Activate(sup_h) (taken)\r
+ * 4. bsup_h: Terminate()\r
+ * (We should now have bsup_m, esup_l, bsup_l )\r
+ * 5. bsup_m: Terminate()\r
+ * 6. esup_l : Terminate()\r
+ * 7. bsup_l : Activate(esup_l) (found by dispatcher)\r
+ * 8. esup_l: Back again!!!!\r
+ *\r
+ * */\r
+ if(status_100==6) {\r
+ test_nr=101;\r
+ break;\r
+ }\r
btaskRunCnt = 0;\r
rv = ActivateTask(TASK_ID_btask_sup_m);\r
- /* We got back from M, btask_l is now ready in queue */\r
- TEST_ASSERT(btaskRunCnt==0);\r
- /* Terminate ourselves, to be activated later */\r
- TerminateTask();\r
+ TEST_ASSERT(status_100=3);\r
+ status_100=4;\r
+ TerminateTask(); // Step 6.\r
+\r
+ // Should never get here since we have restarded ourselves.\r
+ assert(0);\r
break;\r
case 101:\r
- TEST_ASSERT(btaskRunCnt==1);\r
+ /* End Testing of this module */\r
+ TerminateTask();\r
break;\r
default:\r
while(1);\r
case 100:\r
btaskRunCnt++;\r
/* Make it go up again */\r
- test_nr = 101;\r
- ActivateTask(TASK_ID_etask_sup_l);\r
+ TEST_ASSERT(status_100=4);\r
+ status_100=5;\r
+ ActivateTask(TASK_ID_etask_sup_l); // Step 7.\r
+ TEST_ASSERT(status_100=5);\r
+ status_100=6;\r
break;\r
default:\r
break;\r
switch(test_nr){\r
case 2:\r
btaskRunCnt++;\r
+ TerminateTask();\r
break;\r
case 10:\r
rv = GetResource(RES_ID_ext_prio_3);\r
TEST_ASSERT(rv==E_OS_RESOURCE);\r
\r
rv = ReleaseResource(RES_ID_ext_prio_3);\r
+ TEST_ASSERT(rv==E_OK);\r
TerminateTask();\r
break;\r
case 100:\r
/* We got here from etask_l, so it should be oldest */\r
rv = ActivateTask(TASK_ID_btask_sup_l);\r
+ TEST_ASSERT(rv==E_OK);\r
+ TEST_ASSERT(status_100==0);\r
+ status_100=1;\r
+ rv = ActivateTask(TASK_ID_btask_sup_h);\r
+ TEST_ASSERT(rv==E_OK);\r
+ TEST_ASSERT(status_100==2);\r
+ status_100=3;\r
break;\r
default:\r
while(1);\r
* Oldest is scheduled first..\r
* */\r
break;\r
+ case 100:\r
+ TEST_ASSERT(status_100==1);\r
+ status_100=2;\r
+ break;\r
default:\r
while(1);\r
\r
}\r
}\r
\r
-__attribute__ ((section (".test_btask"))) const test_func_t btask_sup_matrix_01[3] = { btask_sup_l_01, btask_sup_m_01, btask_sup_h_01 };\r
-__attribute__ ((section (".test_etask"))) const test_func_t etask_sup_matrix_01[3] = { etask_sup_l_01, NULL, NULL };\r
+DECLARE_TEST_ETASK(01, etask_sup_l_01, NULL, NULL );\r
+DECLARE_TEST_BTASK(01, btask_sup_l_01, btask_sup_m_01, btask_sup_h_01);\r
\r
* Limitations:\r
* - Internal resources.\r
*/\r
+\r
+#include "Os.h"\r
+#include "os_test.h"\r
+#include "arc.h"\r
+\r
+\r
+void etask_sup_l_02(void) {\r
+ _Bool done = 0;\r
+ StatusType rv;\r
+\r
+ while (!done) {\r
+ TEST_RUN();\r
+ switch (test_nr) {\r
+ case 1:\r
+ rv = GetResource(RES_ID_ext_prio_3);\r
+ TEST_ASSERT(rv == E_OK);\r
+ rv = ReleaseResource(RES_ID_ext_prio_3);\r
+ TEST_ASSERT(rv == E_OK);\r
+ test_nr++;\r
+ break;\r
+ case 2:\r
+ /* Get the same resource twice */\r
+ rv = GetResource(RES_ID_ext_prio_3);\r
+ TEST_ASSERT(rv == E_OK);\r
+ rv = GetResource(RES_ID_ext_prio_3);\r
+ TEST_ASSERT(rv == E_OK);\r
+ break;\r
+\r
+ }\r
+ }\r
+}\r
+\r
+void btask_sup_l_02(void) {\r
+}\r
+\r
+\r
+DECLARE_TEST_ETASK(02, etask_sup_l_02, NULL, NULL );\r
+DECLARE_TEST_BTASK(02, btask_sup_l_02, NULL, NULL );\r
#include "Platform_Types.h"
#include "simple_printf.h"
\r
-#define USE_DEBUG\r
+#define USE_DEBUG_PRINT\r
#include "Trace.h"\r
\r
int test_suite = 1;\r
#endif\r
#include "simple_printf.h"
\r
-#define USE_DEBUG\r
+#define USE_DEBUG_PRINT\r
#include "Trace.h"
#include "arc.h"\r
\r