0

現在、Code Composer Studio (CCS) V7.4.0.00015 を使用して C でプログラムを作成しています。このプログラムには、Byte、unsigned int、float 除算を実行するいくつかの自己作成ライブラリがあります。

ブートローダに適合する十分なスペースを確保するために、コード サイズを縮小する必要があるプロジェクトの段階に達しました。

私の .map ファイルを見ると、CCS が自動的にインクルードするランタイム サポート オブジェクトがいくつかあることがわかります。これらのいくつかは、次のとおりです。

  • div64u.obj--> 846 バイト
  • div64s.obj--> 316 バイト

これらのオブジェクトは、rts430x_lc_sd_eabi.lib

私の質問は次のとおりです。これらの 64 ビット除算オブジェクトが含まれているのはなぜですか (特に、プログラムに 64 ビット浮動小数がない場合)。さらに重要なことに、それらを無効にする (または CCS がそれらを含めないようにする) ことはできますか?

私は数日間、さまざまなサイトをグーグルで調べたり、トロールしたりしましたが、これらのオブジェクトやそれらを無効にする方法に関する多くのドキュメントを見つけることができませんでした.

編集: 実際には、long long int を使用する関数が 1 つあることがわかりました (SLLONG として typedef されています)。

/**
 * @brief Compensate the raw pressure gained from the BME
 * @details Uses the pressure compensation parameters to 
 *      calculate the true pressure from the raw pressure
 *      
 *      Output value of “96386.2” equals 96386.2 Pa = 963.862 hPa
 *
 *      The contents of this function have been taken from the Adafruit Github page
 *      https://github.com/adafruit/Adafruit_BME280_Library
 * 
 * @param rawPressure The raw pressure
 * @param tempFine The temperature in high resoltuion format, 
 *      gained from the BME_compensateTemp() function
 * 
 * @return the pressure read from the device
 */
float BME_compensatePressure(ULONG rawPressure, SLONG tempFine)
{
    SLLONG var1, var2, p;

    if (rawPressure == 0x800000) // value in case pressure measurement was disabled
        return SNaN;
    rawPressure >>= 4;

    var1 = ((SLLONG)tempFine) - 128000;                                         // SLONG cast to SLLONG 
    var2 = var1 * var1 * (SLLONG)compParamsStruct.dig_P6;                       // SLONG^2 x (SWORD cast to SLLONG) 
    var2 = var2 + ((var1*(SLLONG)compParamsStruct.dig_P5)<<17);                 // SLLONG + (SLLONG * SWORD cast to SLLONG)
    var2 = var2 + (((SLLONG)compParamsStruct.dig_P4)<<35);
    var1 = ((var1 * var1 * (SLLONG)compParamsStruct.dig_P3)>>8) +
           ((var1 * (SLLONG)compParamsStruct.dig_P2)<<12);
    var1 = (((((SLLONG)1)<<47)+var1))*((SLLONG)compParamsStruct.dig_P1)>>33;

    if (var1 == 0) {
        return 0; // avoid exception caused by division by zero
    }
    p = 1048576 - rawPressure;
    p = (((p<<31) - var2)*3125) / var1;
    var1 = (((SLLONG)compParamsStruct.dig_P9) * (p>>13) * (p>>13)) >> 25;
    var2 = (((SLLONG)compParamsStruct.dig_P8) * p) >> 19;

    p = ((p + var1 + var2) >> 8) + (((SLLONG)compParamsStruct.dig_P7)<<4);
    return ((float)p)/256;
}

新しい質問:

  • long long 整数を使用する必要がないように (精度を損なうことなく)、関数を再配置する方法を誰かが見つけ出すことができますか?
  • または、より具体的には、その長い長い除算を別の方法で行う方法、つまり以下に示す行を誰かが理解できますか?
p = (((p<<31) - var2)*3125) / var1;
4

1 に答える 1