2013-07-30 59 views
1

通過Simulink生成代碼(Matlab R2011A在MacOS 64位上) 我遇到了一個問題:它在代碼中使用ceil函數,但它在我的目標平臺上不受支持。 我使用ERT生成Arm Cortex處理器(在Cypress PSoC上)。Simulink使用不受支持的構造生成代碼(ceil)

有沒有可能解決這個問題?

我試過解決方案沒有成功。 此外,在代碼生成 - 接口,我試圖禁用浮點數或非有限數...但通過這種方式,我的項目的每個信號都會產生一些錯誤(同樣的行爲也會改變它的數據類型)。

真的感謝任何人暗示我什麼,我可以嘗試做

+0

你確定你沒有ceil ...你有沒有在matlab界面上試過ceil(2.3)?這是很奇怪的,你沒有在matalb上的ceil ... – Werner

+0

問題是,在我的ARM代碼內部產生了ceil(),並且它不支持該指令... –

回答

1

好的......我解決了。

問題出在目標環境(PSoC Creator)中。 如這裏http://www.cypress.com/?id=4&rID=42838解釋說:

轉到項目 - >構建設置 - >鏈接器 - >常規 - >附加庫。在Additional Libraries字段中鍵入m。 如果你不添加這個附加庫,那麼你會得到以下的構建錯誤「對sqrt'的未定義引用」,其中sqrt是一個數學函數。

如果問題出現在sqrt()或ceil()中,因爲它們位於同一個庫(math.h)中,所以沒有任何更改。

PS:謝謝你Engineero ...你的解決方案非常有用,可以從我的問題(但在其他環境)從其他人認識。

2

你可以寫你自己的ceil功能,包括它在任何你輸出的代碼對於目標設備。假設您正在生成C代碼,功能將類似於:

int ceil (double number) { 
    if (number == 0) 
     return 0; 
    if (number > 0) { 
     if (number - (int) number > 0) 
      return (int) number + 1; 
     else 
      return (int) number; 
    } 
    else { 
     if (number - (int) number < 0) 
      return (int) number - 1; 
     else 
      return (int) number; 
    } 
} 

有了一個原型喜歡你的頭文件:

int ceil (double); 

現在你的C代碼可以調用integerValuedNumber = ceil(doubleValuedNumber),它應該工作。你也可以用macros in the C-file來做到這一點(參見任天堂的回答)。

編輯:我糾正我的代碼,用來C.適當的類型轉換語法,你與(int) number語法做的是基本上什麼雙值number變量,並迫使它是一個整數。您可以找到更多關於data types in C here或Google「類型轉換C」或「數據類型C」的更多信息。

此外,可能需要一些額外的括號,如return ((int) number) + 1;等。我對C編程有點生疏,但希望這可以讓你朝着一個可行的解決方案邁進。

編輯2:我更正了我們自定義的ceil函數的返回數據類型。你會想要這個返回一個int,或者long。同樣,如果您不確定哪種數據類型適合您的應用程序,請查看C中關於數據類型的文檔。如果您申請的值不是很大(例如小於+/- 2^15),那麼int可能沒問題。

+0

謝謝你的回答。 ..但是不存在ceil(),int()也不存在...... :( –

+0

@PierpaoloCira對不起,我錯誤的語法。我更正了我的答案,包括C的正確類型轉換語法。我不保證我的代碼正是你所需要的,但它可能讓你開始在正確的道路上。 – Engineero

+1

謝謝你:這是非常有用的。順便說一下,我發現一個不同的解決方案,我的問題,使用ceil()native實現(在math.h庫中) –

相關問題