2011-10-07 52 views
2

我們有一個用VBA編寫的程序,該程序在Windows機器上運行。在嵌入式和Windows平臺上使用相同代碼的可行性

我們必須用ANSI C編寫一個非常類似的程序,使用Keil IDE和編譯器,上STR9x跑步。

我們的計劃是使用C#重寫.NET中的VBA代碼。

什麼是對兩個系統中使用寫入C++共享碼的可行性?顯然,.NET框架將會被禁用,但這並不是什麼大問題。我特別想知道你認爲編譯過程可能是多麼勞動密集。

這是一個理論問題,我知道,但謝謝你的任何想法。

+3

代碼是做什麼的?這一切都取決於接口。如果它是一個GUI框架,祝你好運。如果它是一個數學庫,它應該很容易。任何你不能堅持在Windows上使用ANSI C版本的理由? STR9x是一個相當笨重的野獸,但你也可能對這個問題感興趣:[C++適用於嵌入式系統嗎?](http://electronics.stackexchange.com/questions/3027/is-c-suitable-for-嵌入式系統) –

+0

@KevinVermeer該代碼在被測器件上執行測量,並根據這些測量結果做出決定。測量方法因平臺而異,但我可以將這些差異抽象出來。我不是一個非常優秀的C程序員(目前的生產代碼看起來很糟糕),但是如果普遍認爲ANSI C是兩種平臺的最佳選擇,我可以嘗試做得更好。 – ken

回答

2

我這樣做是一般的做法。我認爲比「是否可能」更好的問題是「我應該如何構建我的代碼才能在嵌入式系統和PC上運行」。

我更喜歡用C編寫代碼,並使用靜態變量將每個文件構造爲一個C++類,以使全局變量成爲模塊的私有變量。創建getter和setter函數來訪問私有變量。還可以使用我在模塊初始化時爲模塊需要在模塊外調用的方法設置的函數指針。

也很容易從上面的結構化c代碼重構到c#或C++中的類。

您也可以直接使用C++,但在嵌入式系統上錯誤地使用它可能會導致問題。

如果您正在訪問任何硬件,您將需要一個硬件抽象層。我將我的代碼分成兩類,第一類代碼沒有提及它運行的代碼以及其他代碼,我稱之爲驅動程序。

我使用此代碼重新使用通信協議等模塊。但更重要的是我使用它進行測試。我喜歡使用gtest來對模塊進行單元測試。我還可以重寫驅動程序並模擬PC上的硬件,以便能夠在PC上運行它。

+0

「我更喜歡用C語言編寫代碼,並使用靜態變量將每個文件構造爲一個C++類,以使全局變量成爲模塊的私有變量。」 - >你知道一個例子或博客文章更詳細地描述這個嗎?謝謝。 – ken

2

顯然,.NET框架將成爲禁區

未必是真實的。如果有足夠的ROM和RAM資源(分別爲256K/64K),則.NET Micro Framework將在您的設備上運行。但是,這不一定是使用它的好理由;已經有兩種常用的便攜式語言可用於嵌入式目標和Windows:C和C++。 C和C++都需要的目標資源非常少 - C/C++運行時啓動代碼可以低於1K的代碼,幾乎所有可用的資源都可以被應用程序代碼而不是運行時環境所利用。

在兩個平臺上使用通用代碼的技巧是抽象。如果您的目標使用任何類型的內核或調度程序(如RTOS或線程庫),則這將涉及至少硬件抽象和可能的操作系統抽象

我建議一個層架構設計嵌入式靶,其具有至少一個器件層應用層和如已經提到的,可能是系統層與IPC交易,同步和調度,如果使用。您可能有其他更高層的接口,例如網絡或文件系統,它們同樣可以從抽象中受益。請注意,諸如BSD套接字或stdio之類的標準API已經被視爲抽象,所以如果您的目標使用這些API,則您在Windows中的工作量會減少(BSD套接字與Winsock之間的細微差異仍需要一些工作)。層將不具有操作系統或硬件依賴性,除了可通過設備層和系統層訪問的那些。然後必須在Windows上實現設備和系統層,作爲模擬或重新映射到Windows上提供的服務或設備。一些RTOS已經包含了用於測試和開發的Windows模擬器,但是定義您自己的OS API層,您可以在多個本地RTOS和GPOS之間進行移植,這將允許您的應用程序代碼移植到不同的目標,以便進行仿真和實時執行很快。

如果平臺差異較小並且本地化,並且可能無法證明抽象層的正確性,那麼目標特定的條件編譯可能是合適的。編譯器支持predefined macros可用於體系結構,操作系統或編譯器特定的代碼,可用於本地化的代碼,並使抽象層代碼本身在存在顯着相似性的情況下通用。

相關問題