Vb.net 模拟嵌入式处理器的多个实例

Vb.net 模拟嵌入式处理器的多个实例,vb.net,visual-studio,dll,embedded,simulation,Vb.net,Visual Studio,Dll,Embedded,Simulation,我正在做一个项目,需要多个设备,每个设备都有一个嵌入式(ARM)处理器,用于通信。在过去,我发现只有一个嵌入式处理器的项目采用的一种开发方法是使用Visual Studio开发代码,分为三部分: 主应用程序代码(非托管C/C++[请参见注释]) 在Visual Studio下运行的I/O模拟代码(C/C++) 嵌入式I/O代码(C)在目标系统上运行,Visual Studio被指示不构建该代码。以前,该代码用于PIC;对于大多数未来的项目,我将迁移到ARM。 将第1部分和第3部分中的代码提供给嵌

我正在做一个项目,需要多个设备,每个设备都有一个嵌入式(ARM)处理器,用于通信。在过去,我发现只有一个嵌入式处理器的项目采用的一种开发方法是使用Visual Studio开发代码,分为三部分:

  • 主应用程序代码(非托管C/C++[请参见注释])
  • 在Visual Studio下运行的I/O模拟代码(C/C++)
  • 嵌入式I/O代码(C)在目标系统上运行,Visual Studio被指示不构建该代码。以前,该代码用于PIC;对于大多数未来的项目,我将迁移到ARM。 将第1部分和第3部分中的代码提供给嵌入式编译器/链接器,生成可以在目标系统上运行的十六进制文件。同时运行第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++中必须被引导才能这样做)

    之前,我使用了两种方法使模拟具有交互性:

  • 编译并链接一个DLL与目标应用程序和仿真代码,并在与之交互的同一项目中使用VB代码。
  • 使用Visual Studio实例将目标应用程序代码和一些模拟代码编译为EXE,并使用Visual Studio的第二个实例作为模拟UI。让两个程序通过TCP进行通信,因此几乎所有“真实”I/O逻辑都在模拟程序中。例如,前面提到的“LATA”=4;`将向TCP端口发送一个“读取端口0xF89”命令,获取响应,处理接收到的值,并发送一个带有结果的“写入端口0xF89”命令。 我发现,在某些情况下,后一种方法的运行速度比前一种稍微慢一点,但它似乎更便于调试,因为我可以在仿真UI保持响应的同时暂停非托管仿真代码的执行。事实上,对于一次模拟单个目标设备,我认为后一种方法非常有效。我的问题是如何最好地模拟多个目标设备(例如16个)

    我遇到的困难是弄清楚如何使每个模拟实例获得自己的一组全局变量。如果我要编译成一个EXE并为每个模拟的目标设备运行一个EXE实例,这是可行的,但我不知道在这样做的同时维护调试器支持的任何实际方法。另一种方法是安排目标代码,以便将所有内容编译为一个模块,通过
    #include
    连接在一起。为了模拟,所有的东西都可以被封装到一个C++类中,全局变量变成类实例变量。这将更加面向对象,但我真的不喜欢强迫所有应用程序代码都存在于一个编译和链接的模块中

    如果代码可以加载DLL的多个实例,每个实例都有自己的一组全局变量,那么这可能是最理想的。但是,我不知道如何做到这一点,也不知道如何使事情与调试器交互。我不认为所有模拟的目标设备都必须同时执行代码;仿真实例使用协作多任务是完全可以接受的。如果有某种方法可以找出保存全局变量的内存范围,那么“任务切换”方法可能会调出以前运行的实例使用的所有全局变量,并调出适用于被切换实例的内容。虽然我知道如何在嵌入式环境中做到这一点,但我不知道如何在PC上做到这一点。 编辑

    我的问题是:

  • 如果模拟逻辑必须用C编写,模拟前端必须用托管代码编写,那么在VS2010调试器中暂停和检查模拟逻辑,同时为模拟器前端保留一个响应的UI,是否有比在VS2010的单独实例中运行模拟器前端和模拟器逻辑更好的方法?例如,有没有一种方法可以告诉调试器,当遇到断点时,应该允许某些或所有其他线程继续运行,而遇到断点的线程处于暂停状态?
  • 如果大部分模拟逻辑必须是与用C编写的嵌入式系统兼容的源代码(以便在VS2010下为模拟目的编译和运行相同的源文件,然后由嵌入式系统编译器编译以用于实际硬件),有没有办法让VS2010调试器与嵌入式设备的多个模拟实例交互?假设性能不太可能是一个问题,但实例的数量将足够大,以至于在没有任何方法自动化流程的情况下,为每个实例创建单独的项目可能会很烦人。我可以想出三种稍微可行的方法,但我不知道如何使它们中的任何一种真正有效。有