繁体   English   中英

使用 C 语言中的任意类型的函数指针和任意类型的变量参数对远程嵌入式 mcu 上的任意函数进行单元测试

[英]unit test of arbitrary function on a remote embedded mcu using function pointers and variable arguments of arbitrary type, in C

这个想法是编写一个通用单元测试函数,该函数将使用外部生成的测试输入参数(例如来自通信)在嵌入式目标 mcu 端执行任意被测函数。 这样远程mcu的单元测试函数只写一次,测试用例通过某种通信方式发送已知函数地址和输入参数在主机PC上生成。

例如,如果在远程 mcu 上有一个 int sumoftwoints(int, int) 的函数要测试,主机 pc 会将 sumoftwoints 的地址(链接器知道)和主机上生成的两个随机 int 传递给这个 unitTestFcn 指针pc 然后通过 uart 发送到嵌入式目标。 嵌入式目标通过接收到的函数指针“调用”提供的参数数量,并返回结果以发送回主机 pc 以进行结果检查。

关于这是否合理或该测试方案存在根本缺陷的任何反馈?

好处是将单元测试从嵌入式端移到主机端,具有无限的测试用例可扩展性。

如果我要制作这样的系统,我会让它由 3 个部分组成:

  • 以函数地址和参数的形式指定测试的 PC 端软件。
  • 在 PC 和 MCU 之间实现某种通信的接收器/发射器对,例如通过串行、Wifi 或任何可用的通信。
  • 在 MCU 上运行的测试执行器,它执行函数并返回结果(如果有)。

PC 端软件可以读取您的构建过程产生的一些工件以简化事情,例如,您可以使用实际的函数名称,而不必在测试中指定实际地址。

通信协议应该是基于文本的,依靠接收器来转换适合接收平台的值。

执行器必须实现特定于 MCU 架构的 ABI。 这是你将达到你的第一个主要障碍的地方。 首先,ABI 变化很大。 从一些参数在一个或多个寄存器中传递的 Arm,一些作为指向实际参数的指针,一些在堆栈上,到 x86,它都是基于堆栈的。

您的下一个主要障碍将是结构。 如果您要允许调用带有结构参数或返回值的函数,您必须知道您的编译器如何选择为每个特定结构打包字段。

总而言之,创建这样的东西将是一项艰巨的任务,并且可能最终没有那么有用,除非您投入大量工作,例如将其变成商业产品。

另一种选择是在设备上留一些暂存空间,然后在PC上交叉编译你的测试,然后将它们一个一个或一组发送到MCU,安装在暂存空间中并执行。

在任何情况下,由于明显的安全问题,此类功能绝不应包含在运输产品中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM