我在普通C中获得了一些源代码,它是在Windows上使用交叉编译器在ARM上运行的。
现在我想对代码做一些白盒单元测试。我不想在手臂板上进行测试,因为它可能效率不高。
由于C源代码是独立于指令集的,而且我只想在C级别验证软件逻辑,所以我想知道是否可以构建在x86上运行的C源代码。它使调试和检查更加容易。
或者,是否有适当的方法来对为ARM编写的C代码进行白盒测试?
谢谢!
顺便说一下,我读过这篇文章:为ARM编写的本地android代码是如何在x86上运行的?
这似乎不是我需要的。
加1-10:42下午7/18/2021
代码目标的物理ARM硬件可能还没有准备好。因此,我想在非常早期阶段验证软件逻辑。基于的回答,我正在考虑另一个选择:只需像往常一样为ARM构建二进制文件。然后使用QEMU查找兼容的ARM cpu来运行代码。代码保证不会触及任何特殊的硬件IO。因此,一个兼容的cpu应该足够运行所有的代码,我认为。如果这是可能的话,我想我需要找到一种方法,让QEMU加载我的二进制文件在一块模拟裸金属。为了获得一些输出,我至少需要编写一个串口驱动程序来连接我的二进制文件到串行端口。
加2- 8:55上午7/19/2021
再加上一些背景,C代码的目标是ARMv8 ISA。代码处理了一些尚未准备好的硬件IP。我计划为这些IP创建一个软件HAL,并在HAL上验证C代码。如果HAL足够好,一切都可以是纯粹的软件,我想唯一缺少的部分是一个ARMv8兼容的CPU,我相信QEMU可以提供。
加3-11:30下午7/19/2021
刚找到这个链接。似乎可以利用QEMU用户模式仿真在x86 Linux上直接运行ARM二进制文件。我会试着过一会儿再回来。
加入4-11:42 2021年7月7日上午7:42
一些有用的链接:
发布于 2021-07-18 14:29:19
现在我想对代码做一些白盒单元测试。我不想在手臂板上进行测试,因为它可能效率不高。
如果你不能确定你的测试结果代表了真正的目标平台,那么效率和它有什么关系呢?
因为C源代码是独立于指令集的,
C程序在可移植性方面差异很大。这与CPU指令集的关系往往小于与目标机器和实现细节(如数据类型大小、字endianness、内存大小和浮点实现以及实现定义和未定义的程序行为)之间的关系。
如果仅仅因为程序是用C编写的,就可以成功地为不同的目标机器构建它,或者如果它是为不同的目标构建的,那么它的行为也是相同的,这一点一点也不安全。
我想知道是否有可能构建在x86上运行的C源代码。它使调试和检查更加容易。
建立程序可能是可能的。对于各种x86和x86_64平台,有几个很好的C编译器,如果您的C代码符合语言规范之一,那么这些编译器应该接受它。然而,结果的行为是否代表ARM上的行为则是一个不同的问题(见上文)。
不过,将程序移植到另一个平台(如x86或x86_64 Windows )可能是值得的。这样的练习可能会揭露一些错误。但这本身就是一个项目,如果不打算在新平台上运行该程序,除了测试目的之外,我怀疑这是否值得。
或者,是否有适当的方法来对为ARM编写的C代码进行白盒测试?
我不知道对你来说什么是正确的,但是在你最终想要支持的目标硬件上的测试是无法替代的。但是,您可能会发现在模拟硬件上执行初始测试而不是在物理ARM设备上执行测试很有用。
发布于 2021-07-19 16:03:05
如果您正在为windows桌面应用程序编写ARM代码,那么大多数情况下没有区别,代码只是编译和运行。我猜你是在为完成某些特定任务的设备而开发。
我这么做是为了我的嵌入式ARM代码。通常,当构建在x86上时,核心算法工作得很好,但是整个应用程序却没有。这些问题来自于CPU以外的硬件。例如,我可能在ARM项目上使用LCD显示器、一些传感器和免费RTOS,但是在Windows上运行的代码没有这些。我所做的就是提取重要的C/C++代码,并围绕它编写一个测试框架。在真正的ARM代码中,设备是从传感器读取值并对其进行操作。在桌面上运行的测试代码中,代码从带有假传感器值的数据文件中读取,并将其输出写入可以分析的数据文件。这样,我就可以对最复杂的代码进行白盒测试。
我可以问一下,这段代码大概是做什么的?一个没有外设的ARM处理器将是无用的。通常,我们使用处理器与屏幕、按钮或蓝牙等其他硬件进行交互。这些交互作用将是最有问题的。
https://stackoverflow.com/questions/68429698
复制相似问题