Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌入式裸金属的单元测试ISR_C++_C_Unit Testing_Embedded_Bare Metal - Fatal编程技术网

C++ 嵌入式裸金属的单元测试ISR

C++ 嵌入式裸金属的单元测试ISR,c++,c,unit-testing,embedded,bare-metal,C++,C,Unit Testing,Embedded,Bare Metal,虽然taht可以在目标硬件上运行不同的单元测试系统,但我有一个非常不同的问题 我想单元测试ISR和主(也是唯一)线程之间的数据同步,可能是在PC端 概念非常简单:由于ISR不能被中断,我构建了一个小型的main,而不是在一个循环中使用/生成ISR所需的数据,对于每个循环,main将在下一行中断(或者更好,对于每个原子指令),并验证结果的结果/一致性 暴力强制所有可能的组合应该花费很少的时间,并提供一个体面的测试覆盖率,而不需要在硬件上运行,并错过一些“几乎永远不会,但当它发生时,它会繁荣”的情况

虽然taht可以在目标硬件上运行不同的单元测试系统,但我有一个非常不同的问题

我想单元测试ISR和主(也是唯一)线程之间的数据同步,可能是在PC端

概念非常简单:由于ISR不能被中断,我构建了一个小型的main,而不是在一个循环中使用/生成ISR所需的数据,对于每个循环,main将在下一行中断(或者更好,对于每个原子指令),并验证结果的结果/一致性

暴力强制所有可能的组合应该花费很少的时间,并提供一个体面的测试覆盖率,而不需要在硬件上运行,并错过一些“几乎永远不会,但当它发生时,它会繁荣”的情况

到目前为止,我有几个想法:

  • 在构建二进制文件中,为“main”的每一行添加一个跳转到蹦床函数,该函数将决定是否是运行ISR的时间
  • 以某种方式与qemu之类的仿真器接口(这也应该确保如果ASM指令不是本质上的原子指令,则可以拆分)

  • 外面有什么东西吗?如果没有,他的方法是否存在本质问题?

    您是否在测试ISR的周期或其功能?在大多数系统上,ISR是可以由任何其他函数调用的常规函数。如果没有,您可以更改ISR,使其调用处理函数。从
    main
    或您的单元测试函数测试处理函数。@ThomasMatthews否,在绝大多数系统上,ISR是ISR,软件很难调用它!正常的调用约定是CPU硬件堆栈在调用ISR时注册。若你们从软件中调用它,这一部分就丢失了,你们必须自己用内联汇编程序手工完成。否则,由于普通ISA从中断返回的指令与从函数返回的指令不同,因此当ISR试图从堆栈中恢复硬件未放置的内容时,从ISR返回的指令将出现堆栈损坏。@ThomasMatthews您是在描述我的想法吗#1?因为“从main或您的单元测试函数测试处理函数”对我来说毫无意义,所以发生在那里的“魔力”是问题的重点。如果您想问如何通过构建代码覆盖工具来重新发明轮子,那么这个问题对本网站来说太广泛了。如果您要求工具建议,那么这显然是离题的。如果中断不能从其他函数调用,那么中断应该调用可以从其他函数调用的另一个函数。这可以实现更好的单元测试(或代码覆盖率)。