我正在试验Ivory (http://ivorylang.org,https://github.com/GaloisInc/ivory),并使用ivory-hw模块在微控制器中操作一些寄存器。
cmain :: Def ('[] :-> ())
cmain = voidProc "main" $ body $ do
setReg regFoo $ do
clearBit foo_bitbar
setBit foo_bitbaz
forever $ return ()
main_module :: Module
main_module = package "main" $ do
incl cmain
main :: IO ()
main = runCompiler [ main_module ] [] (initialOpts {constFold = True,
outDir = Just "out"})建筑和运营:
$ exe
*** Procedure main
ERROR: [ No location available ]:
Unbound value: 'ivory_hw_io_write_u32'
exe: Sanity-check failed!将选项scErrors = False添加到runCompiler可以关闭正常检查,代码运行到完成生成源。
但是,main.c包含对ivory_hw_io_write_u32的调用,但该函数没有在任何地方定义(可能解释了错误)。通过查看github,我可以找到具有ivory_hw_prim.h文件的示例。
经过一些实验后,我可以通过为hw添加一个模块,然后将其作为依赖项添加到我的main_module中,从而将其包括在内。
hw_module :: Module
hw_module = package "ivory_hw_prim" hw_moduledef
main_module :: Module
main_module = package "main" $ do
depend hw_module
incl cmain并使用添加的runCompiler来调用hw_artifacts以生成标题:
main = runCompiler [ main_module ] hw_artifacts (initialOpts {scErrors = False,
constFold = True,
outDir = Just "out"})这将ivory_hw_prim.h添加到生成的文件集合中,并在main.h中包含必要的包含。
但是,这只能通过将scErrors = False选项保留到runCompiler来实现,这意味着我仍然没有正确地执行此操作。
因此,我的问题是:使用象牙的HW包的正确方法是什么?
发布于 2015-11-04 03:43:41
解决方案是在包中包括hw_moduledef:
main_module :: Module
main_module = package "main" $
incl cmain >> hw_moduledef( depend函数只包含标头。)在包中包括hw_moduledef,"main"使其定义对正常检查器可见。
顺便说一句,象牙模块系统将来可能会得到改进,这样象牙在编译时就可以计算依赖项,这样程序员就不用显式地包含了。
https://stackoverflow.com/questions/33459506
复制相似问题