1

Simulink によるコードの生成 (MacOS 64 ビットの Matlab R2011A) 問題が発生しましceilた。コード内で関数を使用していますが、ターゲット プラットフォームではサポートされていません。Arm Cortex プロセッサ (Cypress PSoC 上) 用の ERT を使用して生成しています。

この問題を解決することは可能ですか?

私は成功せずに解決策を試しました。また、コード生成 - インターフェイスで、浮動小数点数または非有限数を無効にしようとしました... しかし、この方法では、プロジェクトのすべての信号でいくつかのエラーが発生します (同じ動作でデータ型も変更されます)。

本当にありがとう

4

2 に答える 2

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)、動作するはずです。Cファイルのマクロでこれを行うこともできます(任天堂の回答を参照)。

編集: C の適切な型キャスト構文を使用するようにコードを修正しました。基本的に、(int) number構文で行っていることは、二重値のnumber変数を取得し、それを整数にすることです。C のデータ型の詳細については、こちらを参照してください。詳細については、Google の「型キャスト C」または「データ型 C」を参照してください。

また、追加の括弧が必要になる場合もreturn ((int) number) + 1;あります。私は C プログラミングに少し慣れていませんが、うまくいけば、これで実行可能な解決策に進むことができます。

編集 2:自己定義ceil関数の戻りデータ型を修正しました。intこれが、または多分を返すようにしたいでしょうlong。繰り返しになりますが、アプリケーションに適したデータ型がわからない場合は、C のデータ型に関するドキュメントを確認してください。適用する値がceilそれほど大きくない場合 (たとえば、+/- 2^15 未満)intは、おそらく問題ありません。

于 2013-07-30T22:54:27.580 に答える
1

わかりました...解決しました。

問題は宛先環境 (PSoC Creator) にありました。ここで説明されているようにhttp://www.cypress.com/?id=4&rID=42838 :

プロジェクト -> ビルド設定 -> リンカー -> 一般 -> 追加ライブラリに移動します。[追加ライブラリ] フィールドに m と入力します。この追加ライブラリを追加しない場合、次のビルド エラー「`sqrt' への未定義の参照」が表示されます。ここで、sqrt は数学関数です。

問題が sqrt() または ceil() にある場合、これらは同じライブラリ (math.h) にあるため、何も変わりません。

PS: Engineero に感謝します... あなたのソリューションは非常に便利で、私の問題を抱えている他の人からも評価できます (ただし、他の環境では)。

于 2013-07-31T08:23:32.810 に答える