From dbbd3cac94002ef88503e6254a57ce01f6595130 Mon Sep 17 00:00:00 2001
From: pln <Per Lindgren>
Date: Mon, 6 Mar 2017 13:29:26 +0000
Subject: [PATCH] Lab assignment

---
 src/main.c | 310 ++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 269 insertions(+), 41 deletions(-)

diff --git a/src/main.c b/src/main.c
index 3621eae..c3f6cff 100644
--- a/src/main.c
+++ b/src/main.c
@@ -42,9 +42,8 @@
 #define r1_Ceiling 2
 #define r2_Ceiling 3
 
-// Analysis variables
-static volatile int state;
-static int job;
+// some state that the execution depends on
+static int state;
 
 void work(int i)
 {
@@ -59,23 +58,16 @@ TASK(j1)
 {
     TRACE("j1_enter\n");
     LOCK(r2);
-    JOB_REQUEST(j2); 			// job execution request for j2
-
-    if (state > 0)
-    {
-        work(10);
-    }
-    else
-    {
-        work(5);
-    }
-
-    LOCK(r1);
-    TRACE("j1_r1_locked, before job request j2\n");
-
-    JOB_REQUEST(j2);
-    TRACE("j1_r1_locked, after job request j2\n");
-    UNLOCK(r1);
+    	if (state > 0) {
+    		work(10);
+    	} else {
+    		work(5);
+    	}
+    	LOCK(r1);
+    		TRACE("j1_r1_locked\n");
+    		work(1);
+    		TRACE("j1_r1_locked\n");
+    	UNLOCK(r1);
     UNLOCK(r2);
 }
 
@@ -83,18 +75,15 @@ TASK(j2)
 {
     TRACE("j2_enter\n");
     LOCK(r1);
-    TRACE("j2_r1_locked\n");
-    work(5);
+    	TRACE("j2_r1_locked\n");
+    	work(5);
     UNLOCK(r1);
-    if (state == 100)
-        {
-            work(2);
-        }
-        else
-        {
-            work(1);
-        }
 
+    if (state == 100) {
+        work(2);
+    } else {
+        work(1);
+    }
     TRACE("j2_exit\n");
 }
 
@@ -102,16 +91,22 @@ TASK(j3)
 {
     TRACE("j3_enter\n");
     LOCK(r2);
-    TRACE("j3_r2_locked\n");
-
-    work(1);
+    	TRACE("j3_r2_locked\n");
+    	work(1);
     UNLOCK(r2);
-    JOB_REQUEST(j1);
     TRACE("j3_exit\n");
+
+//    int b = 2 * state;
+//    if (b < 10)
+//    	work(10);
+//
+//    for (int i = 0; i < state; i++)
+//    	work(1);
 }
 
 #ifdef KLEE
 /* The case when KLEE makes the path analysis */
+static int job;
 
 int main()
 {
@@ -119,23 +114,23 @@ int main()
 
     klee_assume(job > 0 && job < 4);
 
+    klee_make_symbolic(&state, sizeof(state), "state");
+
+    klee_assume((-10 < state) && (state < 10));
+
     switch (job)
     {
     default:
-        klee_make_symbolic(&state, sizeof(state), "state");
-    // check task 1
     case 1:
-        klee_make_symbolic(&state, sizeof(state), "state");
+    	// check task 1
         EXTI1_IRQHandler();
         break;
     case 2:
         // check task 2
-        klee_make_symbolic(&state, sizeof(state), "state");
         EXTI2_IRQHandler();
         break;
     case 3:
         // check task 3
-        klee_make_symbolic(&state, sizeof(state), "state");
         EXTI3_IRQHandler();
         break;
     }
@@ -146,7 +141,6 @@ int main()
 static int job;
 int main()
 {
-
     dwt_enable();
     DWT->CYCCNT = 0;
 
@@ -196,5 +190,239 @@ int main()
 #endif
 
 /*
- Assignments
+ Assignment A)
+
+ 1 connect the MCU,
+ 2 start openocd in a new terminal shell (linux terminal e.g.
+ openocd -f st_nucleo_f4_itm.cfg
+
+ 3 run the benchmark
+ > make bench
+
+ your output should look something like this
+
+ ....
+ Opened already created database
+Testcase: klee-last/test000001.ktest
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 3
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 0
+Job: j[('j3',)]
+Number of instructions taken for j3: 1134
+Number of instructions taken for r2: 1046
+
+
+Testcase: klee-last/test000002.ktest
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 2
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 0
+Job: j[('j2',)]
+Number of instructions taken for j2: 6166
+Number of instructions taken for r1: 5048
+
+
+Testcase: klee-last/test000003.ktest
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 2
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 100
+Job: j[('j2',)]
+Number of instructions taken for j2: 7166
+Number of instructions taken for r1: 5048
+
+
+Testcase: klee-last/test000004.ktest
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 1
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 0
+Job: j[('j1',)]
+Number of instructions taken for j1: 5186
+Number of instructions taken for r2: 5104
+Number of instructions taken for r1: 25
+
+
+Testcase: klee-last/test000005.ktest
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 1
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 2147483647
+Job: j[('j1',)]
+Number of instructions taken for j1: 10186
+Number of instructions taken for r2: 10104
+Number of instructions taken for r1: 25
+
+Show to the teacher, and explain the measurements,
+you should be able to relate to the code and the (nested)
+ "named" critical sections:
+
+LOCK( Rx )
+   ...
+UNLOCK( Rx )
+
+---------------------------------------------------------
+Assignment B)
+
+Perform response time analysis by hand based on the measurements
+Here are the formulas (simplified)
+
+Interference
+ti= sum{⌈d(t)/ia(t’)⌉*e(t’) | t’∈ p(t’)>=p(t)}
+
+Blocking
+tb = max {cs(t’,t) | t’∈p(t’)<=p(t)}
+where cs(t',t) is the max time t' holds a resource r where
+⌈r⌉ >= p(t), i.e., has a ceiling larger or equal to the task we are
+interested in.
+
+Response time
+tr = te + tb + ti
+
+Fill out the table below
+Job	Inter arr. 	Deadl. 	WCET	Block	Interf.		Response Time
+j3	20000		20000					0
+j2	30000		30000
+j1	40000		40000			0							.
+
+Why do we have 0 interference on j3 and 0 blocking for j1
+
+Show and explain to the teacher(s)
+
+---------------------------------------------------------
+Assignment C)
+
+Now restrict state by giving partial information (range in this case)
+
+klee_assume((-10 < state) && (state < 10));
+
+Rerun make bench
+
+What significantly did change, relate to the code?
+
+Fill in the table below, based on your new measurements.
+
+Job	Inter arr. 	Deadl. 	WCET	Block	Interf.		Response Time
+j3	20000		20000					0
+j2	30000		30000
+j1	40000		40000			0							.
+
+
+Show and explain to the teacher(s)
+
+---------------------------------------------------------
+Assignment D)
+
+Now enable the code in j3
+
+	int b = 2 * state;
+    if (b > 10)
+    	work(1);
+
+Identify the test cases generated for exploring both paths.
+
+> make clean && make && make klee
+> ktest-tool --write-int klee-last/*.ktest
+
+
+You should get something like
+
+
+ktest file : 'klee-last/test000001.ktest'
+args       : ['klee.bc']
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 3
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 0
+
+ktest file : 'klee-last/test000002.ktest'
+args       : ['klee.bc']
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 3
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 6
+
+ktest file : 'klee-last/test000003.ktest'
+args       : ['klee.bc']
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 2
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 0
+
+ktest file : 'klee-last/test000004.ktest'
+args       : ['klee.bc']
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 1
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 0
+
+ktest file : 'klee-last/test000005.ktest'
+args       : ['klee.bc']
+num objects: 2
+object    0: name: b'job'
+object    0: size: 4
+object    0: data: 1
+object    1: name: b'state'
+object    1: size: 4
+object    1: data: 1
+
+Show and explain to the teacher(s)
+
+--------------------------------------------
+Assignment D)
+Figure out how to isolate the analysis to j3.
+
+Show and explain to the teacher(s)
+
+--------------------------------------------
+Assignment E)
+
+Enable the code in k3.
+
+	int b = 2 * state;
+    if (b < 10)
+    	work(10);
+
+    for (int i = 0; i < state; i++)
+    	work(1);
+
+Now re-run the make bench.
+
+Identify the WCET for j3.
+
+What is the reason a specific state gives the WCET.
+
+Show and explain to the teacher(s)
+
+
+Play around, have fun with the tool!!!!!
+
  */
-- 
GitLab