1

我目前正在用 C 语言为微控制器(TI MSP430)编写状态机。现在,我在编写代码和实现我的设计方面没有任何问题,但我想知道如何在不使用实际硬件的情况下证明状态机逻辑(当然,目前还不可用)。

使用调试功能,我可以模拟中断(虽然我还没有尝试这样做,但我只是假设它会没问题 - 毕竟它已记录在案)并且我已经定义并保留了一个特定的内存区域来保存 TEST 数据,它使用调试宏,我可以在运行时在 Python 脚本中的应用程序之外访问。换句话说,我有一些测试基础。但是,我的问题的重点是:

“我如何最好地为需要硬件输入的决策强制使用某个状态机流程,例如,当输入引脚为高电平或低电平时”。例如,“如果某个引脚为高电平,则遵循此路径,否则遵循此路径”。

同样,使用调试宏,我可以写入应用程序外部的寄存器(例如,点亮 LED),但我不能(可以理解)写入用于输入的只读寄存器,因此强制状态机上述方式的流量证明是在征税。

我曾想过使用#ifdefs,如果我想测试流程,我可以使用输出引脚并检查这个值,而不是最终使用的输入引脚。但是,这无疑会在我的代码库中添加纯测试代码,这感觉是错误的做法。有没有人对达到这种测试水平的好方法有任何建议?我知道我可能只使用模拟器,但我想尽可能使用真正的硬件(尽管现阶段是评估板)。

4

3 回答 3

1

听起来你需要抽象。

取而代之的是,在“应用程序”代码(状态机)中,使用例如 GPIO 寄存器读取对输入读取进行硬编码,将这些读取封装到执行检查并返回值的函数中。在函数内部,您可以将#ifdef:ed 代码改为从您的 TEST 内存区域读取,从而模拟来自不存在的 GPIO 引脚的响应。

即使您的目标是高性能,这也应该是可能的,这不是很多开销,如果您努力工作,您应该能够使用inline这些功能。

于 2012-09-14T10:55:49.880 回答
0

即使您还没有所有硬件,您也可以模拟几乎所有内容。

在 C 中做这件事的一种可能方法......

中断处理程序 = 等待事件的线程。

输入设备 = 触发上述事件的线程。它们可以“连接”到 PC 键盘,因此您可以手动启动“中断”。或者他们可以拥有自己的状态机以自动方式执行任何必要的操作(您也可以编写这些脚本,它们不必硬连线到固定的行为!)。

输出设备 = 同样是线程。它们可以“连接”到 PC 显示器,因此您可以看到“LED”状态。您也可以将输出记录到文件中。

I/O 引脚/端口可以只是专用的全局变量。如果您需要在读取/写入 I/O 设备线程时唤醒它们,您也可以这样做。要么将对它们的访问包装到适当的同步和通信代码中,要么甚至映射底层内存,使对这些端口变量的任何访问都会触发信号/页面错误,其处理程序将为您完成所有必要的同步和通信。

主要部分在,嗯,main()。:)

这将创造一个非常接近真实的环境。您甚至可以获得比赛条件!

如果您想对它进行更多的硬编码并且如果您有时间,您也可以模拟整个 MSP430。指令集非常紧凑和简单。今天存在一些模拟器,因此您可以利用一些参考代码。

如果你想很好地测试你的代码,你需要让它足够灵活。这可能包括在函数中添加#ifdefs、宏、显式参数而不是访问全局变量、指向数据和函数的指针(您可以在测试时覆盖它们)、各种测试钩子。

您还应该考虑将代码拆分为特定于硬件的部分、非常特定于硬件的部分和普通的业务逻辑部分,您可以将它们编译到单独的库中。如果这样做,您将能够用模拟硬件的测试库替换真实的硬件库。

无论如何,您应该抽象出硬件设备并使用测试状态机来测试生产代码及其状态机。

于 2012-09-14T11:24:41.130 回答
0

建立一个测试台。首先,我建议例如当您读取输入寄存器或其他内容时,使用某种函数调用(相对于其他地址事物的一些易失性)。基本上所有东西都至少有一层抽象。现在,您的主应用程序可以很容易地被提升并放置在每个抽象的测试函数的任何地方。您可以在没有任何真实硬件的情况下完全测试该代码。同样,一旦在真正的硬件上,您就可以使用抽象(包装函数,无论您想如何称呼它)作为更改或伪造输入的一种方式。

switch(state)
{
   case X:
      r=read_gpio_port();
      if(r&0x10) next_state = Y;
      break;
}

在测试台上(甚至在硬件上):

unsigned int test_count;
unsigned read_gpio_port ( void )
{
   test_count++;
   return(test_count);
}

最终在 asm 或 C 中实现 read_gpio_port 以访问 gpio 端口,并将其与主应用程序而不是测试代码链接。

是的,除非您内联,否则您会遭受函数调用,但作为回报,您的调试和测试能力要强得多。

于 2012-09-14T21:12:13.117 回答