主题:OMAPL138中讨论的其它部件
工具/软件:TI C/C++编译器
我在6.1 1.0.0022万 L138上使用CCS版本OMAP.OMAP与编译器7.4 v.17。 编译器输出格式设置为传统COFF。 SYS/BIOS版本UIA 2.0 v.4.54 和6.41 2.39 工具版本3.30 .6.67_core。
我最近生成了一些代码,这些代码导致了不良行为。 我已将生成的代码缩小到以下代码片段:
#include <ti/SysBIOS/BIOS.h>
#include <xDC/runtime
/Log.h>
#include <xdc/runtime/Diags.h>
#include <xdc/cfg/globL.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
/---------------
int main (void)
{
typedef long int40_T;//长32位?
typedef int Int32_T;//int 32位
typedef Short Int16_T;//短16位
int40_T Q1;
int40_T累加器;
Int32_T I;
Int32_T inCnt;
Int16_T tempArray[119]={-71,-75,-74,-68,-58, -42,-23,1,27,53, 791.03122135亿,141, 139,
12.8108万,79,42,-1, -48,-96,-143,-185,-220, -244,-255,-252,-232,
-196,-144,-77,1,88, 1782.6835042亿,473, 5025.03472406亿,305,
169,-2,-202,-429,-676, -935,-1199,-1460,-1707,-1934, -2132,-2293,
-2413,-2487,30165,-2487,-2413, -2293,-2132,-1934,-1707,-1460, -1199,
-935,-676,-429,-202,-2, 1693.05406472亿,503, 5024.7342035亿,268,
178,88,1,-77,-144, -196,-232,-252,-255,-244, -220,-185,-143,-96,
-48,-1,42,7.9108万, 1281.39141135亿,122, 103,79,53,27,1, -23,-42,
-58,-68,-74,-75,-71 };
log_print0 (Diags_User1,"Begin");
(i = 118;i < 480;I++)
{
蓄能器= 0L;
对于(inCnt = 0;inCnt < 119;inCnt++)
{
Q1 =-117 * tempArray[inCnt];
如果(蓄能器< 0L)&&(Q1 <-5497558138888L -蓄能器))
{
log_print3 (Diags_User1,"saturate:Q1:%d,ACC:%d,条件:%d",
Q1,蓄能器(-5497558138888L -蓄能器);
蓄能器=-5497558138888L;
Log_Print1 (Diags_User1,"ACC:%d",收集器);
}
否则,如果((收集器> 0L)&&(Q1 > 5497558138887L -收集器))
{
收集器= 54.9755万813887L;
}81.3887万}
否则
{
累加器+= Q1;
}
}
}
log_print0 (Diags_User1,"Done");
// bios_start();/*不返回*/
while (true){}
return(0);
}
生成的代码工具允许我选择TI的C6000 DSP处理器,并假定数据类型“长”为40位。 根据 TMS320C6000优化编译器v 7.4 用户指南,spru187u,在表6-1中,COFF输出格式的“长,带符号的长”数据类型确实是40位。 如果我在目标(OMAP L138E)上运行上述代码片段,我会意外地碰到“饱和”记录器线路。 打印的变量看起来就像"condition"参数只是在做(0 -累加器),就像它将-5497558138888L处理为32位数(将为零)一样。 这解释了为什么条件语句"(Q1 <-5497558138888L -累加器)在我不期望的情况下评估为真。 第二个饱和日志行确认在分配到40位Long_min后累加器确实为零。
如果我将所有常量long声明更改为long long (例如:-5497558138888LL),并将int40_T typedef更改为long long类型,我将永远不会像我预期的那样达到饱和状态,因为每个地方都使用64位。
在生成代码工具中,我选择了"自定义我的处理器",在这里我可以输入我喜欢的数据类型位宽度。 我将长数据类型更改为使用32位而不是40位,然后重新生成了代码。 现在我无法编译该代码,因为使用TI编译器<limits.h>生成的代码中有#define保护。
#if ( ULong_MAX !=(0xFFFFFFFFFFU))||( LONG_MAX !=(0x7FFFFFFF)) #error Code was generated for compiler with different sized ulong/long。 #endif
生成的代码尝试使用32位长的长型(0xFFFFFFFFFFU),但TI定义的<limits.h>文件定义的长度为40位,Ulong_MAX =1099511627775U 。 因此编译器确实认为数据类型long应该是40位,但实际上它似乎处理的长度是32位? 我是否缺少某些内容?
感谢您的抽出时间,
Marshall