From 0fc98aec94208d539f33996f737066c8d981ac7d Mon Sep 17 00:00:00 2001 From: Hans-Peter Deifel <hpd@hpdeifel.de> Date: Tue, 18 Oct 2016 08:50:14 +0200 Subject: [PATCH] Generate C for ISRs --- src/CFG/C.hs | 8 +++++--- test/CFG/CSpec.hs | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/CFG/C.hs b/src/CFG/C.hs index bf38d0f..3e4b981 100644 --- a/src/CFG/C.hs +++ b/src/CFG/C.hs @@ -35,19 +35,21 @@ compileToC fun = let instrs = instrsToC $ extract fun header KindSubtask = "TASK(" <> funName fun <> ")" header KindFunction = "void " <> funName fun <> "()" + header KindISR = "ISR2(" <> funName fun <> ")" in header (funKind fun) <> " {\n" <> indent instrs <> "}\n" -- | Declare multiple functions generateDecls :: [Function a] -> Text -generateDecls = T.unlines . map generateDecl +generateDecls = mconcat . map generateDecl -- | Declare a function generateDecl :: Function a -> Text generateDecl fun = case funKind fun of - KindSubtask -> "DeclareTask(" <> funName fun <> ");" - KindFunction -> "void " <> funName fun <> "();" + KindSubtask -> "DeclareTask(" <> funName fun <> ");\n" + KindFunction -> "void " <> funName fun <> "();\n" + KindISR -> "" -- | Declare all used but undefined symbols as extern declareExtern :: [Function [Instr]] -> Text diff --git a/test/CFG/CSpec.hs b/test/CFG/CSpec.hs index e64ebf8..faa57bd 100644 --- a/test/CFG/CSpec.hs +++ b/test/CFG/CSpec.hs @@ -78,6 +78,12 @@ example1TaskC = example1TaskCDecl :: Text example1TaskCDecl = "DeclareTask(foo);\n" +example1ISRC :: Text +example1ISRC = + "ISR2(foo) {\n" + <> T.unlines (map (" " <>) example1OutputLines) + <> "}\n" + example2Function :: Function [Instr] example2Function = example1Function { funName = "bar" } @@ -99,6 +105,12 @@ example2TaskC = example2TaskCDecl :: Text example2TaskCDecl = "DeclareTask(bar);\n" +example2ISRC :: Text +example2ISRC = + "ISR2(bar) {\n" + <> T.unlines (map (" " <>) example1OutputLines) + <> "}\n" + exampleExternDecls :: Text exampleExternDecls = "extern \"C\" {\nextern void syscall();\n}" @@ -115,6 +127,9 @@ compileToCTest = describe "compileToC" $ do it "works with a task" $ compileToC example1Function { funKind = KindSubtask } `shouldBe` example1TaskC + it "works with an isr" $ + compileToC example1Function { funKind = KindISR } `shouldBe` example1ISRC + include :: Text include = "#include <mockup_prelude.cc>" @@ -148,6 +163,16 @@ compileToCAllTest = describe "compileToCAll" $ do <> example2FunctionC <> "\n" ) + it "compiles one tasks and one ISR" $ + compileToCAll [example1Function { funKind = KindSubtask }, + example2Function { funKind = KindISR } + ] + `shouldBe` ( include <> "\n\n" <> exampleExternDecls <> "\n" + <> example1TaskCDecl <> "\n" + <> example1TaskC <> "\n" + <> example2ISRC <> "\n" + ) + declFunction1 :: Function [Instr] declFunction1 = Function -- GitLab