10

我有一个运行我编写的 RTOS/内核的双核 ARM 嵌入式系统设备。我希望编写一个内部诊断工具/模块来模拟内核的 I/O 以进行测试。显然,这不会完全取代现实世界的测试,包括物理硬件接口等等。我猜这将接近管理程序。这样做的方法/概念是什么?

4

5 回答 5

4

我使用了L4 的微内核,硬件权限映射为 MMU 页面;ARM 选项有 1k、4k、64k 页和 1M 段。此外,您可以查看Linux 的 FB deferred I/O。这个想法是提供一个内存映射 的伪寄存器集。然后,您可以使用带有错误地址的页面错误处理程序来确定正在命中哪个伪寄存器。您可能需要查看说明。例如,代码可以使用回写和其他更新。Linux对齐处理程序代码可能很有指导意义。

请参阅:ARM ARM -第 B3 章内存管理单元。
        ARM ARM - 2.6.5 数据中止(数据访问存储器中止)。

您还需要模拟中断。使用计时器(使用您喜欢的任何分布)可以调用驱动程序/操作系统 ISR。为了最大限度地减少定时器的使用,可以使用计时轮来创建不同的中断到达概率分布函数。如果可能,您可能还希望将此计时器设置为FIQ。这可以让您的测试设备的 ISR 接收数据更新,即使常规IRQs 被屏蔽。FIQ您还可以在恒定定时器中断上使用处理程序来模拟 DMA 。当然,这假设您的测试驱动程序不使用 aFIQ并且您有一个FIQ可用的计时器。

许多操作系统驱动程序都有寄存器缓存,特别是如果设备是只写芯片。查看此代码也可能会有所帮助。

使用L4,特定单元格被授予实际物理设备范围的权限。这是在虚拟空间中重新定位的。虚拟机管理程序的另一个问题是您正在运行多个操作系统,并且您必须将权限切换到不同的硬件外围设备上。我不相信你必须这样做。

注意事项: 多 CPU 锁定可能存在data fault处理问题;您的驱动程序不应通过多 CPU 访问硬件。处理程序可以在中断锁定的情况下在单个 CPU 上运行,此解决方案将起作用。我相信如果发生异常,strex将返回一个条件代码集。可能您可以在故障处理程序中处理此问题。

标签的方式,我提出了上述解决方案。


正如Pekka所指出的,如果您选择使用 C++,这可能有助于test 的设计。一个有用的模式是驱动程序中访问硬件的纯虚拟接口。当你在测试时,你将这个虚拟接口替换为一个模拟类;使用函数指针包也可以在“C”中执行此操作。这些类型的活动有据可查,所以我排除了它们。但是,如果这是您正在寻找的解决方案,您可能会考虑澄清问题并重新标记。

于 2013-03-28T14:49:22.670 回答
3

您可以应用以下方法以提高保真度(和努力):

  • 如果您对计划中的硬件有软件 API,那么响应模拟结果的存根将提供一阶解决方案。
  • 如果硬件是内存映射的,请创建一个模拟进程/线程来更新内存,就好像它是外部硬件一样。
  • 然后,如果需要更高的保真度,可以引入使用内存映射设备的页面错误的无艺术噪声方法,以使模拟器对实际 API 透明,并引入同步事件更新。
  • 最后,构建硬件(可能带有更多软件)为应用程序提供相同的接口以从系统外部进行硬件在环仿真可能会花费更少的精力。这将为您提供确切的硬件接口,但只是将复杂性转移到测试脚手架上。
于 2013-03-29T09:19:30.463 回答
2

如果您的 RTOS 在内核和硬件之间有一个硬件抽象层 (HAL)。这可能是模拟 I/O 的好点。

如果您没有任何类型的 HAL 层,那么这可能是实现它的一个原因。HAL 还有很多其他好的理由(请参见此处)。谷歌用“硬件抽象”来获取更多信息。

还有一些 ARM 模拟器(ARMware 和类似的)用于模拟 ARM 设备。

于 2013-03-31T21:34:15.053 回答
0

您希望进行的测试类似于向内核发送虚拟 IO 请求。我认为这个概念类似于基于软件的半虚拟化。

基于软件的 Hypervisor 是您的测试程序;将虚拟 IO 发送到您的内核,并且您的内核包含一个虚拟 IO 驱动程序来接受这些 IO 请求。

处理后,虚拟 IO 驱动程序还必须能够对您的管理程序进行超级调用以提醒虚拟 IO 信号的状态。

于 2013-04-02T03:40:04.860 回答
-3

没有关于您的 RTOS/内核的信息....但我想您的 RTOS/内核应该有类似ioctl. 你为什么不使用它?

于 2013-03-26T06:24:00.363 回答