aboutsummaryrefslogtreecommitdiffstats
path: root/test/rt
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-03-20 15:41:04 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-03-20 15:41:04 +0000
commit6795208ee66ef38fa24316dd5137b4540a46bf62 (patch)
treebc0eaeca184e38531ef058c9762c2d897d496152 /test/rt
parented9c0c4ac9b4ffc8c502e3fab21446723e39e652 (diff)
downloadChibiOS-6795208ee66ef38fa24316dd5137b4540a46bf62.tar.gz
ChibiOS-6795208ee66ef38fa24316dd5137b4540a46bf62.tar.bz2
ChibiOS-6795208ee66ef38fa24316dd5137b4540a46bf62.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9143 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'test/rt')
-rw-r--r--test/rt/configuration.xml229
1 files changed, 194 insertions, 35 deletions
diff --git a/test/rt/configuration.xml b/test/rt/configuration.xml
index b08626d7a..7c59e5014 100644
--- a/test/rt/configuration.xml
+++ b/test/rt/configuration.xml
@@ -32,10 +32,89 @@
</description>
<global_data_and_code>
<global_definitions>
- <value><![CDATA[#define TEST_SUITE_NAME "ChibiOS/RT Test Suite"]]></value>
+ <value><![CDATA[#define TEST_SUITE_NAME "ChibiOS/RT Test Suite"
+
+/*
+ * Maximum number of test threads.
+ */
+#define MAX_THREADS 5
+
+/*
+ * Stack size of test threads.
+ */
+#if defined(CH_ARCHITECTURE_AVR) || defined(CH_ARCHITECTURE_MSP430)
+#define THREADS_STACK_SIZE 48
+#elif defined(CH_ARCHITECTURE_STM8)
+#define THREADS_STACK_SIZE 64
+#elif defined(CH_ARCHITECTURE_SIMIA32)
+#define THREADS_STACK_SIZE 512
+#else
+#define THREADS_STACK_SIZE 128
+#endif
+
+/*
+ * Working Area size of test threads.
+ */
+#define WA_SIZE THD_WORKING_AREA_SIZE(THREADS_STACK_SIZE)
+
+/*
+ * Union of all Working Areas, usable as a single large buffer if required.
+ */
+union test_buffers {
+ struct {
+ THD_WORKING_AREA(T0, THREADS_STACK_SIZE);
+ THD_WORKING_AREA(T1, THREADS_STACK_SIZE);
+ THD_WORKING_AREA(T2, THREADS_STACK_SIZE);
+ THD_WORKING_AREA(T3, THREADS_STACK_SIZE);
+ THD_WORKING_AREA(T4, THREADS_STACK_SIZE);
+ } wa;
+ uint8_t buffer[WA_SIZE * 5];
+};
+
+void test_terminate_threads(void);
+void test_wait_threads(void);]]></value>
</global_definitions>
<global_code>
- <value />
+ <value><![CDATA[/*
+ * Static working areas, the following areas can be used for threads or
+ * used as temporary buffers.
+ */
+union test_buffers test;
+
+/*
+ * Pointers to the spawned threads.
+ */
+thread_t *threads[MAX_THREADS];
+
+/*
+ * Pointers to the working areas.
+ */
+void * ROMCONST wa[5] = {test.wa.T0, test.wa.T1, test.wa.T2,
+ test.wa.T3, test.wa.T4};
+
+/*
+ * Sets a termination request in all the test-spawned threads.
+ */
+void test_terminate_threads(void) {
+ int i;
+
+ for (i = 0; i < MAX_THREADS; i++)
+ if (threads[i])
+ chThdTerminate(threads[i]);
+}
+
+/*
+ * Waits for the completion of all the test-spawned threads.
+ */
+void test_wait_threads(void) {
+ int i;
+
+ for (i = 0; i < MAX_THREADS; i++)
+ if (threads[i] != NULL) {
+ chThdWait(threads[i]);
+ threads[i] = NULL;
+ }
+}]]></value>
</global_code>
</global_data_and_code>
<sequences>
@@ -100,9 +179,9 @@ static void vtcb(void *p) {
<value />
</tags>
<code>
- <value><![CDATA[chSysLock();
-result = chSysIntegrityCheckI(CH_INTEGRITY_RLIST);
-chSysUnlock();
+ <value><![CDATA[chSysLock();
+result = chSysIntegrityCheckI(CH_INTEGRITY_RLIST);
+chSysUnlock();
test_assert(result == false, "ready list check failed");]]></value>
</code>
</step>
@@ -114,9 +193,9 @@ test_assert(result == false, "ready list check failed");]]></value>
<value />
</tags>
<code>
- <value><![CDATA[chSysLock();
-result = chSysIntegrityCheckI(CH_INTEGRITY_VTLIST);
-chSysUnlock();
+ <value><![CDATA[chSysLock();
+result = chSysIntegrityCheckI(CH_INTEGRITY_VTLIST);
+chSysUnlock();
test_assert(result == false, "virtual timers list check failed");]]></value>
</code>
</step>
@@ -128,9 +207,9 @@ test_assert(result == false, "virtual timers list check failed");]]></value>
<value />
</tags>
<code>
- <value><![CDATA[chSysLock();
-result = chSysIntegrityCheckI(CH_INTEGRITY_REGISTRY);
-chSysUnlock();
+ <value><![CDATA[chSysLock();
+result = chSysIntegrityCheckI(CH_INTEGRITY_REGISTRY);
+chSysUnlock();
test_assert(result == false, "registry list check failed");]]></value>
</code>
</step>
@@ -142,9 +221,9 @@ test_assert(result == false, "registry list check failed");]]></value>
<value />
</tags>
<code>
- <value><![CDATA[chSysLock();
-result = chSysIntegrityCheckI(CH_INTEGRITY_PORT);
-chSysUnlock();
+ <value><![CDATA[chSysLock();
+result = chSysIntegrityCheckI(CH_INTEGRITY_PORT);
+chSysUnlock();
test_assert(result == false, "port layer check failed");]]></value>
</code>
</step>
@@ -280,22 +359,6 @@ chSysEnable();]]></value>
</step>
</steps>
</case>
- </cases>
- </sequence>
- <sequence>
- <type index="0">
- <value>Internal Tests</value>
- </type>
- <brief>
- <value>Threads Functionality.</value>
- </brief>
- <description>
- <value>This sequence tests the ChibiOS/NIL functionalities related to threading.</value>
- </description>
- <shared_code>
- <value><![CDATA[#include "ch.h"]]></value>
- </shared_code>
- <cases>
<case>
<brief>
<value>System Tick Counter functionality.</value>
@@ -333,6 +396,27 @@ while (time == chVTGetSystemTimeX()) {
</step>
</steps>
</case>
+ </cases>
+ </sequence>
+ <sequence>
+ <type index="0">
+ <value>Internal Tests</value>
+ </type>
+ <brief>
+ <value>Threads Functionality.</value>
+ </brief>
+ <description>
+ <value>This sequence tests the ChibiOS/NIL functionalities related to threading.</value>
+ </description>
+ <shared_code>
+ <value><![CDATA[#include "ch.h"
+
+static THD_FUNCTION(thread, p) {
+
+ test_emit_token(*(char *)p);
+}]]></value>
+ </shared_code>
+ <cases>
<case>
<brief>
<value>Thread Sleep functionality.</value>
@@ -366,7 +450,7 @@ while (time == chVTGetSystemTimeX()) {
<value><![CDATA[time = chVTGetSystemTimeX();
chThdSleep(100);
test_assert_time_window(time + 100,
- time + 100 + 1,
+ time + 100 + CH_CFG_ST_TIMEDELTA + 1,
"out of time window");]]></value>
</code>
</step>
@@ -381,7 +465,7 @@ test_assert_time_window(time + 100,
<value><![CDATA[time = chVTGetSystemTimeX();
chThdSleepMicroseconds(100000);
test_assert_time_window(time + US2ST(100000),
- time + US2ST(100000) + 1,
+ time + US2ST(100000) + CH_CFG_ST_TIMEDELTA + 1,
"out of time window");]]></value>
</code>
</step>
@@ -396,7 +480,7 @@ test_assert_time_window(time + US2ST(100000),
<value><![CDATA[time = chVTGetSystemTimeX();
chThdSleepMilliseconds(100);
test_assert_time_window(time + MS2ST(100),
- time + MS2ST(100) + 1,
+ time + MS2ST(100) + CH_CFG_ST_TIMEDELTA + 1,
"out of time window");]]></value>
</code>
</step>
@@ -411,7 +495,7 @@ test_assert_time_window(time + MS2ST(100),
<value><![CDATA[time = chVTGetSystemTimeX();
chThdSleepSeconds(1);
test_assert_time_window(time + S2ST(1),
- time + S2ST(1) + 1,
+ time + S2ST(1) + CH_CFG_ST_TIMEDELTA + 1,
"out of time window");]]></value>
</code>
</step>
@@ -426,12 +510,87 @@ test_assert_time_window(time + S2ST(1),
<value><![CDATA[time = chVTGetSystemTimeX();
chThdSleepUntil(time + 100);
test_assert_time_window(time + 100,
- time + 100 + 1,
+ time + 100 + CH_CFG_ST_TIMEDELTA + 1,
"out of time window");]]></value>
</code>
</step>
</steps>
</case>
+ <case>
+ <brief>
+ <value>Ready List functionality, threads priority order.</value>
+ </brief>
+ <description>
+ <value>Five threads, are enqueued in the ready list and atomically executed. The test expects the threads to perform their operations in correct priority order regardless of the initial order.</value>
+ </description>
+ <condition>
+ <value />
+ </condition>
+ <various_code>
+ <setup_code>
+ <value />
+ </setup_code>
+ <teardown_code>
+ <value />
+ </teardown_code>
+ <local_variables>
+ <value />
+ </local_variables>
+ </various_code>
+ <steps>
+ <step>
+ <description>
+ <value>Creating 5 threads with increasing priority, execution sequence is tested.</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
+ <value><![CDATA[threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E");
+threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D");
+threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C");
+threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B");
+threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A");
+test_wait_threads();
+test_assert_sequence("ABCDE");]]></value>
+ </code>
+ </step>
+ <step>
+ <description>
+ <value>Creating 5 threads with decreasing priority, execution sequence is tested.</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
+ <value><![CDATA[threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A");
+threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B");
+threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C");
+threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D");
+threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E");
+test_wait_threads();
+test_assert_sequence("ABCDE");]]></value>
+ </code>
+ </step>
+ <step>
+ <description>
+ <value>Creating 5 threads with pseudo-random priority, execution sequence is tested.</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
+ <value><![CDATA[threads[1] = chThdCreateStatic(wa[1], WA_SIZE, chThdGetPriorityX()-4, thread, "D");
+threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-5, thread, "E");
+threads[4] = chThdCreateStatic(wa[4], WA_SIZE, chThdGetPriorityX()-1, thread, "A");
+threads[3] = chThdCreateStatic(wa[3], WA_SIZE, chThdGetPriorityX()-2, thread, "B");
+threads[2] = chThdCreateStatic(wa[2], WA_SIZE, chThdGetPriorityX()-3, thread, "C");
+test_wait_threads();
+test_assert_sequence("ABCDE");]]></value>
+ </code>
+ </step>
+ </steps>
+ </case>
</cases>
</sequence>
<sequence>