如何在嵌入DML方法的C函数中获取设备指针并实现日志记录?
在DML嵌入式C函数中获取设备指针实现日志记录
核心结论
你没办法在外部C函数fib()中自动获取调用它的设备指针,必须显式将设备指针作为参数传入才能在函数内使用日志接口。
修改步骤及示例代码
以下是调整后的完整代码,解决日志需要设备指针的问题:
dml 1.2; device simple_embedded; parameter documentation = "Embedding C code example for" + " Model Builder User's Guide"; parameter desc = "example of C code"; // 修改extern声明,添加设备指针参数 extern int fib(dev, int x); bank regs { register r0 size 4 @0x0000 { parameter allocate = false; parameter configuration = "none"; method write(val) { // 调用fib时传入当前设备(this指向当前设备实例) log "info": "Fibonacci(%d) = %d.", val, fib(this, val); } method read() -> (value) { // Must be implemented to compile } } } header %{ // 修改C函数声明,指定设备指针类型(simple_embedded_t由DML自动生成) int fib(simple_embedded_t *dev, int x); %} footer %{ int fib(simple_embedded_t *dev, int x) { // 使用传入的dev指针调用日志接口 SIM_LOG_INFO(1, dev, 0, "Generating Fibonacci for %d", x); if (x < 2) return 1; else return fib(dev, x-1) + fib(dev, x-2); } %}
关键说明
- DML中,
this关键字在设备的方法(比如寄存器的write方法)里代表当前设备实例,调用外部C函数时直接传入即可。 - DML会为你定义的
simple_embedded设备自动生成对应的C类型simple_embedded_t,所以在C代码里要使用这个类型作为设备指针的类型。 - 递归调用
fib()时,也要把设备指针传递下去,保证每一层递归都能正常打日志。
内容的提问来源于stack exchange,提问作者kbrunham-intel
相关产品推荐
相关产品推荐

