在嵌入式和Windows平台上使用相同代码的可行性

时间:2011-10-07 15:55:58

标签: windows embedded keil

我们有一个用VBA编写的程序在 Windows 机器上运行。

我们有一个非常类似的程序用ANSI C编写,使用{b} STR9x uP上运行的 Keil IDE和编译器。

我们的计划是使用C#在 .NET 中重写VBA代码。

C ++ 中编写共享代码以在两个系统上使用的可行性是什么?显然,.NET框架将是不受限制的,但这并不是一个问题。具体而言,我想知道你认为编译过程可能是多么紧张。

我知道这是一个理论问题,但感谢任何想法。

2 个答案:

答案 0 :(得分:2)

我这是一般的做法。我认为比“可能”更好的问题是“我应该如何构建我的代码才能在嵌入式系统和PC上运行”。

我更喜欢用C编写代码,并使用静态变量将每个文件构造为c ++类,以使全局变量对模块是私有的。创建getter和setter函数以访问私有变量。还使用函数指针,我在模块初始化时为模块需要在模块外部调用的方法设置。

从上面的结构化c代码重构到c#或c ++中的类也很容易。

您也可以直接使用C ++,但在嵌入式系统上错误地使用它可能会导致问题。

如果您正在访问任何硬件,则需要硬件抽象层。我把我的代码分成两种类型,第一种是没有引用它运行的代码和其他我称之为驱动程序的代码。

我使用此代码重用通信协议之类的模块。但更重要的是我用它进行测试。我喜欢使用gtest对模块进行单元测试。我还可以重写驱动程序并在PC上模拟硬件,以便能够在PC上运行它。

答案 1 :(得分:2)

  

显然,.NET框架将不受限制

不一定是真的。如果有足够的ROM和RAM资源(分别为256K / 64K),.NET Micro Framework将在您的设备上运行。然而,这并不一定是使用它的理由;已经有两种常用的可移植语言可用于嵌入式目标和Windows:C和C ++。 C和C ++所需的目标资源是最小的 - C / C ++运行时启动代码可能远低于1K的代码,几乎所有可用资源都可以被应用程序代码而不是运行时环境使用。

在两个平台上使用公共代码的技巧是抽象。如果您的目标使用任何类型的内核或调度程序(如RTOS或线程库),这将至少涉及硬件抽象和可能 OS抽象

我建议使用层架构设计嵌入式目标,至少具有设备层应用层,如上所述已经,可能是一个处理IPC,同步和调度的系统层(如果使用的话)。您可能有其他更高层的接口,例如网络或文件系统,它们同样可以从抽象中受益。请注意,标准API(如BSD套接字或stdio)已被视为抽象,因此如果您的目标使用这些API,您在Windows中的工作量较少(BSD套接字和Winsock之间的细微差别可能仍需要一些工作)

除了可通过设备和系统层访问的应用程序层之外,应用程序层不具有操作系统或硬件依赖性。然后,您必须在Windows上将设备和系统层实现为模拟或重新映射到Windows上可用的服务或设备。一些RTOS已经包含用于测试和开发的Windows模拟器,但是定义您自己的OS API层,您可以在多个本机RTOS和GPOS之间移植,这将允许您的应用程序代码移植到不同的目标,以便进行模拟和实时执行。快。

如果平台差异很小并且是本地化的,并且可能无法证明抽象层的合理性,那么目标特定的条件编译可能是合适的。编译器支持predefined macros用于体系结构,操作系统或编译器特定代码,这些代码可用于此本地化代码,并使抽象层代码本身在具有显着相似性的地方通用。