裸机C代码(微处理器固件)的自动测试:模拟硬件寄存器的变化

CL2*_*L22 9 c multithreading automated-tests cross-compiling

我想在PC上编写一些非常低级别的C代码的自动化测试,我将移植到微处理器.我知道会有差异(特定于实现的行为,例如int的大小),我将不得不忍受.

我需要有关如何模拟易失变量变化的想法(映射到微控制器中的特殊功能寄存器).例如,在下面的代码中,寄存器标志的值TX_BUFF_FULL可以在代码执行过程中重复更改,此时发送缓冲区中的空间可用或已用完:

void send_str(char * str){
    // for each non-null character
    for (char i = 0; str[i]; i++){
        // wait for space in TX hardware buffer
        while(TX_BUFF_FULL);
        // put character into hardware FIFO
        TX_REGISTER = str[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

TX_BUFF_FULL并且TX_REGISTER是易失性变量,映射到UART的特殊功能寄存器的地址.

理想情况下,我将编写源代码,以便可以在不更改PC上的自动测试和在微控制器上运行的情况下编译它,这可能需要预处理器指令.

例如,在为微控制器编译时使用此行的指令:

while(TX_BUFF_FULL);
Run Code Online (Sandbox Code Playgroud)

但在编译用于在PC上进行测试时使用它:

while(test_tx_buff_full());
Run Code Online (Sandbox Code Playgroud)

其中test_tx_buff_full()函数将是测试套件的一部分,模拟寄存器状态的变化.我无法想到实现结果的不同方式.

这是一种合理的方式吗?实现预处理器指令以实现此目的的一种巧妙方法是什么?有更简洁的方式吗?谢谢

编辑:从这个问题,这个问题这个问题,其他一些想法是:

  • 使用预生成器宏生成内联代码来替换寄存器的读取
  • 使用可编程的硬件测试平台,可以启动并执行单元和集成测试,绕过了对模拟器的需求

lai*_*dir 1

在我看来,这可以使用用于实现断点调试的 API 来完成。在 Linux 上,这可能是ptrace(特别是,该PTRACE_POKEDATA操作可用于传递新的易失性值,并PTRACE_SINGLESTEP允许精确计时其传递)。我确信 Windows 和 BSD 上存在类似的东西,但我对这些平台不太熟悉。