我正在试用这个单片机/ SoC仿真器,雷诺德。
我在平台/cpu/stm32l072.repl下加载了他们现有的模型模板,其中只包含了用于stm32l071的repl文件并添加了一个小东西。
然后,当我加载并运行一个用STM32CubeIDE和ST的LL库构建的程序二进制文件时,代码命中SystemClock_Config()的初始函数,在循环中探测Flash:ACR寄存器,以观察预期的值变化,当Renode窗口输出时,它会被卡在那里:
警告sysbus:从未实现的寄存器读取Flash:ACR (0x40022000),从SVD: 0x0返回一个值
这似乎是意料之中的,并不是所有现有的模板模型几乎都是现成的。我还发现,stm32L071模式缺少一些美国广播电台和新维也纳国际中心频道。我看到了如何添加后者,但在定义Flash:ACR寄存器的默认模型中,似乎没有一个模型可以用作示例。
如何为这个特定的MCU模型添加这样一个缺失寄存器呢?
Note1:在这个测试中,我使用的是一个STM32固件二进制文件,它可以在实际的硬件上正常工作,比如这个单片机的开发板。
Note2:与QEMU相比,Renode显然没有模仿外围设备,其明显的优点是允许将一个更复杂的系统连接在一起,这是基于模拟的外部设备,例如I2C和其他设备(显然是C#模块,还没有对其进行研究)。他们说“在实际系统中使用相同的二进制”。这也是我尝试这种方法的原因--听起来很有可能在硬件还没有完全可用的情况下实现系统,也有可能实现自动化测试。因此,显而易见的是,在init代码中注释掉许多部分,只测试一些独立于硬件的代码,同时避开这些问题,这将使这里的目的落空。
发布于 2022-10-29 01:15:28
如果您只想为闪存提供ACR寄存器以传递您的init,请使用标记。
您可以通过REPL (如此处推荐的https://github.com/renode/renode/blob/master/platforms/cpus/stm32l071.repl#L175)或RESC提供它。
假设您的软件希望读取值0xDEADBEEF。你要用的是:
sysbus:
init:
Tag <0x40022000, 0x40022003> "ACR" 0xDEADBEEF在resc或Monitor中,这将是公正的:
sysbus Tag <0x40022000, 0x40022003> "ACR" 0xDEADBEEF如果需要更复杂的逻辑,可以使用Python外设,如docs (https://renode.readthedocs.io/en/latest/basic/using-python.html#python-peripherals-in-a-platform-description)中所述:
flash: Python.PythonPeripheral @ sysbus 0x40022000
size: 0x1000
initable: false
filename: "script_with_complex_python_logic.py"如果您确实需要高级实现,那么您需要创建一个完整的C#模型。
正如您正确地提到的,我们不希望您修改二进制文件。但是,如果软件通过了这些模拟,我们可以对某些我们不感兴趣的特定用例部分进行模拟。
免责声明:我是Renode开发人员之一。
https://stackoverflow.com/questions/74205476
复制相似问题