Отключить 64-битное деление в компиляторе Code Composer Studio - PullRequest
0 голосов
/ 15 октября 2019

В настоящее время я пишу программу на C, используя Code Composer Studio (CCS) V7.4.0.00015. В программе есть несколько самописных библиотек, которые выполняют деление байтов, беззнаковых int и float.

Я достиг той стадии проекта, когда мне нужно уменьшить размер кода, чтобы обеспечить достаточно места для установки загрузчика.

Просмотр моего файла .map показывает несколько объектов поддержки времени выполнения, которые CCS автоматически включает. Вот некоторые из них:

  • div64u.obj -> 846 байт
  • div64s.obj -> 316 байт

Эти объектыиз rts430x_lc_sd_eabi.lib

Мой вопрос таков: почему эти 64-битные объекты деления включены (особенно если в моей программе нет 64-битных операций с плавающей запятой)? И что более важно, могу ли я их отключить (или запретить CCS включать их)?

Я потратил несколько дней, гуглял и тралял разные сайты, но мне не удалось найти много документации по этим объектам или как их отключить.

Редактировать: Оказывается, у меня действительно есть одна функция, использующая длинные длинные целые числа (typedef'd как SLLONG)

/**
 * @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;
}

Новый вопрос:

  • Может кто-нибудь придумать способ перестановки функции так, чтобы она не требовала использования длинных длинных целых чисел (без потери точности?)
  • ИЛИ , точнее, может кто-нибудьвыясните, как я могу сделать это длинное длинное деление по-другому, то есть по линии, показанной ниже:
p = (((p<<31) - var2)*3125) / var1;
...