Skip to content
Snippets Groups Projects
Commit cc76f15d authored by Hans-Peter Deifel's avatar Hans-Peter Deifel
Browse files

Don't trigger interrupts in ISRs

parent 9ca30c78
Branches
No related tags found
No related merge requests found
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment