diff --git a/README.md b/README.md index f21c5556cd807876a57700830608dd67513178be..3c0453fd2d4c19a3d78f6ef02b69403e7eb2eec9 100644 --- a/README.md +++ b/README.md @@ -31,13 +31,14 @@ Software Requirements apt-get install binutils-dev build-essential clang-3.4 cmake \ g++-multilib gcc-multilib git grub-common grub-pc-bin \ llvm-3.3-dev llvm-3.3-runtime python-minimal python3 \ - python3-lxml python3-pip qemu-system-x86 xorriso \ + python3-lxml python3-pyparsing python3-pip \ + qemu-system-x86 xorriso LLVM_CONFIG_PATH=/usr/bin/llvm-config-3.3 pip3 install llvmpy For the ARM version, you will additionally need - gcc-arm-none-eabi gdb-arm-none-eabi + gcc-arm-none-eabi gdb-arm-none-eabi qemu-system-arm Building -------- diff --git a/app/bcc1/alarm1/CMakeLists.txt b/app/bcc1/alarm1/CMakeLists.txt index db468ef7874175567eca4af41b8a2eb38b53dc53..d5a06fc9995a49d86bd6bc7bc9377109d753e550 100644 --- a/app/bcc1/alarm1/CMakeLists.txt +++ b/app/bcc1/alarm1/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_alarm1a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm1b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_b.py LIBS libtest TEST_ISO @@ -18,7 +18,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm1c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_c.py LIBS libtest TEST_ISO @@ -27,7 +27,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm1d - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_d.py LIBS libtest TEST_ISO @@ -36,7 +36,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm1e - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_e.py LIBS libtest TEST_ISO @@ -46,7 +46,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm1f - SYSTEM_XML system.xml + SYSTEM_DESC system.xml # VERIFY verify_f.py LIBS libtest TEST_ISO diff --git a/app/bcc1/alarm1/system.oil b/app/bcc1/alarm1/system.oil new file mode 100644 index 0000000000000000000000000000000000000000..eeb47d9b5d9a05b3a2a8f3b43159466587b97aeb --- /dev/null +++ b/app/bcc1/alarm1/system.oil @@ -0,0 +1,53 @@ +CPU TestSystem { + + OS TestSystem { + STATUS = STANDARD; + ERRORHOOK = FALSE; + STARTUPHOOK = FALSE; + SHUTDOWNHOOK = FALSE; + PRETASKHOOK = FALSE; + POSTTASKHOOK = FALSE; + }; + + TASK H1 { + SCHEDULE = FULL; + PRIORITY = 5; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + TASK H2 { + SCHEDULE = FULL; + PRIORITY = 4; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + TASK H3 { + SCHEDULE = FULL; + PRIORITY = 3; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + ALARM A1 { + COUNTER = C1; + ACTION = ACTIVATETASK { + TASK = H2; + }; + AUTOSTART = TRUE { + ALARMTIME = 100; + CYCLETIME = 100; + }; + }; + + + COUNTER C1 { + MAXALLOWEDVALUE = 1000; + TICKSPERBASE = 1; + MINCYCLE = 1; + }; + + +}; + diff --git a/app/bcc1/alarm2/CMakeLists.txt b/app/bcc1/alarm2/CMakeLists.txt index bd1e849b36ae63d4f7dfca929695b04762e56da7..d6740bd6b5387e9bbab3bbdec5f1b10ca07e0d7e 100644 --- a/app/bcc1/alarm2/CMakeLists.txt +++ b/app/bcc1/alarm2/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_alarm2a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest TEST_ISO a.cc @@ -8,7 +8,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm2b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest TEST_ISO b.cc @@ -16,7 +16,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm2c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest TEST_ISO c.cc diff --git a/app/bcc1/alarm3/CMakeLists.txt b/app/bcc1/alarm3/CMakeLists.txt index 45cdaa993bf9158ed4c3bd8b2d9e7d1fa5d476ab..15b8011a3ca80cc04d2e5dd3df870297038cc9d2 100644 --- a/app/bcc1/alarm3/CMakeLists.txt +++ b/app/bcc1/alarm3/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_alarm3a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm3b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_b.py LIBS libtest TEST_ISO @@ -18,7 +18,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm3c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_c.py LIBS libtest TEST_ISO @@ -27,7 +27,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm3d - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_d.py LIBS libtest TEST_ISO @@ -36,7 +36,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_alarm3e - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_e.py LIBS libtest TEST_ISO diff --git a/app/bcc1/complex1/CMakeLists.txt b/app/bcc1/complex1/CMakeLists.txt index 3c381f3f46a44d51d813315305773b8cff5f19f4..6d8add57742146eaee4e1e4986c57012a5d99507 100644 --- a/app/bcc1/complex1/CMakeLists.txt +++ b/app/bcc1/complex1/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_complex1a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_complex1b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_b.py LIBS libtest TEST_ISO @@ -18,7 +18,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_complex1c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_c.py LIBS libtest TEST_ISO @@ -27,7 +27,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_complex1d - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest TEST_ISO d.cc diff --git a/app/bcc1/complex2/CMakeLists.txt b/app/bcc1/complex2/CMakeLists.txt index 2591632b03a318915b71b9416d51287bc2a44413..b7df38da3c81e0bd12cf1b8e336907f76b74aec3 100644 --- a/app/bcc1/complex2/CMakeLists.txt +++ b/app/bcc1/complex2/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_complex2a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO diff --git a/app/bcc1/hoffmann/CMakeLists.txt b/app/bcc1/hoffmann/CMakeLists.txt index 8c979565f0c552d9005bfd3c076935e7bbe1613d..c68c03de5d78081df147423550e7b3754ff2b165 100644 --- a/app/bcc1/hoffmann/CMakeLists.txt +++ b/app/bcc1/hoffmann/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME hoffmann_task1a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml a.cc ) diff --git a/app/bcc1/isr2/CMakeLists.txt b/app/bcc1/isr2/CMakeLists.txt index 870c1053abe19dd0fc7cdfc8188cca59b6ada5c9..b024fc82160b2e46f413d070d86ef4128eb0c04a 100644 --- a/app/bcc1/isr2/CMakeLists.txt +++ b/app/bcc1/isr2/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_isr2a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_isr2b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_b.py LIBS libtest TEST_ISO @@ -18,7 +18,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_isr2c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_c.py LIBS libtest TEST_ISO @@ -27,7 +27,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_isr2d - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_d.py LIBS libtest TEST_ISO diff --git a/app/bcc1/isr2/system.oil b/app/bcc1/isr2/system.oil new file mode 100644 index 0000000000000000000000000000000000000000..7674d3acf85e77ccffc89e11ce587d303e6d9fb1 --- /dev/null +++ b/app/bcc1/isr2/system.oil @@ -0,0 +1,40 @@ +CPU TestSystem { + + OS TestSystem { + STATUS = STANDARD; + ERRORHOOK = FALSE; + STARTUPHOOK = FALSE; + SHUTDOWNHOOK = FALSE; + PRETASKHOOK = FALSE; + POSTTASKHOOK = FALSE; + }; + + TASK H1 { + SCHEDULE = FULL; + PRIORITY = 5; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + TASK H2 { + SCHEDULE = FULL; + PRIORITY = 4; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + TASK H3 { + SCHEDULE = FULL; + PRIORITY = 3; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + ISR ISR1 { + CATEGORY = 2; + PRIORITY = 10; + DEVICE = 37; + }; + +}; + diff --git a/app/bcc1/lukas/CMakeLists.txt b/app/bcc1/lukas/CMakeLists.txt index f7638616b855015e3298dc0e82d242bbe2d2d281..3939ef7389c370f054e4a29da23960dbd318d862 100644 --- a/app/bcc1/lukas/CMakeLists.txt +++ b/app/bcc1/lukas/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_lukas_dispatch - SYSTEM_XML dispatch.xml + SYSTEM_DESC dispatch.xml LIBS libtest TEST_ISO dispatch.cc @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_lukas_alarmstress - SYSTEM_XML alarmstress.xml + SYSTEM_DESC alarmstress.xml LIBS libtest TEST_ISO alarmstress.cc @@ -17,7 +17,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_lukas_isr2 - SYSTEM_XML isr2.xml + SYSTEM_DESC isr2.xml LIBS libtest TEST_ISO isr2.cc diff --git a/app/bcc1/resource1/CMakeLists.txt b/app/bcc1/resource1/CMakeLists.txt index aaa16070bdf045f26c20c099deed0070fdf0427e..889794b76b7c000c17ac0db0047128204b6f6ec1 100644 --- a/app/bcc1/resource1/CMakeLists.txt +++ b/app/bcc1/resource1/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_resource1a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_a.py TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_b.py TEST_ISO @@ -18,7 +18,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_a.py # Same constraints as A TEST_ISO @@ -27,7 +27,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1d - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_d.py TEST_ISO @@ -36,7 +36,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1e - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_e.py TEST_ISO @@ -45,7 +45,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1f - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_f.py TEST_ISO @@ -55,7 +55,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1g - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_g.py TEST_ISO @@ -64,7 +64,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1h - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_h.py TEST_ISO @@ -73,7 +73,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1j - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest #VERIFY verify_j.py TEST_ISO @@ -82,7 +82,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource1k - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_k.py TEST_ISO diff --git a/app/bcc1/resource1/system.oil b/app/bcc1/resource1/system.oil new file mode 100644 index 0000000000000000000000000000000000000000..b2fda36b6e760b08bb0b8750e4499075487d7b3f --- /dev/null +++ b/app/bcc1/resource1/system.oil @@ -0,0 +1,67 @@ + +CPU TestSystem { + OS TestSystem { + STATUS = STANDARD; + ERRORHOOK = FALSE; + STARTUPHOOK = FALSE; + SHUTDOWNHOOK = FALSE; + PRETASKHOOK = FALSE; + POSTTASKHOOK = FALSE; + USERESSCHEDULER = TRUE; + }; + + TASK H1 { + SCHEDULE = FULL; + PRIORITY = 5; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + TASK H2 { + SCHEDULE = FULL; + PRIORITY = 4; + ACTIVATION = 1; + AUTOSTART = FALSE; + RESOURCE = R234; + }; + + TASK H3 { + SCHEDULE = FULL; + PRIORITY = 3; + ACTIVATION = 1; + AUTOSTART = FALSE; + RESOURCE = R234; + RESOURCE = R345; + }; + + TASK H4 { + SCHEDULE = FULL; + PRIORITY = 2; + ACTIVATION = 1; + AUTOSTART = FALSE; + RESOURCE = R234; + RESOURCE = R345; + }; + + TASK H5 { + SCHEDULE = FULL; + PRIORITY = 1; + ACTIVATION = 1; + AUTOSTART = TRUE { + APPMODE = OSDEFAULTAPPMODE; + }; + RESOURCE = R345; + }; + + APPMODE OSDEFAULTAPPMODE; + + RESOURCE R234 { + RESOURCEPROPERTY = STANDARD; + }; + + RESOURCE R345 { + RESOURCEPROPERTY = STANDARD; + }; + + +}; diff --git a/app/bcc1/resource2/CMakeLists.txt b/app/bcc1/resource2/CMakeLists.txt index 7169869a7704bb474cf7b098db2ff4bfc7e35d2b..5886013de8f779eedf65b9ebfea9f93a46bf1960 100644 --- a/app/bcc1/resource2/CMakeLists.txt +++ b/app/bcc1/resource2/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_resource2a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_resource2b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_b.py LIBS libtest TEST_ISO diff --git a/app/bcc1/sse1/CMakeLists.txt b/app/bcc1/sse1/CMakeLists.txt index b76b18b87d8601ae6d059388be98df447665748c..81d67647e45f70c8e57d45440c43424df035e644 100644 --- a/app/bcc1/sse1/CMakeLists.txt +++ b/app/bcc1/sse1/CMakeLists.txt @@ -2,7 +2,7 @@ DOSEK_BINARY( NAME bcc1_sse1a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_a.py TEST_ISO @@ -11,7 +11,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_sse1b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_b.py TEST_ISO @@ -21,7 +21,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_sse1c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml LIBS libtest VERIFY verify_c.py TEST_ISO diff --git a/app/bcc1/task1/CMakeLists.txt b/app/bcc1/task1/CMakeLists.txt index 90af46325c81d70dc41b10d21cb98f48195c5483..6259f5acc56de1e103c3d266ad9585b33ee3ef68 100644 --- a/app/bcc1/task1/CMakeLists.txt +++ b/app/bcc1/task1/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_task1a - SYSTEM_XML system.xml + SYSTEM_DESC system.oil VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task1a_sse - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest GENERATOR_ARGS -fgen-asserts -fsse @@ -19,7 +19,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task1b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_b.py LIBS libtest TEST_ISO @@ -28,7 +28,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task1c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_c.py LIBS libtest TEST_ISO @@ -37,7 +37,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task1d - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_d.py LIBS libtest TEST_ISO @@ -46,7 +46,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task1e - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_e.py LIBS libtest TEST_ISO @@ -55,7 +55,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task1f - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_f.py LIBS libtest TEST_ISO @@ -64,7 +64,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task1g - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_g.py LIBS libtest TEST_ISO diff --git a/app/bcc1/task1/system.oil b/app/bcc1/task1/system.oil new file mode 100644 index 0000000000000000000000000000000000000000..762091f4bcfab812999901ae2af27602fd06e4a6 --- /dev/null +++ b/app/bcc1/task1/system.oil @@ -0,0 +1,35 @@ +CPU TestSystem { + + OS TestSystem { + STATUS = STANDARD; + ERRORHOOK = FALSE; + STARTUPHOOK = FALSE; + SHUTDOWNHOOK = FALSE; + PRETASKHOOK = FALSE; + POSTTASKHOOK = FALSE; + }; + + TASK Handler11 { + SCHEDULE = FULL; + PRIORITY = 4; + ACTIVATION = 1; + AUTOSTART = TRUE; + }; + + TASK Handler12 { + SCHEDULE = FULL; + PRIORITY = 3; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + TASK Handler13 { + SCHEDULE = FULL; + PRIORITY = 5; + ACTIVATION = 1; + AUTOSTART = FALSE; + }; + + +}; + diff --git a/app/bcc1/task2/CMakeLists.txt b/app/bcc1/task2/CMakeLists.txt index c211f1f754e2173e8f2798d26b3897efe14bff98..9350f597a31a27b564d4a8a3692df47e65002e35 100644 --- a/app/bcc1/task2/CMakeLists.txt +++ b/app/bcc1/task2/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bcc1_task2a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task2b - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_b.py LIBS libtest TEST_ISO @@ -18,7 +18,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME bcc1_task2c - SYSTEM_XML system.xml + SYSTEM_DESC system.xml VERIFY verify_a.py LIBS libtest TEST_ISO diff --git a/app/benchmark/CMakeLists.txt b/app/benchmark/CMakeLists.txt index 3551dc8864b17ea13786d33382e8a908a7f5a7c3..acf20988f531f04692b5fe917414f30b24db24da 100644 --- a/app/benchmark/CMakeLists.txt +++ b/app/benchmark/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bench-task1a - SYSTEM_XML system.xml + SYSTEM_DESC system.xml FAIL a.cc ) diff --git a/app/benchmark/complex1/CMakeLists.txt b/app/benchmark/complex1/CMakeLists.txt index a0bf876151e6f24b0a215237fd1826af7c9df18d..832e37cbe2b169f6d692ae8389abe2a7bc92d1bb 100644 --- a/app/benchmark/complex1/CMakeLists.txt +++ b/app/benchmark/complex1/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bench-complex1d - SYSTEM_XML system.xml + SYSTEM_DESC system.xml FAIL d.cc ) diff --git a/app/benchmark/coptermock/CMakeLists.txt b/app/benchmark/coptermock/CMakeLists.txt index 13a4ff6e4c5463419a78d07d3b6cdc7498e07b11..8c4d92392c24ad70a25d7904f2d12865f4fae845 100644 --- a/app/benchmark/coptermock/CMakeLists.txt +++ b/app/benchmark/coptermock/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME bench-coptermock - SYSTEM_XML system.xml + SYSTEM_DESC system.xml FAIL dosek.cc ) @@ -8,6 +8,6 @@ DOSEK_BINARY( ## Should result in 1579971 system states for SSE #DOSEK_BINARY( # NAME bench-coptermock-no-annotation -# SYSTEM_XML system-no-annotation.xml +# SYSTEM_DESC system-no-annotation.xml # dosek.cc #) diff --git a/app/sysmodel/1alarm/CMakeLists.txt b/app/sysmodel/1alarm/CMakeLists.txt index b61d57152cd373d29436f0958c083c7554a4b5eb..bb1ca7d5bf383de34f5e864f00304db7c1b093c5 100644 --- a/app/sysmodel/1alarm/CMakeLists.txt +++ b/app/sysmodel/1alarm/CMakeLists.txt @@ -1,6 +1,6 @@ DOSEK_BINARY( NAME sysmodel_1alarm_a - SYSTEM_XML a.xml + SYSTEM_DESC a.xml VERIFY verify_a.py LIBS libtest TEST_ISO @@ -9,7 +9,7 @@ DOSEK_BINARY( DOSEK_BINARY( NAME sysmodel_1alarm_aa - SYSTEM_XML aa.xml # OTHER XML! + SYSTEM_DESC aa.xml # OTHER XML! VERIFY verify_aa.py LIBS libtest TEST_ISO diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt index 1f720d61d74ae1750d0f45eed413ef89e5ff437a..5afbc690d71f1615014c10933c411d74f1bd6e46 100644 --- a/generator/CMakeLists.txt +++ b/generator/CMakeLists.txt @@ -1,6 +1,6 @@ set(PYTHON_MODULES_TEST - SystemDescription + RTSCSystemDescription RTSCAnalysis ) diff --git a/generator/OILSystemDescription.py b/generator/OILSystemDescription.py new file mode 100755 index 0000000000000000000000000000000000000000..69453c1774618bce1a2d907a4e79c8532b881106 --- /dev/null +++ b/generator/OILSystemDescription.py @@ -0,0 +1,498 @@ +#!/usr/bin/env python3 +"""Parse OIL (OSEK Implementation Language) files. + see: http://portal.osek-vdx.org/files/pdf/specs/oil25.pdf +""" +from pyparsing import (Word, alphanums, alphas, hexnums, + nums, Optional, Keyword, QuotedString, Suppress, + Group, Forward, ZeroOrMore, cStyleComment, restOfLine) + +""" This is an example oil description: +CPU Josek_x86 { + OS JOSEK { + USEPARAMETERACCESS = FALSE; + STATUS = STANDARD; + USERESSCHEDULER = FALSE; + USEGETSERVICEID = FALSE; + POSTTASKHOOK = TRUE; + STARTUPHOOK = TRUE; + PRETASKHOOK = TRUE; + }; + + TASK task1 { + AUTOSTART = TRUE { + APPMODE = OSDEFAULTAPPMODE; + }; + ACTIVATION = 1; + PRIORITY = 1; + SCHEDULE = NON; + }; + + APPMODE OSDEFAULTAPPMODE { }; + + APPMODE OSDEFAULTAPPMODE { }; + +}; +""" + +class OILObject: + + def __init__(self, name=""): + self.name = name + + def evaluate(self, oil): + self.name = oil[0][1] + for param in oil[1]: + if hasattr(self, param[0]): + setattr(self, param[0], param[1]) + + def __str__(self): + ret = self.__class__.__name__ + " : " + self.name + for k,v in vars(self).items(): + if k.isupper(): # if it it a uppercase OIL Keyword + # lowercase members are special sets or lists + ret += "\n\t\t" + str(k) + ": " + str(v) + return ret + +class AppMode(OILObject): + + def __init__(self, name=""): + super(AppMode, self).__init__(name) + + +class Resource(OILObject): + + def __init__(self, name=""): + super(Resource, self).__init__(name) + self.RESOURCEPROPERTY = "" + self.tasks = dict() + + def __str__(self): + ret = super(Resource, self).__str__() + if self.tasks: + ret += "\n\t\tUsed by task(s): " + str(self.tasks) + return ret + + +class ISR(OILObject): + + def __init__(self, name=""): + super(ISR, self).__init__(name) + self.CATEGORY = "" + self.PRIORITY = -1 + self.resources = dict() + self.messages = dict() + self.DEVICE = None + + def get_device(self): + assert self.DEVICE, "No device number set for ISR '" + self.name + "'" + return self.DEVICE + + device = property(get_device, None, None, "Returns the ISRs device number") + + def evaluate(self, oil): + super(ISR, self).evaluate(oil) + for param in oil[1]: + if param[0] == "RESOURCE": + self.resources[param[1]] = param[1] + + + def __str__(self): + ret = super(ISR, self).__str__() + if self.resources: + ret += "\n\t\tUses resource(s)" + str(self.resources) + return ret + + +class Event(OILObject): + + def __init__(self, name=""): + super(Event, self).__init__(name) + self.MASK = "" + + +class Counter(OILObject): + + def __init__(self, name=""): + super(Counter, self).__init__(name) + self.MAXALLOWEDVALUE = "" + self.TICKSPERBASE = "" + self.MINCYCLE = "" + + +class Alarm(OILObject): + + class ActionParam: + def __str__(self): + ret = self.__class__.__name__ + for k,v in vars(self).items(): + if k.isupper(): + ret += "\n\t\t\t" + str(k) + ": " + str(v) + return ret + + class ACTIVATETASK(ActionParam): + def __init__(self, task=""): + self.TASK = task + + class SETEVENT(ActionParam): + def __init__(self, task="", event=""): + self.TASK = task + self.EVENT = event + + class ALARMCALLBACK(ActionParam): + def __init__(self, cb=""): + self.ALARMCALLBACKNAME = cb + + class AutostartParams(ActionParam): + def __init__(self): + self.ALARMTIME = 0 + self.CYCLETIME = 0 + self.APPMODE = set() + + def __init__(self, name=""): + super(Alarm, self).__init__(name) + self.COUNTER = "" + self.ACTION = "" + self.action_params = "" + self.AUTOSTART = "" + self.autostart_params = None + + def evaluate(self, oil): + super(Alarm, self).evaluate(oil) + ''' read out alarm actions ''' + for param in oil[1]: + if param[0] == "ACTION" and len(param) > 2: + if param[1] == "SETEVENT": + self.action_params = self.SETEVENT() + elif param[1] == "ACTIVATETASK": + self.action_params = self.ACTIVATETASK() + elif param[1] == "ALARMCALLBACK": + self.action_params = self.ALARMCALLBACK() + + for acp in param[2:]: + if hasattr(self.action_params, acp[0]): + setattr(self.action_params, acp[0], acp[1]) + ''' read out autostart parameters ''' + if param[0] == "AUTOSTART" and len(param) > 2 and param[1] == True: + self.autostart_params = self.AutostartParams() + for acp in param[2:]: + if acp[0] == "ALARMTIME": + self.autostart_params.ALARMTIME = int(acp[1]) + elif acp[0] == "CYCLETIME": + self.autostart_params.CYCLETIME = int(acp[1]) + elif acp[0] == "APPMODE": + self.autostart_params.APPMODE.add(acp[1]) + + @property + def counter(self): + return self.COUNTER.name + + @property + def event(self): + return None + + @property + def armed(self): + return self.AUTOSTART + + @property + def cycletime(self): + return self.autostart_params.CYCLETIME + + @property + def reltime(self): + return self.autostart_params.ALARMTIME + + def activated_task(self): + if self.action_params.TASK: + return self.action_params.TASK.name + else: + return None + + + def __str__(self): + ret = super(Alarm, self).__str__() + ret += "\n\t\tAction Params: " + str(self.action_params) + if self.autostart_params: + ret += "\n\t\tAutostart Params: " + str(self.autostart_params) + return ret + + +class Task(OILObject): + + def __init__(self, name=""): + super(Task, self).__init__(name) + self.AUTOSTART = False + self.autostart_appmodes = dict() + self.ACTIVATION = 0 + self.PRIORITY = 0 + self.SCHEDULE = "NON" + self.resources = dict() + + def evaluate(self, oil): + super(Task, self).evaluate(oil) + + ''' read out appmodes for autostart ''' + for param in oil[1]: + if param[0] == "AUTOSTART": + if len(param) > 2 and param[1] == "TRUE": + ''' if AUTOSTART = TRUE, there should be appmodes to start in ''' + for appmode in param[2:]: + if appmode[0] == "APPMODE": + self.autostart_appmodes[appmode[1]] = appmode[1] + if param[0] == "RESOURCE": + self.resources[param[1]] = param[1]; + @property + def is_autostarted(self): + return self.AUTOSTART + + @property + def preemptable(self): + return self.SCHEDULE.upper() == "FULL" + + @property + def max_activations(self): + return self.ACTIVATION + + @property + def autostart(self): + return self.AUTOSTART + + @property + def priority(self): + return self.PRIORITY + + def __str__(self): + ret = super(Task, self).__str__() + if self.AUTOSTART: + ret += "\n\t\tAUTOSTART APPMODES: " + str(self.autostart_appmodes) + if len(self.resources) > 0: + ret += "\n\t\tRESOURCES: " + str(self.resources) + return ret + + +class OS(OILObject): + + def __init__(self, name=""): + super(OS, self).__init__(name) + self.name = name + self.USEPARAMETERACCESS = False + self.STATUS = "STANDARD" + self.USERESSCHEDULER = False + self.USEGETSERVICEID = False + self.POSTTASKHOOK = False + self.STARTUPHOOK = False + self.PRETASKHOOK = False + + +class CPU: + + def __init__(self, name=""): + self.name = name + self.description = "" + self.os = OS() + self.tasks = dict() + self.appmodes = dict() + self.resources = dict() + self.counters = dict() + self.events = dict() + self.isrs = dict() + + def evaluate(self, oil): + self.name = oil[1] + + def interconnect(self): + for task in self.tasks.values(): + # Interconnect resources + new_taskresources = dict() + for tres in task.resources: + assert tres in self.resources, "Resource '" + tres + "' used by Task '" + task.name + "' not found" + new_taskresources[tres] = self.resources[tres] + self.resources[tres].tasks[task.name] = task + task.resources = new_taskresources + + # Interconnect appmodes + new_appmodes = dict() + for tappm in task.autostart_appmodes: + assert tappm in self.appmodes, "Appmode '" + tappm + "' used by Task '" + task.name + "' not found" + new_appmodes[tappm] = self.appmodes[tappm] + task.autostart_appmodes = new_appmodes + + for alarm in self.alarms.values(): + # Interconnect alarm counters + assert alarm.COUNTER in self.counters, "Counter '" + alarm.COUNTER + "' used by Alarm '" + alarm.name + "' not found" + alarm.COUNTER = self.counters[alarm.COUNTER] + + if alarm.ACTION == "SETEVENT": + assert isinstance(alarm.action_params, Alarm.SETEVENT), "Alarm action parameter mismatch" + altask = alarm.action_params.TASK + alevent = alarm.action_params.EVENT + assert altask in self.tasks, "Alarm action task '" + altask + "' not found" + assert alevent in self.events, "Alarm action event '" + alevent + "' not found" + alarm.action_params.TASK = self.tasks[altask] + alarm.action_params.EVENT = self.events[alevent] + elif alarm.ACTION == "ACTIVATETASK": + assert isinstance(alarm.action_params, Alarm.ACTIVATETASK), "Alarm action parameter mismatch" + altask = alarm.action_params.TASK + assert altask in self.tasks, "Alarm action task '" + altask + "' not found" + alarm.action_params.TASK = self.tasks[altask] + elif alarm.ACTION == "ALARMCALLBACK": + assert isinstance(alarm.action_params, Alarm.ALARMCALLBACK), "Alarm action parameter mismatch" + # intentionally left blank, there is no callback object defined in oil + + if alarm.autostart_params: + new_appmodes = dict() + for appm in alarm.autostart_params.APPMODE: + assert appm in self.appmodes, "Appmode '" + appm + "' used by Alarm '" + alarm.name + "' not found" + new_appmodes[appm] = self.appmodes[appm] + alarm.autostart_params.APPMODE = new_appmodes + + for isr in self.isrs.values(): + new_isrresources = dict() + for isrres in isr.resources: + assert isrres in self.resources, "ISR uses undefined resource '" + isrres + "'" + new_isrresources[isrres] = self.resources[isrres] + isr.resources = new_isrresources + + + def __str__(self): + ret = "CPU " + self.name + "\n\t" + str(self.os) + for x in [obj.values() for obj in [self.tasks, self.appmodes, self.resources, self.counters, self.alarms, self.events, self.isrs]]: + for xi in x: + ret += "\n\t" + str(xi) + + return ret + + +class OILSystemDescription: + + """ This is the pyparsing OIL syntax description """ + name = Word(alphas+"_", alphanums + "_") # Only Alphas as starting character + hexnumber = ("0x" + Word(hexnums)).setParseAction(lambda t : int("".join(t),16)) + decnumber = (Optional("-") + Word(nums)).setParseAction(lambda t : int("".join(t))) + number = hexnumber ^ decnumber + boolean = (Keyword("TRUE") | Keyword("FALSE")).setParseAction(lambda t : True if t[0] == "TRUE" else False) + oilstring = QuotedString('"') + + description = Optional(Suppress(":") + oilstring) + semi = Suppress(";") + ob = Suppress("{") + cb = Suppress("}") + + oobject = Keyword("OS") ^ Keyword("TASK") ^ Keyword("COUNTER") ^ Keyword("ALARM") \ + ^ Keyword("RESOURCE") ^ Keyword("EVENT") ^ Keyword("ISR") ^ Keyword("MESSAGE") \ + ^ Keyword("COM") ^ Keyword("NM") ^ Keyword("APPMODE") ^ Keyword("IPDU") + object_name = Group(oobject + name) # e.g., OS myOs, COUNTER mycounter + + attribute_name = name ^ oobject + attribute_value = boolean ^ name ^ oilstring ^ number # longest match wins 'TRUEtask' wins against 'TRUE' + parameter_list = Forward() # Forward declaration... + parameter_decl = attribute_name + Suppress("=") + attribute_value + parameter = Group(parameter_decl + description("parameter_description") + + Optional(ob + parameter_list + cb) + semi) + + parameter_list << (ZeroOrMore(parameter)) + + object_definiton = object_name + description + semi ^ object_name + ob \ + + Group(Optional(parameter_list)) + cb + description + semi + + object_definiton_list = ZeroOrMore(Group(object_definiton)) + + oil_def = Group("CPU" + name("cpu_name")) + ob + object_definiton_list("cpu_objects") \ + + cb + description + semi + + singleLineComment = "//" + restOfLine + oil_def.ignore(singleLineComment) # Ignore // comments until end of line + oil_def.ignore(cStyleComment) # Ignore /* */ comments + + + def __init__(self, oilfile): + self.oil = self.oil_def.parseFile(oilfile) + print("evaluating: " + oilfile) + self.refined = self.refine(self.oil) + + def refine(self, oil): + ''' Read out parsed oil file ''' + cpu = CPU() + os = OS() + tasks = dict() + appmodes = dict() + resources = dict() + counters = dict() + alarms = dict() + events = dict() + isrs = dict() + # Read out CPU + for x in oil: + if x[0] == "CPU": + cpu.evaluate(x) + elif x[0][0] == "OS": + os.evaluate(x) + elif x[0][0] == "TASK": + task = Task() + task.evaluate(x) + tasks[task.name] = task + elif x[0][0] == "APPMODE": + appmode = AppMode(x[0][1]) + appmodes[appmode.name] = appmode + elif x[0][0] == "RESOURCE": + resource = Resource() + resource.evaluate(x) + resources[resource.name] = resource + elif x[0][0] == "COUNTER": + counter = Counter() + counter.evaluate(x) + counters[counter.name] = counter + elif x[0][0] == "ALARM": + alarm = Alarm() + alarm.evaluate(x) + alarms[alarm.name] = alarm + elif x[0][0] == "EVENT" : + event = Event() + event.evaluate(x) + events[event.name] = event + elif x[0][0] == "ISR" : + isr = ISR() + isr.evaluate(x) + isrs[isr.name] = isr + + + cpu.os = os + cpu.tasks = tasks + cpu.appmodes = appmodes + cpu.resources = resources + cpu.counters = counters + cpu.alarms = alarms + cpu.events = events + cpu.isrs = isrs + + cpu.interconnect() + return cpu + + + def getOS(self): + return self.refined.os + + def getTasks(self): + return self.refined.tasks.values() + + def getCounters(self): + return self.refined.counters.values() + + def getAlarms(self): + return self.refined.alarms.values() + + def getResources(self): + return self.refined.resources.values() + + def getISRs(self): + return self.refined.isrs.values() + + + def __str__(self): + return str(self.refined) + +if __name__ == "__main__": + oil = OILSystemDescription('test/example.oil') + print(oil) + + diff --git a/generator/SystemDescription.py b/generator/RTSCSystemDescription.py similarity index 98% rename from generator/SystemDescription.py rename to generator/RTSCSystemDescription.py index 03242ba760e7f715686030f566fad13e94d236b4..761b88439ad69c2fdd9e2b0bf113089746fc208e 100644 --- a/generator/SystemDescription.py +++ b/generator/RTSCSystemDescription.py @@ -3,7 +3,7 @@ import os from collections import namedtuple -class SystemDescription: +class RTSCSystemDescription: """The system description represents the system.xml, that describes the elements within the application (tasks, alarms, etc...). @@ -191,9 +191,9 @@ class SystemDescription: ################################################################ import unittest -class TestSystemDescription(unittest.TestCase): +class TestRTSCSystemDescription(unittest.TestCase): def setUp(self): - self.desc = SystemDescription("test/system.xml") + self.desc = RTSCSystemDescription("test/system.xml") def test_osek_attributes(self): self.assertEqual(self.desc.getName(), "TestSystem") self.assertFalse(self.desc.isExtended()) diff --git a/generator/graph/SystemGraph.py b/generator/graph/SystemGraph.py index fafe1feada8c9bd313169f95970b0a20db238302..c3a0fd2c2c27740b294ef8c8584798d7a4ab1d13 100644 --- a/generator/graph/SystemGraph.py +++ b/generator/graph/SystemGraph.py @@ -8,6 +8,7 @@ from generator.graph.Sporadic import Alarm, ISR from generator.graph.Resource import Resource from generator.graph.common import GraphObject from generator.statistics import Statistics +from collections import namedtuple class SystemGraph(GraphObject, PassManager): @@ -93,8 +94,107 @@ class SystemGraph(GraphObject, PassManager): """The scheduler priority is higher than the highest task""" return max([x.static_priority for x in self.get_subtasks()]) + 1 - def read_system_description(self, system): - """Reads in the system description and builds the tasks and subtask + + def read_oil_system_description(self, system): + """Reads in the system description out of an OIL file and builds the tasks and subtask + objects and connects them""" + maxprio = 0 # Maximum task prio according to OIL file + for task_desc in system.getTasks(): + taskname = task_desc.name + task = Task(self, "Task:" + taskname) + self.tasks.append(task) + self.stats.add_child(self, "task", task) + subtask = Subtask(self, taskname, "OSEKOS_TASK_" + taskname) + # Every subtask belongs to a task + task.add_subtask(subtask) + # Every subtask is also a function + self.functions[subtask.function_name] = subtask + self.stats.add_child(task, "subtask", subtask) + assert task_desc.priority != 0, \ + "No user thread can have the priority 0, reserved for the idle thread" + subtask.set_static_priority(task_desc.priority) + + if task_desc.priority > maxprio: + maxprio = task_desc.priority + + subtask.set_preemptable(task_desc.preemptable) + subtask.set_basic_task(True) + subtask.set_max_activations(task_desc.max_activations) + subtask.set_autostart(task_desc.autostart) + subtask.set_is_isr(False) + self.stats.add_data(subtask, "is_isr", False, scalar = True) + + # ISR + isr_prio = maxprio + 1 # ISR get priorities above maximum task prio + for isr_desc in system.getISRs(): + task = Task(self, "ISRTask:" + isr_desc.name) + self.tasks.append(task) + self.stats.add_child(self, "task", task) + subtask = Subtask(self, isr_desc.name, "OSEKOS_ISR_" + isr_desc.name) + task.add_subtask(subtask) + self.functions[subtask.function_name] = subtask + self.stats.add_child(task, "subtask", subtask) + + prio = isr_desc.PRIORITY + if prio == -1: + prio = isr_prio + isr_prio = isr_prio + 1 # increment isr prio + + subtask.set_static_priority(prio) + + # Assumption: Our subtasks are non-preemptable basic-tasks + subtask.set_preemptable(False) + subtask.set_basic_task(True) + subtask.set_max_activations(1) + subtask.set_autostart(False) + subtask.set_is_isr(True, isr_desc.device) + self.stats.add_data(subtask, "is_isr", True, scalar = True) + + self.isrs.append(ISR(self, subtask)) + + # Counters + Counter = namedtuple("Counter", ["name", "maxallowedvalue", "ticksperbase", "mincycle"]) + for ctr in system.getCounters(): + self.counters.append(Counter(name = ctr.name, + maxallowedvalue = ctr.MAXALLOWEDVALUE, + ticksperbase = ctr.TICKSPERBASE, + mincycle = ctr.MINCYCLE)) + + # Alarms + for alarm in system.getAlarms(): + assert alarm.activated_task() != None, "Alarm does not activate any task! (maybe callback?)" + activated_subtask = self.functions["OSEKOS_TASK_" + alarm.activated_task()] + belongs_to_task = activated_subtask.task + + # Generate an Alarm Handler SubTask + name = "OSEKOS_ALARM_HANDLER_" + alarm.name + subtask = Subtask(self, alarm.name, name) + subtask.set_static_priority(1<<31) + subtask.set_preemptable(False) + subtask.set_basic_task(True) + subtask.set_max_activations(1) + subtask.set_autostart(False) + subtask.set_is_isr(True) + + # And add it to the task where the activated task belongs to + belongs_to_task.add_subtask(subtask) + self.functions[subtask.function_name] = subtask + + self.alarms.append(Alarm(self, subtask, alarm, activated_subtask)) + + # Resources + for res in system.getResources(): + self.resources[res.name] = Resource(self, res.name, res.tasks) + + if not "RES_SCHEDULER" in self.resources: + sched = "RES_SCHEDULER" + subtasks = [x.name for x in self.get_subtasks() + if not x.is_isr] + self.resources[sched] = Resource(self, sched, subtasks) + + + def read_xml_system_description(self, system): + """Reads in the system description out of an XML file and builds the tasks and subtask objects and connects them""" for task_desc in system.getTasks(): @@ -174,6 +274,7 @@ class SystemGraph(GraphObject, PassManager): if not x.is_isr] self.resources[sched] = Resource(self, sched, subtasks) + def read_llvmpy_analysis(self, llvmpy): self.llvmpy = llvmpy self.max_abb_id = 0 diff --git a/generator/main.py b/generator/main.py index e6b181734d904363fc2926c0f42ebd4b1f866fd3..67285161accc833bea27765535662252a1692c2a 100755 --- a/generator/main.py +++ b/generator/main.py @@ -35,7 +35,7 @@ if __name__ == "__main__": source_dir = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.abspath(os.path.join(source_dir, ".."))) - from generator import SystemDescription, RTSCAnalysis, LLVMPYAnalysis, Generator + from generator import LLVMPYAnalysis, Generator, RTSCAnalysis, RTSCSystemDescription, OILSystemDescription from generator.rules import * from generator.graph import * from generator.tools import panic, wrap_typecheck_functions @@ -45,8 +45,8 @@ if __name__ == "__main__": usage = "usage: %prog [options]" parser = optparse.OptionParser(usage=usage) - parser.add_option("", "--system-xml", - metavar="SYSTEM_XML", help="the system description file") + parser.add_option("", "--system-desc", + metavar="SYSTEM_DESC", help="the system description file (.xml or .oil)") parser.add_option("", "--rtsc-analyze-xml", metavar="RTSC_ANALYZE_XML", help="the RTSC Analyze file") parser.add_option("-p", "--prefix", @@ -88,14 +88,26 @@ if __name__ == "__main__": sys.exit(-1) setup_logging(options.verbose) - - system_description = SystemDescription.SystemDescription(options.system_xml) - - graph = SystemGraph() pass_manager = graph pass_manager.read_verify_script(options.verify) - graph.read_system_description(system_description) + + if options.system_desc: + if options.system_desc.lower().endswith(".xml"): + system_description = RTSCSystemDescription.RTSCSystemDescription(options.system_desc) + graph.read_xml_system_description(system_description) + elif options.system_desc.lower().endswith(".oil"): + system_description = OILSystemDescription.OILSystemDescription(options.system_desc) + graph.read_oil_system_description(system_description) + else: + print("No valid system description file") + parser.print_help() + sys.exit(-1) + else: + print("No system description file passed") + parser.print_help() + sys.exit(-1) + systemanalysis = None diff --git a/generator/test/example.oil b/generator/test/example.oil new file mode 100644 index 0000000000000000000000000000000000000000..d110b7959f372f5b73952ddd2e8ec59027fb77b3 --- /dev/null +++ b/generator/test/example.oil @@ -0,0 +1,99 @@ + +CPU Josek_x86 { + OS JOSEK { + USEPARAMETERACCESS = FALSE; + STATUS = STANDARD; + USERESSCHEDULER = TRUE; + USEGETSERVICEID = FALSE; + POSTTASKHOOK = TRUE : "Description of posttaskhook"; + STARTUPHOOK = TRUE; + PRETASKHOOK = TRUE; + }; + + TASK task1 { + AUTOSTART = TRUE { + APPMODE = appmode1; + APPMODE = appmode2; + }; + ACTIVATION = 1; + PRIORITY = 1; + SCHEDULE = NON; + }; + + TASK task2 { + AUTOSTART = FALSE; + ACTIVATION = 1; + PRIORITY = 1; + SCHEDULE = NON; + RESOURCE = res1; + RESOURCE = res2; + } : "This is the second task"; + + + APPMODE appmode1 { }; + APPMODE appmode2 { }; + + RESOURCE res1 { + RESOURCEPROPERTY = STANDARD; + }; + + RESOURCE res2 { + RESOURCEPROPERTY = STANDARD; + }; + + COUNTER Timer { + MINCYCLE = 16; MAXALLOWEDVALUE = 127; TICKSPERBASE = 90; + }; + + ALARM WakeTaskA { + COUNTER = Timer; + ACTION = SETEVENT { + TASK = task2; + EVENT = event1; + }; + AUTOSTART = FALSE; + }; + + COUNTER SysCounter { + MINCYCLE = 16; MAXALLOWEDVALUE = 127; TICKSPERBASE = 90; + }; + + + + ALARM WakeTaskB { + COUNTER = SysCounter; + ACTION = ACTIVATETASK { + TASK = task1; + }; + AUTOSTART = TRUE { + ALARMTIME = 50; + CYCLETIME = 100; + APPMODE = appmode1; + APPMODE = appmode2; + }; + }; + + EVENT event1 { + MASK = 0xf2; // TODO: hex allow to parse hex digits + }; + + EVENT event2 { + MASK = AUTO; + }; + + + ALARM RunCallbackC { + COUNTER = SysCounter; + ACTION = ALARMCALLBACK { + ALARMCALLBACKNAME = "CallbackC"; + }; + AUTOSTART = FALSE; + }; + + ISR isr1 { + CATEGORY = 2; + RESOURCE = res1; + DEVICE = 32; + }; + +} : "Das ist eine Beschreibung der CPU" ; diff --git a/how-to-build.txt b/how-to-build.txt index b71762f5a70c4417de888c7ccd45b930b0a91029..98afd224d28167c47197946081d64f9cabfb6de0 100644 --- a/how-to-build.txt +++ b/how-to-build.txt @@ -2,6 +2,7 @@ cmake python python3-pip +python3-pyparsing # for llvmpy, currently only llvm-3.3 is supported, so llvm-3.3 llvm-3.3-runtime @@ -30,7 +31,10 @@ gcc-arm-none-eabi gdb-arm-none-eabi # TLDR; just works out of the box with Ubuntu Utopic Unicorn (14.10) -sudo apt-get install llvm-3.3 llvm-3.3-runtime clang-3.4 gcc-arm-none-eabi gdb-arm-none-eabi python python3-pip cmake grub-common xorriso gcc-multilib g++-multilib qemu-system-i386 \ +sudo apt-get install llvm-3.3 llvm-3.3-runtime clang-3.4 \ +gcc-arm-none-eabi gdb-arm-none-eabi python3 python3-pip \ +python3-pyparsing cmake grub-common xorriso \ +gcc-multilib g++-multilib qemu-system-i386 \ && \ sudo sh -c "LLVM_CONFIG_PATH=/usr/bin/llvm-config-3.3 pip3 install llvmpy" diff --git a/scripts/docker/dosek-base/Dockerfile b/scripts/docker/dosek-base/Dockerfile index f4ba9b30a695a36ab1781d1bc6dee05686c67127..3e4753611f8c3af6a63594b75adbf04a6e338e82 100644 --- a/scripts/docker/dosek-base/Dockerfile +++ b/scripts/docker/dosek-base/Dockerfile @@ -18,6 +18,7 @@ RUN apt-get update; apt-get install -y \ python3 \ python3-lxml \ python3-pip \ + python3-pyparsing \ qemu-system-x86 \ screen \ vim \ diff --git a/toolchain/app.cmake b/toolchain/app.cmake index 2959e9431048436fa5f8e7454701d9f709aefe12..9969df153a0ab4939e755f6d02947c0f4bbe9c0b 100644 --- a/toolchain/app.cmake +++ b/toolchain/app.cmake @@ -1,13 +1,11 @@ include(CMakeParseArguments) include(rtsc) - -MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS LIBS GENERATOR_ARGS) +MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_DESC VERIFY_SCRIPT DEFINITIONS LIBS GENERATOR_ARGS) SET(DOSEK_ANNOTATE_SOURCE "${DOSEK_GENERATOR_DIR}/annotate/cored_annotate.cc") SET(DOSEK_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${NAME}") file(MAKE_DIRECTORY "${DOSEK_OUTPUT_DIR}") SET(DOSEK_ANNOTATE_OBJECT "${DOSEK_OUTPUT_DIR}/cored_annotate.ll") - # compile annotate file set(ISA_CXX_FLAGS_LIST ${ISA_CXX_FLAGS}) separate_arguments(ISA_CXX_FLAGS_LIST) @@ -40,8 +38,6 @@ MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS string(REPLACE " " ";" COMPILER_FLAGS ${CMAKE_CXX_FLAGS}) # First we have to compile all source files with clang - - #COMMAND ${CLANGPP_BINARY} -S -emit-llvm -O0 -std=c++11 ${ISA_CXX_FLAGS_LIST} ${DEFINITON_FLAGS} ${INCLUDEDIRS_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${src} -o ${llvm_bytecode} foreach(src ${SOURCES}) set(llvm_bytecode "${DOSEK_OUTPUT_DIR}/${src}.ll") add_custom_command(OUTPUT ${llvm_bytecode} @@ -56,25 +52,6 @@ MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS list(APPEND DOSEK_BINARY_LLVM_BYTECODE ${llvm_bytecode}) endforeach(src) - # # Use RTSC to analyze and merge the source system bytecode - # add_custom_command(OUTPUT "${DOSEK_SOURCE_SYSTEM}" - # DEPENDS ${DOSEK_ANNOTATE_OBJECT} - # ${DOSEK_BINARY_LLVM_BYTECODE} - # ${CMAKE_CURRENT_SOURCE_DIR}/*.xml - # COMMAND ${EAG_BINARY} -data-deps=explicit -verify - # -sysann=${DOSEK_ANNOTATE_OBJECT} - # -sourcesystem=${SYSTEM_XML} - # -out=${DOSEK_OUTPUT_DIR} - # -analyze-tasks -dump-source-system - # -dump-graphs - # ${DOSEK_BINARY_LLVM_BYTECODE} - # COMMENT "[${PROJECT_NAME}/${NAME}] Analyzing application with RTSC") - # - # # Add Target for the analysis step - # add_custom_target(${NAME}-rtsc-analyze - # DEPENDS ${DOSEK_SOURCE_SYSTEM}) - - # All python source files are a dependency SET(DOSEK_GENERATOR_ARGS "${GENERATOR_ARGS}") file(GLOB_RECURSE PYTHON_SOURCE "${DOSEK_GENERATOR_DIR}/*.py") @@ -97,14 +74,18 @@ MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS set(DOSEK_GENERATOR_ARGS ${DOSEK_GENERATOR_ARGS} --specialize-systemcalls) endif() + # Check system description file + file(GLOB XMLDESCS "${CMAKE_CURRENT_SOURCE_DIR}/*.xml") + file(GLOB OILDESCS "${CMAKE_CURRENT_SOURCE_DIR}/*.oil") + set(SYSDESCS ${XMLDESCS} ${OILDESCS}) + # Generating DOSEK System add_custom_command(OUTPUT "${DOSEK_GENERATED_SOURCE}" "${DOSEK_GENERATED_LINKER}" "${DOSEK_SOURCE_SYSTEM}" - DEPENDS ${PYTHON_SOURCE} "${SYSTEM_XML}" ${DOSEK_BINARY_LLVM_BYTECODE} - ${CMAKE_CURRENT_SOURCE_DIR}/*.xml + DEPENDS ${PYTHON_SOURCE} "${SYSTEM_DESC}" ${DOSEK_BINARY_LLVM_BYTECODE} ${SYSDESCS} ${VERIFY_SCRIPT} ${OS_TEMPLATES} ${LINKER_TEMPLATE} COMMAND ${CMAKE_COMMAND} -E remove -f ${DOSEK_OUTPUT_DIR}/gen_*.dot COMMAND ${DOSEK_GENERATOR} - --system-xml "${SYSTEM_XML}" + --system-desc "${SYSTEM_DESC}" --source-bytecode "${DOSEK_BINARY_LLVM_BYTECODE}" --merged-bytecode "${DOSEK_SOURCE_SYSTEM}" --prefix ${DOSEK_OUTPUT_DIR} @@ -147,17 +128,16 @@ ENDMACRO() MACRO(DOSEK_BINARY) set(options TEST_ISO FAIL) - set(oneValueArgs SYSTEM_XML NAME VERIFY) + set(oneValueArgs SYSTEM_DESC NAME VERIFY) set(multiValuedParameters SOURCES LIBS GENERATOR_ARGS) cmake_parse_arguments(DOSEK_BINARY "${options}" "${oneValueArgs}" "${multiValuedParameters}" ${ARGN} ) set(DOSEK_BINARY_SOURCES "${DOSEK_BINARY_UNPARSED_ARGUMENTS};${DOSEK_BINARY_SOURCES}") - SET(DOSEK_SYSTEM_XML "${CMAKE_CURRENT_SOURCE_DIR}/${DOSEK_BINARY_SYSTEM_XML}") + SET(DOSEK_SYSTEM_DESC "${CMAKE_CURRENT_SOURCE_DIR}/${DOSEK_BINARY_SYSTEM_DESC}") set(DOSEK_VERIFY_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${DOSEK_BINARY_VERIFY}") SET(NAME "${DOSEK_BINARY_NAME}") - DOSEK_BINARY_EXECUTABLE(${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_XML} ${DOSEK_VERIFY_SCRIPT} + DOSEK_BINARY_EXECUTABLE(${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_DESC} ${DOSEK_VERIFY_SCRIPT} "" "${DOSEK_BINARY_LIBS}" "${DOSEK_BINARY_GENERATOR_ARGS}") - add_custom_command(TARGET ${NAME} POST_BUILD COMMENT "Gathering binary statistics for ${NAME}" COMMAND ${DOSEK_GENERATOR_DIR}/stats_binary.py @@ -165,7 +145,7 @@ MACRO(DOSEK_BINARY) --elf ${PROJECT_BINARY_DIR}/${NAME}) if((${DOSEK_BINARY_FAIL} STREQUAL "TRUE") OR FAIL_TRACE_ALL) - DOSEK_BINARY_EXECUTABLE(fail-${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_XML} ${DOSEK_VERIFY_SCRIPT} + DOSEK_BINARY_EXECUTABLE(fail-${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_DESC} ${DOSEK_VERIFY_SCRIPT} "FAIL=1" "${DOSEK_BINARY_LIBS}" "${DOSEK_BINARY_GENERATOR_ARGS}") fail_test(${NAME} fail-${NAME})