我们有一个用Windows机器上运行的VBA编写的程序。
我们有一个用ANSI C编写的非常类似的程序,使用Keil IDE和一个运行在STR9x uP上的编译器。
我们的计划是使用C#在.NET中重写VBA代码。
用C ++编写共享代码在两个系统上使用的可行性是什么? 很明显,.NET框架将会被禁止,但这并不是什么大问题。 我想知道,具体来说,你认为编译过程可能是多么劳动密集。
我知道这是一个理论问题,但是谢谢你的任何想法。
我做这个一般的做法。 我认为比“是否可能”更好的问题是“我应该如何构建我的代码才能在嵌入式系统和PC上运行”。
我更喜欢使用C语言编写代码,并使用静态变量将每个文件构造为一个c ++类,以使全局变量成为模块的私有变量。 创建getter和setter函数来访问私有变量。 还可以使用模块初始化时为模块需要在模块外部调用的方法设置的函数指针。
从上面的结构化c代码重构到c#或c ++中的类也很容易。
您也可以直接使用C ++,但在嵌入式系统上错误地使用它可能会导致问题。
如果您正在访问任何硬件,您将需要一个硬件抽象层。 我把我的代码分成两种类型,第一种是没有参考它运行的代码和其他我称之为驱动程序的代码。
我使用这个代码重用通讯协议等模块。 但更重要的是我使用它进行测试。 我喜欢用gtest来对模块进行单元测试。 我也可以重写驱动程序,模拟PC上的硬件,使其能够在PC上运行。
很明显,.NET框架将被禁止
不一定是真的。 给定足够的ROM和RAM资源(分别为256K / 64K) ,.NET Micro Framework将在您的设备上运行。 但是,这不一定是使用它的好理由。 已经有两种常用的便携式语言可用于嵌入式目标和Windows:C和C ++。 C和C ++所需的目标资源是最小的 – C / C ++运行时启动代码可以低于1K的代码,几乎所有可用的资源都可以被应用程序代码而不是运行时环境所利用。
在这两个平台上使用通用代码的技巧是抽象的 。 如果您的目标使用任何类型的内核或调度程序(如RTOS或线程库),至少需要硬件抽象和可能的操作系统抽象 。
我建议设计一个层次结构的嵌入式目标,至少有一个设备层和一个应用层 ,如前所述,可能是一个系统层 ,处理IPC,同步和调度(如果使用的话)。 您可能有其他更高层的接口,如网络或文件系统,同样可以从抽象中受益。 请注意,标准的API如BSD套接字或stdio已经算作抽象,所以如果你的目标使用这些,你在Windows中做的工作就少了(BSD套接字和Winsock之间的细微差别可能还需要一些工作)
除了通过设备层和系统层可访问的应用层之外,应用层不具有操作系统或硬件依赖性。 然后必须在Windows上实现设备和系统层,作为模拟或重新映射到Windows上可用的服务或设备。 一些RTOS已经包含了用于测试和开发的Windows模拟器,但是定义您自己的OS API层,您可以在多个本地RTOS和GPOS之间进行移植,这将允许您的应用程序代码移植到不同的目标,以便进行仿真和实时执行很快。
在平台差异较小且本地化的情况下,可能无法证明抽象层,那么目标特定的条件编译可能是合适的。 编译器支持用于体系结构,操作系统或编译器特定代码的预定义宏 ,这些代码可用于本地化代码,并使抽象层代码本身在存在显着相似性的情况下通用。