diff --git a/src/CFG/C.hs b/src/CFG/C.hs
index 5e476664200f244567ea72e6e2d905a4d869d097..bc87ec4d24c125dc76931afa0dff4bf716dbe1bd 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