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