В настоящее время я пишу программу на C, используя Code Composer Studio (CCS) V7.4.0.00015. В программе есть несколько самописных библиотек, которые выполняют Byte, unsigned int и float деление.
Я достиг той стадии проекта, когда мне нужно уменьшить размер кода, чтобы обеспечить достаточно места для загрузчика.
Глядя на мой файл .map, я обнаруживаю несколько объектов поддержки времени выполнения, которые CCS автоматически включает. Некоторые из них включают следующее:
div64u.obj
--> 846 байтdiv64s.obj
--> 316 байт
Эти объекты из rts430x_lc_sd_eabi.lib
Мой вопрос: почему эти 64-битные объекты деления включены (особенно, когда в моей программе нет 64-битных чисел с плавающей запятой)? И, что более важно, могу ли я отключить их (или запретить CCS включать их)?
Я провел несколько дней в поиске и просмотре различных сайтов, но мне не удалось найти много документации по этим объектам или по их отключению.
Редактировать: Оказывается, у меня действительно есть одна функция, использующая long long int (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;
-Os
в gcc и/Os
в MSVC. Проверьте руководство по компилятору. И я не думаю, чтоdiv64u/s
предназначены для деления с плавающей запятой. Они выглядят как целочисленное деление и могут использоваться другими утилитами, которые вы вызываете. - person phuclv   schedule 15.10.2019(float)((p<<31) - var2)/var1*3125.0f;
, поскольку вы уже используетеfloat
в своем коде. Но не слишком ли много 316 байт? Сколько у вас осталось флешки? - person phuclv   schedule 15.12.2019