return rv;
}
+
int vsnprintf(char *buffer, size_t n, const char *format, va_list ap) {
int rv;
}
+/*
+ * The integer only counterpart
+ */
+int iprintf(const char *format, ...) {
+ va_list ap;
+ int rv;
+
+ va_start(ap, format);
+ rv = vfprintf(_STDOUT, format, ap);
+ va_end(ap);
+ return rv;
+}
+
+int fiprintf(FILE *file, const char *format, ...) {
+ va_list ap;
+ int rv;
+
+ va_start(ap, format);
+ rv = vfprintf(file, format, ap);
+ va_end(ap);
+ return rv;
+}
+
+
+int siprintf(char *buffer, const char *format, ...) {
+ va_list ap;
+ int rv;
+
+ va_start(ap, format);
+ rv = vsnprintf(buffer, ~(size_t)0, format, ap);
+ va_end(ap);
+
+ return rv;
+}
+
+int sniprintf(char *buffer, size_t n, const char *format, ...) {
+ va_list ap;
+ int rv;
+
+ va_start(ap, format);
+ rv = vsnprintf(buffer, n, format, ap);
+ va_end(ap);
+ return rv;
+}
+
+int viprintf(const char *format, va_list ap) {
+ return vfprintf(_STDOUT, format, ap);
+}
+
+int vsiprintf(char *buffer, const char *format, va_list ap) {
+ return vsnprintf(buffer, ~(size_t)0, format, ap);
+}
+
+
+int vfiprintf(FILE *file, const char *format, va_list ap) {
+ int rv;
+ /* Just print to _STDOUT */
+ rv = print(file,NULL,~(size_t)0, format,ap);
+ return rv;
+}
+
+int vsniprintf(char *buffer, size_t n, const char *format, va_list ap) {
+ int rv;
+
+ rv = print(NULL, &buffer, n, format,ap);
+ return rv;
+}
+
+
+
/**
*
* @param file The file to print to
\r
MOD_USE+= COMMON DET ECUM MCU NEWLIB KERNEL RAMLOG \r
\r
+#def-y += NDEBUG\r
#def-y += HEAPSIZE=1400
\ No newline at end of file
OsPcbType *dest_pcb;
OsPcbType *currPcbPtr;
uint32_t flags;\r
-\r
- dest_pcb = os_get_pcb(TaskID);
-\r
if( TaskID >= Os_CfgGetTaskCnt() ) {
rv = E_OS_ID;
goto err;
}
\r
+ dest_pcb = os_get_pcb(TaskID);
+\r
if( (dest_pcb->state & ST_SUSPENDED ) ) {\r
rv = E_OS_STATE;\r
goto err;\r
currPcbPtr = Os_TaskGetCurrent();
/* Checking "4.6.2 Non preemptive scheduling" it does not dispatch if NON */
if( (os_sys.int_nest_cnt == 0) &&
- (currPcbPtr->scheduling == FULL) )
+ (currPcbPtr->scheduling == FULL) &&
+ (dest_pcb->prio > currPcbPtr->prio) )
{
+ Os_SetOp(OP_SET_EVENT);
Os_Dispatch(0);
}
\r
OsPcbType *dest_pcb;\r
StatusType rv = E_OK;\r
+
+ if( TaskId >= Os_CfgGetTaskCnt() ) {
+ rv = E_OS_ID;
+ goto err;
+ }
\r
dest_pcb = os_get_pcb(TaskId);\r
\r
#define SYS_H_\r
\r
struct os_conf_global_hook_s;\r
+
+#define OP_SET_EVENT 1
+#define OP_ACTIVATE_TASK 2
+
\r
typedef struct sys_s {\r
// OsApplicationType *curr_application;\r
/* List of all tasks */\r
OsPcbType *pcb_list;\r
/* Interrupt nested count */\r
- uint32 int_nest_cnt;\r
+ uint32 int_nest_cnt;
+ /* The current operation */
+ uint8_t op;\r
/* Ptr to the interrupt stack */\r
void *int_stack;\r
// The os tick\r
} sys_t;\r
\r
extern sys_t os_sys;\r
+
+static inline void Os_SetOp( uint8_t op) {
+ os_sys.op = op;
+}
+
+static inline uint8_t Os_GetOp( void ) {
+ return os_sys.op;
+}
\r
static inline OsPcbType *Os_TaskGetCurrent( void ) {\r
return os_sys.curr_pcb;\r
PRETASKHOOK();
} else {
- /* We want to run the same task, again. This only happens
- * when we have multiple activation of a basic task (
- * extended tasks have an activation limit of 1)
- */
+ if( Os_GetOp() != OP_SET_EVENT ) {
+
+ /* We want to run the same task, again. This only happens
+ * when we have multiple activation of a basic task (
+ * extended tasks have an activation limit of 1)
+ */
- /* Setup the stack again, and just call the basic task */
- Os_StackSetup(pcbPtr);
- Os_ArchSetSpAndCall(pcbPtr->stack.curr,Os_TaskStartBasic);
+ /* Setup the stack again, and just call the basic task */
+ Os_StackSetup(pcbPtr);
+ Os_ArchSetSpAndCall(pcbPtr->stack.curr,Os_TaskStartBasic);
+ } else {
+ /* Two cases:
+ * 1. SetEvent() on itself
+ * 2. SetEvent()
+ *
+ *
+ * */
+
+ }
}
}
#ifndef OS_TEST_H_\r
#define OS_TEST_H_\r
\r
-#include "test_framework.h"
-#include "debug.h"\r
-\r
-typedef void (*test_func_t)( void );
-\r
-
-#define TEST_INIT() printf("Test init\n");\r
-#define TEST_FAIL(_text) test_fail((_text), __FILE__, __LINE__, __FUNCTION__ )\r
-#define TEST_OK() test_ok();
-#define TEST_ASSERT(_cond) if(!(_cond)) { TEST_FAIL(#_cond); }
-/* Start to run a test */
-#define TEST_RUN() printf("Running test %d\n",test_nr);
-/* Indicate that a test is done */
-//#define TEST_DONE()
-#define TEST_START(_str,_nr) testStart(_str,_nr)
-#define TEST_NEXT(_str,_next_nr) testEnd(); testStart(_str,_next_nr);
-#define TEST_END() testEnd()
-\r
-\r
-extern int test_suite;\r
-extern int test_nr;
-
-#define TASK_ID_ILL 99
-#define RES_ID_ILL 99
-#define ALARM_ID_ILL 99
-#define SCHTBL_ID_ILL 99
-#define COUNTER_ID_ILL 99
-\r
-#if 1\r
-#define SECTION_SUP\r
-#define SECTION_USER\r
-#else\r
-#define SECTION_SUP __attribute__ ((section(".text_app_sup")))\r
-#define SECTION_USER __attribute__ ((section(".text_app_user")))\r
-#endif\r
-\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
- void etask_sup_m_##_nr( void ); \\r
- void etask_sup_h_##_nr( void ); \\r
- void btask_sup_l_##_nr( void ); \\r
- void btask_sup_m_##_nr( void ); \\r
- void btask_sup_h_##_nr( void );\r
-\r
-\r
-/*\r
- * Declare tests
- */\r
-\r
-// Test master processes\r
-void OsIdle(void );\r
-void etask_master( void );\r
-void etask_sup_l( void ) SECTION_SUP;\r
-void etask_sup_m( void ) SECTION_SUP;\r
-void etask_sup_h( void ) SECTION_SUP;\r
-\r
-void btask_sup_l( void ) SECTION_SUP;\r
-void btask_sup_m( void ) SECTION_SUP;\r
-void btask_sup_h( void ) SECTION_SUP;\r
-\r
-\r
-// Tests\r
-DECLARE_TASKS(01);\r
-DECLARE_TASKS(02);\r
-DECLARE_TASKS(03);
-DECLARE_TASKS(04);\r
\r
#endif /* OS_TEST_H_ */\r
*/\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
\r
int btaskRunCnt = 0;\r
*/\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
#include "irq.h"\r
\r
\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
\r
\r
*/\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
\r
\r
#include <stdlib.h>\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "Mcu.h"\r
#if defined(USE_GPT)\r
#include "Gpt.h"\r
}\r
// Test complete..
- testExit(0);
+ TestExit(0);
}\r
extern test_func_t etask_sup_matrix[][3];
#include <stdlib.h>\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "Mcu.h"\r
#if defined(USE_GPT)\r
#include "Gpt.h"\r
GetEvent(currTask,&evMask);
TEST_ASSERT( evMask == mask);
- testExit(0);
+ TestExit(0);
}\r
//--------------------------------------------------------------------\r
*
*
* Generated by Arctic Studio (http://arccore.com)
-* on Sun Jun 27 21:58:34 CEST 2010
+* on Sun Jul 04 17:25:57 CEST 2010
*/
\r
// ############################## STACKS (TASKS) ############################\r
DECLARE_STACK(OsIdle,OS_OSIDLE_STACK_SIZE);\r
DECLARE_STACK(btask_h_full,2048);\r
-DECLARE_STACK(btask_h_none,2048);\r
+DECLARE_STACK(btask_h_non,2048);\r
DECLARE_STACK(btask_l_full,2048);\r
-DECLARE_STACK(btask_l_none,2048);\r
+DECLARE_STACK(btask_l_non,2048);\r
DECLARE_STACK(btask_m_full,2048);\r
-DECLARE_STACK(btask_m_none,2048);\r
+DECLARE_STACK(btask_m_non,2048);\r
DECLARE_STACK(etask_h_full,2048);\r
-DECLARE_STACK(etask_h_none,2048);\r
+DECLARE_STACK(etask_h_non,2048);\r
DECLARE_STACK(etask_l_full,2048);\r
-DECLARE_STACK(etask_l_none,2048);\r
+DECLARE_STACK(etask_l_non,2048);\r
DECLARE_STACK(etask_m_full,2048);\r
-DECLARE_STACK(etask_m_none,2048);\r
+DECLARE_STACK(etask_m_non,2048);\r
DECLARE_STACK(etask_master,2048);\r
\r
// ################################## TASKS #################################\r
),\r
\r
GEN_BTASK(\r
- btask_h_none,\r
+ btask_h_non,\r
4,\r
NON,\r
FALSE,\r
),\r
\r
GEN_BTASK(\r
- btask_l_none,\r
+ btask_l_non,\r
2,\r
NON,\r
FALSE,\r
),\r
\r
GEN_BTASK(\r
- btask_m_none,\r
+ btask_m_non,\r
3,\r
NON,\r
FALSE,\r
\r
\r
GEN_ETASK(\r
- etask_h_none,\r
+ etask_h_non,\r
4,\r
NON,\r
FALSE,\r
\r
\r
GEN_ETASK(\r
- etask_l_none,\r
+ etask_l_non,\r
2,\r
NON,\r
FALSE,\r
\r
\r
GEN_ETASK(\r
- etask_m_none,\r
+ etask_m_non,\r
3,\r
NON,\r
FALSE,\r
*
*
* Generated by Arctic Studio (http://arccore.com)
-* on Sun Jun 27 21:58:34 CEST 2010
+* on Sun Jul 04 17:25:57 CEST 2010
*/
\r
\r
// Event masks\r
+#define EVENT_MASK_kill 8\r
#define EVENT_MASK_master_notif 1\r
+#define EVENT_MASK_next 16\r
#define EVENT_MASK_notif 2\r
#define EVENT_MASK_test 4\r
\r
// Task Id's\r
#define TASK_ID_OsIdle 0\r
#define TASK_ID_btask_h_full 1\r
-#define TASK_ID_btask_h_none 2\r
+#define TASK_ID_btask_h_non 2\r
#define TASK_ID_btask_l_full 3\r
-#define TASK_ID_btask_l_none 4\r
+#define TASK_ID_btask_l_non 4\r
#define TASK_ID_btask_m_full 5\r
-#define TASK_ID_btask_m_none 6\r
+#define TASK_ID_btask_m_non 6\r
#define TASK_ID_etask_h_full 7\r
-#define TASK_ID_etask_h_none 8\r
+#define TASK_ID_etask_h_non 8\r
#define TASK_ID_etask_l_full 9\r
-#define TASK_ID_etask_l_none 10\r
+#define TASK_ID_etask_l_non 10\r
#define TASK_ID_etask_m_full 11\r
-#define TASK_ID_etask_m_none 12\r
+#define TASK_ID_etask_m_non 12\r
#define TASK_ID_etask_master 13\r
\r
// Task entry points\r
void OsIdle( void );\r
void btask_h_full( void );\r
-void btask_h_none( void );\r
+void btask_h_non( void );\r
void btask_l_full( void );\r
-void btask_l_none( void );\r
+void btask_l_non( void );\r
void btask_m_full( void );\r
-void btask_m_none( void );\r
+void btask_m_non( void );\r
void etask_h_full( void );\r
-void etask_h_none( void );\r
+void etask_h_non( void );\r
void etask_l_full( void );\r
-void etask_l_none( void );\r
+void etask_l_non( void );\r
void etask_m_full( void );\r
-void etask_m_none( void );\r
+void etask_m_non( void );\r
void etask_master( void );\r
\r
// Schedule table id's\r
#define OS_TASK_CNT 14\r
#define OS_SCHTBL_CNT 0\r
#define OS_COUNTER_CNT 1\r
-#define OS_EVENTS_CNT 3\r
+#define OS_EVENTS_CNT 5\r
#define OS_ISRS_CNT 0\r
#define OS_RESOURCE_CNT 0\r
#define OS_LINKED_RESOURCE_CNT 0\r
</SUB-CONTAINERS>\r
</CONTAINER>\r
<CONTAINER UUID="6b1bd06c-aa6c-4a3b-890f-7a6622039010">\r
- <SHORT-NAME>etask_l_none</SHORT-NAME>\r
+ <SHORT-NAME>etask_l_non</SHORT-NAME>\r
<DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsTask</DEFINITION-REF>\r
<PARAMETER-VALUES>\r
<INTEGER-VALUE>\r
</PARAMETER-VALUES>\r
</CONTAINER>\r
<CONTAINER UUID="21591f45-043e-4d3f-9c91-fbb617d69350">\r
- <SHORT-NAME>etask_m_none</SHORT-NAME>\r
+ <SHORT-NAME>etask_m_non</SHORT-NAME>\r
<DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsTask</DEFINITION-REF>\r
<PARAMETER-VALUES>\r
<INTEGER-VALUE>\r
</PARAMETER-VALUES>\r
</CONTAINER>\r
<CONTAINER UUID="d8a48b25-b6e2-4c30-9834-9f841effedfc">\r
- <SHORT-NAME>etask_h_none</SHORT-NAME>\r
+ <SHORT-NAME>etask_h_non</SHORT-NAME>\r
<DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsTask</DEFINITION-REF>\r
<PARAMETER-VALUES>\r
<INTEGER-VALUE>\r
</PARAMETER-VALUES>\r
</CONTAINER>\r
<CONTAINER UUID="e7882a54-1553-411b-89da-b6bdab4a7b15">\r
- <SHORT-NAME>btask_l_none</SHORT-NAME>\r
+ <SHORT-NAME>btask_l_non</SHORT-NAME>\r
<DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsTask</DEFINITION-REF>\r
<PARAMETER-VALUES>\r
<INTEGER-VALUE>\r
</PARAMETER-VALUES>\r
</CONTAINER>\r
<CONTAINER UUID="fee669e9-e94e-47d2-90bb-2bcf4f95215b">\r
- <SHORT-NAME>btask_m_none</SHORT-NAME>\r
+ <SHORT-NAME>btask_m_non</SHORT-NAME>\r
<DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsTask</DEFINITION-REF>\r
<PARAMETER-VALUES>\r
<INTEGER-VALUE>\r
</PARAMETER-VALUES>\r
</CONTAINER>\r
<CONTAINER UUID="1427277d-b148-4faa-8b15-a9b732a756d0">\r
- <SHORT-NAME>btask_h_none</SHORT-NAME>\r
+ <SHORT-NAME>btask_h_non</SHORT-NAME>\r
<DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsTask</DEFINITION-REF>\r
<PARAMETER-VALUES>\r
<INTEGER-VALUE>\r
</INTEGER-VALUE>\r
</PARAMETER-VALUES>\r
</CONTAINER>\r
+ <CONTAINER UUID="47709c91-4cce-40dc-84d8-9918f984c206">\r
+ <SHORT-NAME>kill</SHORT-NAME>\r
+ <DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsEvent</DEFINITION-REF>\r
+ <PARAMETER-VALUES>\r
+ <INTEGER-VALUE>\r
+ <DEFINITION-REF DEST="INTEGER-PARAM-DEF">/ArcCore/Os/OsEvent/OsEventMask</DEFINITION-REF>\r
+ <VALUE>8</VALUE>\r
+ </INTEGER-VALUE>\r
+ </PARAMETER-VALUES>\r
+ </CONTAINER>\r
+ <CONTAINER UUID="9e9f81cc-0b31-4c1b-a434-6da73d1980eb">\r
+ <SHORT-NAME>next</SHORT-NAME>\r
+ <DEFINITION-REF DEST="PARAM-CONF-CONTAINER-DEF">/ArcCore/Os/OsEvent</DEFINITION-REF>\r
+ <PARAMETER-VALUES>\r
+ <INTEGER-VALUE>\r
+ <DEFINITION-REF DEST="INTEGER-PARAM-DEF">/ArcCore/Os/OsEvent/OsEventMask</DEFINITION-REF>\r
+ <VALUE>16</VALUE>\r
+ </INTEGER-VALUE>\r
+ </PARAMETER-VALUES>\r
+ </CONTAINER>\r
</CONTAINERS>\r
</MODULE-CONFIGURATION>\r
</ELEMENTS>\r
* for more details.
* -------------------------------- Arctic Core ------------------------------*/
+
+
/* Tests
* Scheduling tests FULL/NONE using SetEvent(), ActivateTask() and ChainTask()
* TODO: ChainTask()
* TODO: Should we add the GetResource(RES_SCHEDULER) here also?
*
* SetEvent()
- * etask_m_full: SetEvent() to etask_l_full, etask_h_full
- * etask_m_full: SetEvent() to etask_l_none, etask_h_none
- * etask_m_none: SetEvent() to etask_l_full, etask_h_full
- * etask_m_none: SetEvent() to etask_l_none, etask_h_none
+ * 1 etask_m_full: SetEvent() to etask_l_full, etask_h_full
+ * 1 etask_m_full: SetEvent() to etask_l_non, etask_h_non
+ * 4 etask_m_non: SetEvent() to etask_l_full, etask_h_full
+ * 4 etask_m_non: SetEvent() to etask_l_non, etask_h_non
*
* btask_m_full: SetEvent() to etask_l_full, etask_h_full
- * btask_m_full: SetEvent() to etask_l_none, etask_h_none
- * btask_m_none: SetEvent() to etask_l_full, etask_h_full
- * btask_m_none: SetEvent() to etask_l_none, etask_h_none
+ * btask_m_full: SetEvent() to etask_l_non, etask_h_non
+ * btask_m_non: SetEvent() to etask_l_full, etask_h_full
+ * btask_m_non: SetEvent() to etask_l_non, etask_h_non
*
* ActivateTask()
- * etask_m_full: ActivateTask() to etask_l_full, etask_h_full
- * etask_m_full: ActivateTask() to etask_l_none, etask_h_none
- * etask_m_none: ActivateTask() to etask_l_full, etask_h_full
- * etask_m_none: ActivateTask() to etask_l_none, etask_h_none
+ * 2 etask_m_full: ActivateTask() to etask_l_full, etask_h_full
+ * 2 etask_m_full: ActivateTask() to etask_l_non, etask_h_non
+ * etask_m_non: ActivateTask() to etask_l_full, etask_h_full
+ * etask_m_non: ActivateTask() to etask_l_non, etask_h_non
*
- * etask_m_full: ActivateTask() to btask_l_full, btask_h_full
- * etask_m_full: ActivateTask() to btask_l_none, btask_h_none
- * etask_m_none: ActivateTask() to btask_l_full, btask_h_full
- * etask_m_none: ActivateTask() to btask_l_none, btask_h_none
+ * 3 etask_m_full: ActivateTask() to btask_l_full, btask_h_full
+ * 3 etask_m_full: ActivateTask() to btask_l_non, btask_h_non
+ * etask_m_non: ActivateTask() to btask_l_full, btask_h_full
+ * etask_m_non: ActivateTask() to btask_l_non, btask_h_non
*
* btask_m_full: ActivateTask() to btask_l_full, etask_h_full
- * btask_m_full: ActivateTask() to btask_l_none, etask_h_none
- * btask_m_none: ActivateTask() to btask_l_full, etask_h_full
- * btask_m_none: ActivateTask() to btask_l_none, etask_h_none
+ * btask_m_full: ActivateTask() to btask_l_non, etask_h_non
+ * btask_m_non: ActivateTask() to btask_l_full, etask_h_full
+ * btask_m_non: ActivateTask() to btask_l_non, etask_h_non
*
* btask_m_full: ActivateTask() to btask_l_full, etask_h_full
- * btask_m_full: ActivateTask() to btask_l_none, etask_h_none
- * btask_m_none: ActivateTask() to btask_l_full, etask_h_full
- * btask_m_none: ActivateTask() to btask_l_none, etask_h_none
+ * btask_m_full: ActivateTask() to btask_l_non, etask_h_non
+ * btask_m_non: ActivateTask() to btask_l_full, etask_h_full
+ * btask_m_non: ActivateTask() to btask_l_non, etask_h_non
*/
#include <stdlib.h>\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "Mcu.h"\r
#if defined(USE_GPT)\r
#include "Gpt.h"\r
//#define USE_LDEBUG_PRINTF\r
#include "debug.h"
#include "arc.h"\r
-#include "test_framework.h"
\r
\r
#define ERROR_LOG_SIZE 1
+#define NOT_EXPECTED 0
+#define EXPECTED 1
+#define TASK_BASIC 0
+#define TASK_EXT 1
+
+
+
typedef struct ErrorEntry {
StatusType error;
OsErrorType info;
ErrorLogType ErrorLog;
+#define MAKE_TEST(_x) TEST_ ## (_x)
+#define TEST_INC() test_nr++
+//#define TEST_START2() printf("%s\n",TestFixure[test_nr-1].description)
+#define TEST_START2() TestStart(TestFixure[test_nr-1].description, TestFixure[test_nr-1].nr );
+#define TEST_GETCASE() TestFixure[test_nr-1].nr
+
+
+enum testCase {
+ TEST_1 = 1,
+ TEST_2,
+ TEST_3,
+ TEST_4,
+ TEST_5,
+ TEST_6,
+ TEST_7,
+ TEST_8,
+ TEST_9,
+ TEST_10,
+ TEST_11,
+ TEST_12,
+ TEST_13,
+ TEST_14,
+ TEST_15,
+ TEST_16,
+ TEST_17,
+ TEST_18,
+ TEST_19,
+ TEST_20,
+ TEST_LAST,
+};
+
+
+
+static TestFixtureType TestFixure[] = {
+/* 0 */
+ {"SetEvent()/E/FULL to self",TEST_1},
+ {"ActivateTask()/E/FULL to self",TEST_2},
+
+/* 1 */
+ {"SetEvent()/E/FULL to E/Lo/FULL",TEST_3},
+ {"SetEvent()/E/FULL to E/Hi/FULL",TEST_4},
+ {"SetEvent()/E/FULL to E/Lo/NON",TEST_5},
+ {"SetEvent()/E/FULL to E/Hi/NON",TEST_6},
+
+/* 2 */
+ {"ActivateTask()/E/FULL to E/Lo/FULL",TEST_7},
+ {"ActivateTask()/E/FULL to E/Hi/FULL",TEST_8},
+ {"ActivateTask()/E/FULL to E/Lo/NON",TEST_9},
+ {"ActivateTask()/E/FULL to E/Hi/NON",TEST_10},
+
+/* 3 */
+ {"ActivateTask()/E/FULL to B/Lo/FULL",TEST_11},
+ {"ActivateTask()/E/FULL to B/Hi/FULL",TEST_12},
+ {"ActivateTask()/E/FULL to B/Lo/NON",TEST_13},
+ {"ActivateTask()/E/FULL to B/Hi/NON",TEST_14},
+
+ {"SetEvent()/E/NON to self",TEST_15},
+ {"ActivateTask()/E/NON to self",TEST_16},
+
+/* 4 */
+ {"SetEvent()/E/NON to E/Lo/FULL",TEST_17},
+ {"SetEvent()/E/NON to E/Hi/FULL",TEST_18},
+ {"SetEvent()/E/NON to E/Lo/NON",TEST_19},
+ {"SetEvent()/E/NON to E/Hi/NON",TEST_20},
+
+ {"",TEST_LAST},
+};
+
+
ErrorEntryType *errorLogGetEntry( int backlog ) {
}
+
void validateErrorHook(int backlog, int error, int serviceId,
uint32_t param1, uint32_t param2, uint32_t param3,
int apiId, int modId ) {
TEST_ASSERT(_param3 == entry->info.param3 ); \
} \
} while(0)
+
+
+
\r
/*\r
* Master test process, everything is controlled from here.\r
TEST_INIT();
test_nr = 1;
+ /* Activate ext. task "slaves" */
+ ActivateTask(TASK_ID_etask_l_full);
+ ActivateTask(TASK_ID_etask_h_full);
+ ActivateTask(TASK_ID_etask_l_non);
+ ActivateTask(TASK_ID_etask_h_non);
+
+ /* Do the m_full -> XX tests first */
ActivateTask(TASK_ID_etask_m_full);
- ActivateTask(TASK_ID_etask_m_none);
- testExit(0);
+ /* Do the next test */
+ WaitEvent(EVENT_MASK_next);
+ ClearEvent(EVENT_MASK_next);
+
+ /* Do the m_non -> XX */
+ ActivateTask(TASK_ID_etask_m_non);
+
+
+ TestExit(0);
}\r
//--------------------------------------------------------------------\r
TerminateTask();
}
-void btask_h_none( void ) {
+void btask_h_non( void ) {
TerminateTask();
}
TerminateTask();
}
-void btask_l_none( void ) {
+void btask_l_non( void ) {
TerminateTask();
}
TerminateTask();
}
-void btask_m_none( void ) {
+void btask_m_non( void ) {
TerminateTask();
}
+
+static void waitKillAndTest( void ) {
+ TaskType currTask;
+ EventMaskType mask;
+ GetTaskID(&currTask);
+
+ WaitEvent( EVENT_MASK_test | EVENT_MASK_kill);
+ GetEvent(currTask,&mask);
+ if( EVENT_MASK_kill & mask ) {
+ TerminateTask();
+ }
+ ClearEvent(EVENT_MASK_test);
+}
+
void etask_h_full( void ) {
for(;;) {
- WaitEvent(EVENT_MASK_test);
- ClearEvent(EVENT_MASK_test);
+ waitKillAndTest();
switch(test_nr) {
- case 2:
+ case TEST_4:
+ case TEST_8:
SetEvent(TASK_ID_etask_m_full,EVENT_MASK_test);
break;
- case 100:
- TerminateTask();
default:
TEST_ASSERT(0);
break;
}
}
-void etask_h_none( void ) {
-
-
+void etask_h_non( void ) {
+ for(;;) {
+ waitKillAndTest();
+ switch(test_nr) {
+ case TEST_6:
+ case TEST_9:
+ SetEvent(TASK_ID_etask_m_full,EVENT_MASK_test);
+ break;
+ default:
+ TEST_ASSERT(0);
+ break;
+ }
+ }
}
void etask_l_full( void ) {
for(;;) {
- WaitEvent(EVENT_MASK_test);
- ClearEvent(EVENT_MASK_test);
+ waitKillAndTest();
+ switch(test_nr) {
+ case TEST_3:
+ case TEST_7:
+ SetEvent(TASK_ID_etask_m_full,EVENT_MASK_test);
+ break;
+ default:
+ TEST_ASSERT(0);
+ break;
+ }
+
+ }
+}
+void etask_l_non( void ) {
+ for(;;) {
+ waitKillAndTest();
switch(test_nr) {
- case 1:
+ case TEST_5:
+ case TEST_9:
SetEvent(TASK_ID_etask_m_full,EVENT_MASK_test);
break;
- case 100:
- TerminateTask();
default:
TEST_ASSERT(0);
break;
}
}
-void etask_l_none( void ) {
+static void taskDispatchCheck( TaskType task,_Bool expected, _Bool etask ) {
+ EventMaskType mask;
+ StatusType rv;
+ TaskType currTask;
+ TaskStateType taskState;
+
+ GetTaskID(&currTask);
+
+ /* 1. Kill the task */
+ TEST_ASSERT(taskState == TASK_STATE_WAITING);
+ rv = SetEvent(task,EVENT_MASK_kill);
+ TEST_ASSERT( rv == E_OK );
+
+ /* 2. Grab task state */
+ GetTaskState(task, &taskState);
+ TEST_ASSERT(taskState == TASK_STATE_SUSPENDED);
+
+ /* 3. Activate */
+ ActivateTask(task);
+
+ GetEvent(currTask,&mask);
+ if( expected ) {
+ TEST_ASSERT( mask & EVENT_MASK_test );
+ } else {
+ TEST_ASSERT( (mask & EVENT_MASK_test) == 0 );
+ }
+
+ /* Let task task run */
+ WaitEvent(EVENT_MASK_test);
+ ClearEvent(EVENT_MASK_test);
+}
+
+
+static void eventExpectNoDispatch( TaskType task ) {
+ EventMaskType mask;
+ StatusType rv;
+ /** req OS?? */
+ rv = GetEvent(task,&mask);
+ TEST_ASSERT(rv == E_OK);
+ TEST_ASSERT( !(mask & EVENT_MASK_test) );
+ /* After SetEvent(), NO dispatch */
+ SetEvent(task, EVENT_MASK_test);
+ GetEvent(task,&mask);
+ TEST_ASSERT( mask & EVENT_MASK_test );
+
+ /* Let the Low prio task run */
+ WaitEvent(EVENT_MASK_test);
+ ClearEvent(EVENT_MASK_test);
+}
+static void eventExpectDispatch( TaskType task ) {
+ EventMaskType mask;
+ StatusType rv;
+ /** req OS?? */
+ rv = GetEvent(task,&mask);
+ TEST_ASSERT(rv == E_OK);
+ TEST_ASSERT( !(mask & EVENT_MASK_test) );
+ /* After SetEvent(), dispatch */
+ SetEvent(task, EVENT_MASK_test);
+ GetEvent(task,&mask);
+ TEST_ASSERT( !(mask & EVENT_MASK_test) );
}
+
+
void etask_m_full( void ) {
+ StatusType rv;
+ TaskType task;
EventMaskType mask;
+ static int m_full_starts = 0;
+ _Bool kill = 0;
- ActivateTask(TASK_ID_etask_l_full);
- ActivateTask(TASK_ID_etask_h_full);
+ (void)rv;
+ m_full_starts++;
+ GetTaskID(&task);
for(;;) {
- switch(test_nr) {
- case 1:
- TEST_START("SetEvent() to low",test_nr);
- /** req OS?? */
- GetEvent(TASK_ID_etask_l_full,&mask);
- TEST_ASSERT( !(mask & EVENT_MASK_test) );
- /* After SetEvent(), NO dispatch */
- SetEvent(TASK_ID_etask_l_full, EVENT_MASK_test);
- GetEvent(TASK_ID_etask_l_full,&mask);
- TEST_ASSERT( mask & EVENT_MASK_test )
-
- /* Let the Low prio task run */
- WaitEvent(EVENT_MASK_test);
+ if( kill == 1) {
+ /* Kill tasks */
+#if 0
+ SetEvent(TASK_ID_etask_l_full, EVENT_MASK_kill);
+ SetEvent(TASK_ID_etask_h_full, EVENT_MASK_kill);
+ SetEvent(TASK_ID_etask_l_non, EVENT_MASK_kill);
+ SetEvent(TASK_ID_etask_h_non, EVENT_MASK_kill);
+#endif
+ SetEvent(TASK_ID_etask_master, EVENT_MASK_next);
+ TerminateTask();
+ }
+
+ TEST_START2();
+ switch(TEST_GETCASE()) {
+ case TEST_1:
+ GetTaskID(&task);
+ GetEvent(task,&mask);
+ TEST_ASSERT( (mask & EVENT_MASK_test) == 0 );
+ TEST_ASSERT( m_full_starts == 1 );
+ SetEvent(task,EVENT_MASK_test);
+ GetEvent(task,&mask);
+ TEST_ASSERT( (mask & EVENT_MASK_test) );
+ TEST_ASSERT( m_full_starts == 1 );
ClearEvent(EVENT_MASK_test);
- TEST_END();
- test_nr++;
break;
- case 2:
- TEST_START("SetEvent() to high",test_nr);
- /** req OS?? */
- GetEvent(TASK_ID_etask_h_full,&mask);
- TEST_ASSERT( !(mask & EVENT_MASK_test) );
- /* After SetEvent(), dispatch */
- SetEvent(TASK_ID_etask_h_full, EVENT_MASK_test);
- GetEvent(TASK_ID_etask_h_full,&mask);
- TEST_ASSERT( !(mask & EVENT_MASK_test) );
- TEST_END();
- test_nr = 100;
+ case TEST_2:
+ rv = ActivateTask(task);
+ TEST_ASSERT( rv == E_OS_LIMIT);
+ break;
+ case TEST_3:
+ eventExpectNoDispatch(TASK_ID_etask_l_full);
+ break;
+ case TEST_4:
+ eventExpectDispatch(TASK_ID_etask_h_full);
+ break;
+ case TEST_5:
+ eventExpectNoDispatch(TASK_ID_etask_l_non);
+ break;
+ case TEST_6:
+ eventExpectDispatch(TASK_ID_etask_h_non);
+ break;
+ case TEST_7:
+ taskDispatchCheck(TASK_ID_etask_l_full, EXPECTED, TASK_EXT );
+ break;
+ case TEST_8:
+ taskDispatchCheck(TASK_ID_etask_h_full, NOT_EXPECTED, TASK_EXT );
+ break;
+ case TEST_9:
+ taskDispatchCheck(TASK_ID_etask_l_non, EXPECTED, TASK_EXT );
+ break;
+ case TEST_10:
+ taskDispatchCheck(TASK_ID_etask_h_full, NOT_EXPECTED, TASK_EXT );
+ break;
+ case TEST_11:
+ taskDispatchCheck(TASK_ID_btask_l_full, EXPECTED, TASK_BASIC );
+ break;
+ case TEST_12:
+ taskDispatchCheck(TASK_ID_btask_h_full, NOT_EXPECTED, TASK_BASIC );
+ break;
+ case TEST_13:
+ taskDispatchCheck(TASK_ID_btask_l_non, EXPECTED, TASK_BASIC );
+ break;
+ case TEST_14:
+ taskDispatchCheck(TASK_ID_btask_h_full, NOT_EXPECTED, TASK_BASIC );
+ kill = 1;
break;
- case 100:
- /* Kill tasks */
- SetEvent(TASK_ID_etask_l_full, EVENT_MASK_test);
- SetEvent(TASK_ID_etask_h_full, EVENT_MASK_test);
- TerminateTask();
default:
TEST_ASSERT(0);
break;
}
-
+ TEST_END();
+ TEST_INC();
}
}
-void etask_m_none( void ) {
+void etask_m_non( void ) {
}
*/\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
\r
int btaskRunCnt = 0;\r
*/\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
#include "irq.h"\r
\r
\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
\r
\r
*/\r
\r
#include "Os.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "arc.h"\r
\r
\r
* but it should go away (suite_01)
* - Hooks and error handling should be unitfied into one file.
* - That test-cases is dependent on the former testcase to increase "test_nr"
+ * - Should be able to see what tests are not run?!
+ *
+ *
+ * Total tests: 150
+ * Not run: 5 (not touched by assert)
+ * Failures: 10
+ * Success: 135
+ * Not Implented: 0
+ *
+ * Next:
+ * 1. Fix statistics
+ * 2. Cleanup of testCnt and other "indexes"
+ * 3. Fix statistics over severaral test_suites. (move to NOLOAD section)
*
*/
int testCnt = 0;
+struct testStats {
+ int ok;
+ int fail;
+ int notRun;
+ int notImplemented;
+};
struct test {
uint8_t testSuite;
struct test testTable[50] = { {0} };
-void testInit( void ) {
+void TestInit( void ) {
}
\r
-void test_done( void ) {\r
+void TestDone( void ) {\r
printf( "\nTest summary\n"\r
"Total: %d\n"\r
"OK : %d\n"\r
* @param line
* @param function
*/\r
-void test_fail( const char *text,char *file, int line, const char *function ) {\r
+void TestFail( const char *text,char *file, int line, const char *function ) {\r
printf("%02d %02d FAILED, %s , %d, %s\n",test_suite, test_nr, file, line, function);\r
testTable[testCnt].testSuite = test_suite;
testTable[testCnt].testNr = test_nr;
- testTable[testCnt].status = TEST_FLG_ASSERT;
+ testTable[testCnt].status |= TEST_FLG_ASSERT;
// testCnt++;
// _test_failed++;\r
}\r
void testValidateHook( void ) {
}
+
/**
* Start a test
*/
-void testStart( const char *str, int testNr ) {
+void TestStart( const char *str, int testNr ) {
testTable[testCnt].status = TEST_FLG_RUNNING;
testTable[testCnt].testNr = testNr;
testTable[testCnt].description = str;
printf("%3d %3d %s\n",testCnt,testNr,str);
}
-void testInc( void ) {
+void TestInc( void ) {
testCnt++;
}
/**
* End a testcase.
*/
-void testEnd( void ) {
+void TestEnd( void ) {
uint16_t status = testTable[testCnt].status;
- if( status & TEST_FLG_RUNNING ) {
+ if( status & TEST_FLG_NOT_IMPLEMENTED ) {
+ printf("Not Implemented\n");
+ } else if( (status & TEST_FLG_TOUCHED) == 0 ) {
+ printf("NOT touched\n");
+ } else if( status & TEST_FLG_RUNNING ) {
if( status & TEST_FLG_ASSERT ) {
} else {
/* All is OK */
testTable[testCnt].status &= TEST_FLG_RUNNING;
testTable[testCnt].status |= TEST_FLG_OK;
+ printf("OK\n");
}
} else {
printf("testEnd() on a test that is not running\n");
testCnt++;
}
-void testExit( int rv ) {
+void TestExit( int rv ) {
Irq_Disable();
exit(rv);
}
+void TestTouch( void ) {
+ testTable[testCnt].status |= TEST_FLG_TOUCHED;
+}
+
+void TestNotImplemented( void ) {
+ testTable[testCnt].status |= TEST_FLG_NOT_IMPLEMENTED;
+}
+
\r
-void test_ok( void ) {\r
+void TestOk( void ) {\r
printf("%02d %02d OK\n",test_suite, test_nr);
testTable[testCnt].testSuite = test_suite;
testTable[testCnt].testNr = test_nr;
#define TEST_FRAMEWORK_H_\r
/* Test flags */
-#define TEST_FLG_RUNNING 1
-#define TEST_FLG_ASSERT (1<<1)
-#define TEST_FLG_DONE (1<<2)
-#define TEST_FLG_OK (1<<3)
+#define TEST_FLG_RUNNING 1
+#define TEST_FLG_ASSERT (1<<1)
+#define TEST_FLG_DONE (1<<2)
+#define TEST_FLG_OK (1<<3)
+#define TEST_FLG_NOT_IMPLEMENTED (1<<4)
+#define TEST_FLG_TOUCHED (1<<5)
-#define TEST_VALUE_NC (-1)\r
-void test_done( void );\r
+#define TEST_VALUE_NC (-1)
+
+#define TASK_ID_ILL 99
+#define RES_ID_ILL 99
+#define ALARM_ID_ILL 99
+#define SCHTBL_ID_ILL 99
+#define COUNTER_ID_ILL 99
+
+
+
+#define TEST_INIT() printf("Test init\n");
+#define TEST_FAIL(_text) TestFail((_text), __FILE__, __LINE__, __FUNCTION__ )
+#define TEST_OK() TestOk();
+#define TEST_ASSERT(_cond) TestTouch(); \
+ if(!(_cond)) { \
+ TEST_FAIL(#_cond); \
+ }
+
+/* Start to run a test */
+#define TEST_RUN() printf("Running test %d\n",test_nr);
+/* Indicate that a test is done */
+//#define TEST_DONE()
+#define TEST_START(_str,_nr) TestStart(_str,_nr)
+#define TEST_NEXT(_str,_next_nr) TestEnd(); TestStart(_str,_next_nr);
+#define TEST_END() TestEnd()
+#define TEST_NOT_IMPLEMENTED() TestNotImplemented();
+
+typedef struct TestFixture {
+ const char *description;
+ int nr;
+} TestFixtureType;
\r
-void test_fail( const char *text,char *file, int line, const char *function );\r
-void test_ok( void );\r
+void TestDone( void );\r
+\r
+void TestFail( const char *text,char *file, int line, const char *function );\r
+void TestOk( void );
+void TestTouch( void );\r
+
+void TestStart( const char *str, int testNr );
+void TestInc( void );
+void TestEnd( void );
+void TestExit( int rv );
+
+
+typedef void (*test_func_t)( void );
+
+extern int test_suite;
+extern int test_nr;
+
+
+
+#if 1
+#define SECTION_SUP
+#define SECTION_USER
+#else
+#define SECTION_SUP __attribute__ ((section(".text_app_sup")))
+#define SECTION_USER __attribute__ ((section(".text_app_user")))
+#endif
+
+#define SECTION_BSS_SUPER __attribute__ ((aligned (16),section(".bss")))
+#define SECTION_BSS_USER __attribute__ ((aligned (16),section(".bss")))
+
+#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 }
+
+#define DECLARE_TASKS(_nr) \
+ void etask_sup_l_##_nr( void ); \
+ void etask_sup_m_##_nr( void ); \
+ void etask_sup_h_##_nr( void ); \
+ void btask_sup_l_##_nr( void ); \
+ void btask_sup_m_##_nr( void ); \
+ void btask_sup_h_##_nr( void );
+
+
+/*
+ * Declare tests
+ */
+
+// Test master processes
+void OsIdle(void );
+void etask_master( void );
+void etask_sup_l( void ) SECTION_SUP;
+void etask_sup_m( void ) SECTION_SUP;
+void etask_sup_h( void ) SECTION_SUP;
+
+void btask_sup_l( void ) SECTION_SUP;
+void btask_sup_m( void ) SECTION_SUP;
+void btask_sup_h( void ) SECTION_SUP;
+
-void testStart( const char *str, int testNr );
-void testInc( void );
-void testEnd( void );
-void testExit( int rv );
+// Tests
+DECLARE_TASKS(01);
+DECLARE_TASKS(02);
+DECLARE_TASKS(03);
+DECLARE_TASKS(04);
\r
#endif /* TEST_FRAMEWORK_H_ */\r
//#include "Platform_Types.h"\r
#include "Os.h"\r
#include "debug.h"\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
//#include "test_cfg.h"\r
\r
#define EVENT_NR 1\r
#include "Os.h"\r
#include "debug.h"\r
#include <assert.h>\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
\r
\r
void etask_sup_l_02( void ) {\r
#include "debug.h"
//#include <stdio.h>
#include <assert.h>
-#include "os_test.h"
+#include "test_framework.h"
//static int test = 1;
#include "debug.h"\r
//#include <stdio.h>\r
#include <assert.h>\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "irq.h"\r
\r
#if 0\r
#include "debug.h"\r
//#include <stdio.h>\r
#include <assert.h>\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "irq.h"\r
\r
#if 0\r
#include "debug.h"\r
//#include <stdio.h>\r
#include <assert.h>\r
-#include "os_test.h"\r
+#include "test_framework.h"\r
#include "irq.h"\r
\r
void isr_l(void ) {\r