我正在开展一个需要多个设备的项目,每个设备都有一个嵌入式(ARM)处理器进行通信。我在过去发现的一个开发方法,只需要一个嵌入式处理器的项目就是使用Visual Studio开发代码,分为三个部分:
为嵌入式编译器/链接器提供第1部分和第3部分中的代码,可生成可在目标系统上运行的hex文件。运行第1部分和第2部分可生成可在PC上运行的代码,具有更好的调试工具和更精确的I / O行为控制(例如,我可以使模拟代码比我更容易引入某些类型的随机打嗝在真实硬件上引起控制性打嗝。)
目标代码用C语言编写,但仿真环境使用C ++来模拟I / O寄存器。例如,我有一个PortArray数据结构;嵌入式编译器的头文件包含像unsigned char LATA @ 0xF89;
这样的行,我的模拟头文件包含#define LATA _IOBIT(f89,1)
,后者又调用一个访问I / O对象的合适属性的宏,所以像这样的语句LATA |= 4;
将读取模拟的锁存器,"或"读取值为4,并写入新值。为了使这项工作,目标代码必须在C ++和C下编译,但这不是一个问题。最大的烦恼可能是enum
类型(在C中表现为整数,但必须在C ++中哄骗)。
以前,我使用了两种方法使模拟互动:
我发现后一种方法在某些情况下运行速度比前者慢一点,但它似乎更方便调试,因为我可以暂停执行非托管模拟代码,同时模拟UI保持响应。实际上,为了一次模拟单个目标设备,我认为后一种方法非常有效。我的问题是我应该如何最好地模拟多个目标设备(例如16个)。
我遇到的困难是弄清楚如何让每个模拟实例获得自己的全局变量集。如果我要编译成EXE并为每个模拟目标设备运行一个EXE实例,那就行了,但我不知道在这样做的同时保持调试器支持的任何实用方法。另一种方法是安排目标代码,以便在通过#include
将一个模块连接在一起时编译所有内容。出于模拟目的,可以将所有内容包装到单个C ++类中,并将全局变量转换为类实例变量。这将更加面向对象,但我真的不喜欢强制所有应用程序代码存在于一个编译和链接模块中。
如果代码可以加载DLL的多个实例,每个实例都有自己的一组全局变量,那么可能是理想的。我不知道该怎么做,但是,我也不知道如何使事情与调试器交互。我并不认为所有模拟目标设备实际上同时执行代码是非常必要的。模拟实例使用协作式多任务处理是完全可以接受的。如果有某种方法可以找出全局变量的内存范围,那么就可以进行“任务 - 切换”操作。方法交换先前运行的实例使用的所有全局变量,并交换适用于正在切换的实例的内容。虽然我知道如何在嵌入式上下文中执行此操作,但是,我'我不知道如何在PC上做到这一点。
修改
我的问题是:
我并不特别致力于任何单一的模拟方法;虽然可能很高兴知道是否有某些方法可以略微改善上述情况,但我也想知道任何其他可能更好的替代方法。
答案 0 :(得分:1)
我认为您仍然需要运行16个主应用程序代码副本,但是基于TCP的I / O模拟器可以为每个进入的TCP连接保留一组不同的寄存器/状态。 / p>
而不是一堆全局变量,将它们放入包含单个设备的I / O状态的单个结构中。为每个套接字生成一个新线程,或者只保留一个活动套接字列表,并为每个套接字专用一个状态结构实例。
答案 1 :(得分:0)