From cc76f15d3ee29c89c0200cc77c28b07e78a51bf6 Mon Sep 17 00:00:00 2001
From: Hans-Peter Deifel <hpd@hpdeifel.de>
Date: Wed, 30 Nov 2016 09:02:48 +0100
Subject: [PATCH] Don't trigger interrupts in ISRs

---
 src/CFG/C.hs | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/CFG/C.hs b/src/CFG/C.hs
index 5e47666..bc87ec4 100644
--- a/src/CFG/C.hs
+++ b/src/CFG/C.hs
@@ -44,7 +44,7 @@ include = "#include <mockup_prelude.cc>\n\n"
 
 compileToC :: Maybe IntSet -> Function [Instr] -> DecisionM Text
 compileToC interrupts fun = do
-  instrs <- instrsToC interrupts $ extract fun
+  instrs <- instrsToC interrupts (funKind fun) $ extract fun
   let header KindSubtask = "TASK(" <> funName fun <> ")"
       header KindFunction = "void " <> funName fun <> "()"
       header KindISR = "ISR2(" <> funName fun <> ")"
@@ -111,27 +111,30 @@ triggerInterrupts (Just ints) = do
             <> "    Machine::trigger_interrupt_from_user(" <> T.pack (show int) <> ");\n"
             <> "  }\n"
 
-instrsToC :: Maybe IntSet -> [Instr] -> DecisionM Text
-instrsToC interrupts = fmap ((<> "\n") . mconcat . intersperse "\n") . mapM (instrToC interrupts)
+instrsToC :: Maybe IntSet -> FunctionKind -> [Instr] -> DecisionM Text
+instrsToC interrupts kind = fmap ((<> "\n") . mconcat . intersperse "\n") . mapM (instrToC interrupts kind)
 
-instrToC :: Maybe IntSet -> Instr -> DecisionM Text
-instrToC _ (Goto ident) = return $ "goto " <> ident <> ";"
-instrToC _ (Label ident) = return $ ident <> ":"
-instrToC _ (IfThanElse left right) = do
+instrToC :: Maybe IntSet -> FunctionKind -> Instr -> DecisionM Text
+instrToC _ _ (Goto ident) = return $ "goto " <> ident <> ";"
+instrToC _ _ (Label ident) = return $ ident <> ":"
+instrToC _ _ (IfThanElse left right) = do
   decision <- decisionNumber
   return $
     "if (_decisionMaker(" <> T.pack (show decision) <> "))\n" <>
     "  goto " <> left <> ";\n" <>
     "else\n" <>
     "  goto " <> right <> ";"
-instrToC _ (Call ident False) = return $ ident <> "();"
-instrToC interrupts (Call ident True)  = do
-  ints <- triggerInterrupts interrupts
+instrToC _ _ (Call ident False) = return $ ident <> "();"
+instrToC interrupts kind (Call ident True)  = do
+  ints <-
+    if kind /= KindISR
+      then triggerInterrupts interrupts
+      else return mempty
   return $
     ints
     <> "_print_os_state(\"" <> ident <> "\", __LINE__);\n"
     <> ident <> "();"
-instrToC _ Return = return "return;"
+instrToC _ _ Return = return "return;"
 
 indent :: Text -> Text
 indent = T.unlines . map ("  " <>) . T.lines
-- 
GitLab