在Code Composer Studio编译器中禁用64位除法

在Code Composer Studio编译器中禁用64位除法,c,compiler-optimization,code-composer,map-files,code-size,C,Compiler Optimization,Code Composer,Map Files,Code Size,我目前正在使用CodeComposer Studio(CCS)V7.4.0.00015用C编写一个程序。 该程序有几个自行编写的库,可以执行字节、无符号整数和浮点除法 在项目中,我已经到了需要减少代码大小的阶段,以确保有足够的空间容纳引导加载程序 查看my.map文件可以发现CCS自动包含的几个运行时支持对象。其中包括: div64u.obj-->846字节 div64s.obj-->316字节 这些对象来自rts430x\u lc\u sd\u eabi.lib 我的问题是:为什么要包含这

我目前正在使用CodeComposer Studio(CCS)V7.4.0.00015用C编写一个程序。 该程序有几个自行编写的库,可以执行字节、无符号整数和浮点除法

在项目中,我已经到了需要减少代码大小的阶段,以确保有足够的空间容纳引导加载程序

查看my.map文件可以发现CCS自动包含的几个运行时支持对象。其中包括:

  • div64u.obj
    -->846字节
  • div64s.obj
    -->316字节
这些对象来自
rts430x\u lc\u sd\u eabi.lib

我的问题是:为什么要包含这些64位除法对象(特别是当我的程序中没有任何64位浮点时)?更重要的是,我可以禁用它们(或阻止CCS包含它们)

我花了几天时间在谷歌上搜索和搜索不同的网站,但是我还没有找到关于这些对象的很多文档或者如何禁用它们

编辑: 事实证明,我确实有一个函数使用long-long整数(typedef'd作为SLLONG)

/**
*@brief补偿从BME获得的原始压力
*@details使用压力补偿参数
*根据原始压力计算真实压力
*      
*“96386.2”的输出值等于96386.2帕=963.862帕
*
*此函数的内容取自Adafruit Github页面
*      https://github.com/adafruit/Adafruit_BME280_Library
* 
*@param rawPressure原始压力
*@param tempFine以高分辨率格式显示温度,
*从BME_compensateTemp()函数中获得
* 
*@返回从设备读取的压力
*/
浮子BME_补偿器压力(ULONG rawPressure,SLONG tempFine)
{
sllongvar1,var2,p;
if(rawPressure==0x800000)//禁用压力测量时的值
返回SNaN;
原始压力>>=4;
var1=((SLLONG)tempFine)-128000;//SLONG强制转换为SLLONG
var2=var1*var1*(SLLONG)compParamsStruct.dig\u P6;//SLONG^2 x(向SLLONG投掷剑)
var2=var2+((var1*(SLLONG)compParamsStruct.dig_P5)25;
var2=((SLLONG)compParamsStruct.dig_P8)*p)>>19;

p=((p+var1+var2)>>8)+((SLLONG)compParamsStruct.dig_P7)我对64位浮点运算原始问题的解决方案摘要:

以下行首先插入到编译器标志中:

--float_operations_allowed=32
但是,这在项目中产生了几个错误。每个位置的错误都是相同的:

#1558-D 64-bit floating point operations are not allowed
产生这些错误的代码是:

float lowerFence = med -1.5 * IQR;
float upperFence = med +1.5 * IQR;

通过将文字强制转换为浮点数并将多个浮点数操作移动到单行来修复该错误

float IQR = STATS_Iqr(sorted, numSamples);
float iqrScaled = 1.5 * IQR;
float lowerFence = med - iqrScaled;
float upperFence = med + iqrScaled;


解决上述错误后,项目被清理并重建。添加此编译器标志会删除以下对象

几乎所有编译器都可以选择优化代码大小,例如gcc中的
-Os
和MSVC中的
/Os
。请查看您的编译器手册。我不认为
div64u/s
are表示浮点除法。它们看起来像整数除法,您调用的其他实用程序可能会使用它们检查链接器文档中的选项以显示其包含模块的原因,并检查所有对象模块(包括来自库的模块)对于这些符号的引用。@phuclv我认为您认为整数除法是正确的。但是,我的项目中肯定没有任何64位的数据类型。我有32位无符号和有符号整数,在这些整数上执行数学运算。有什么我应该寻找(或避免)的吗这可能会导致包含此64位对象?@EricPostpischil感谢您的建议。我在查找链接器文档时遇到了一些问题。链接器命令文件名为lnk_msp430fr2433.cmd。您对我应该使用的常用搜索词/关键字有什么想法来查找我要查找的详细信息吗?很抱歉,这些新手。@EricPostpischil nevermind,我最终找到了正确的文档,但我似乎找不到任何引用div64u.obj的内容,也找不到为什么运行时支持库中包含了一些对象而不是其他对象。我相信,通过将
文本(如
1.5
0.5
更改为1.5f
0.5f
。如果您不知道,则不带后缀的浮点文本总是双精度的,因此
float iqrScaled=1.5*IQR;
通过将IQR提升为双精度来实现,将其乘以双精度1.5,然后返回浮点。如果不需要双精度,则始终使用
f
后缀。但对于t在他的情况下,您可以完全避免浮点运算,并使用所有整数:
int-IQR;int-iqrScaled=IQR*3/2;
@phuclv一个传奇的建议!我将实现这两种方法,并看看如何实现!非常感谢您的想法!我非常感谢
float lowerFence = med -1.5 * IQR;
float upperFence = med +1.5 * IQR;
return 0.5*coeffs->c0+tempScaled*coeffs->c1;                
float IQR = STATS_Iqr(sorted, numSamples);
float iqrScaled = 1.5 * IQR;
float lowerFence = med - iqrScaled;
float upperFence = med + iqrScaled;
float half = 0.5;
float c0Scaled = half*coeffs->c0;
float c1Scaled = tempScaled*coeffs->c1;
return c0Scaled + c1Scaled;