当前位置:首页 > DSP常见编译错误 - 图文
2. 尝试使能或者增加编译器的优化级别,未经优化的代码往往需要更多的存储空间。
3. 如果使用了I/O代码,则它们会显著增加代码尺寸,例如在很多小容量的器件上,一个printf()函数就能超过存储容量了,此时可以使用printf()的最小格式,请参考http://www.eepw.com.cn/article/266820.htm。
4. 可以考虑修改cmd文件,以增加某个段所使用的存储空间的长度;代价是别的存储空间的长度会相应减小,有可能导致新的placement fails 这样的错误产生。具体可参考http://www.eepw.com.cn/article/256732.htm。
5. 尝试精简/优化代码,在不影响功能的情况下,使用一些编程技巧来减小代码尺寸。
例如,我们可以使用―空间换时间‖,或者―时间换空间‖的方法,在代码尺寸和执行速度上做一些折衷。比如对于一个滑动傅立叶变换(sDFT),我们既可以使用很大的数组来保存滑动值, 从而实现很高的运算速度;也可以减少运算速度,每个周期只使用几个点来完成计算,这样可以极大地减小存储空间的占用。 6. 不到万不得已,不要去考虑更换芯片。
但是如果在产品开发的评估阶段,存储空间就已经捉襟见肘了,则还是要提早考虑升级芯片的,不然以后再增加新的功能,或者哪怕是仅仅修正了一个小的bug,有可能就彻底放不进去了。
46. Tag_Memory_Model attribute value of \one previously seen (\,是神马意思? 这个错误表明链接器所链接的目标文件中存在不同的内存模式,比如说有的目标文件使用了大内存模式,而有的使用的是小内存模式。修改的方法则是让所有的文件在链接时都使用相同的内存模式。
事实上这种错误出现的场合并不算太多,主要出现在工程中引用了别人提供的某些obj文件或者库文件的时候。在C2000上,新建工程的时候推荐大家统统使用大内存模式(-ml)选项。
47. Error: file grlib.lib\support while a previously seen file was; combining incompatible files,是神马意思?
这个错误与上面那个错误的原因是类似的,表明链接器所链接的目标文件中存在不同的浮点支持模式。修改方法则是让所有的目标文件和库文件使用相同的浮点支持--float_support选项。
48. 为什么编译的时候总是提示Warning: creating output section \
在使用默认的cmd文件进行编程,而工程中有使用了某些cmd中未明确定义的段的时候,就会出现这个警告。因为没有在cmd中定义这个段,所以链接器会使用默认的算法来创建和分配输出段―XXX‖;这样虽然能保证程序的工作,却不被建议这样做,因为它不利于内存地址空间的有效分配和管理。通常来说,最好不要有任何的链接器警告,以消除程序运行时潜在的bug。
49. 莫名其妙的gmake: Access is denied。
在编译程序的时候,编译器会生成一系列的中间文件,包括obj、lib、asm等等,这个过程被一些带有主动防御系统的杀毒软件和安全软件当作危险行为,因此就被禁止掉了,导致编译失败,如下图所示:
所以在编译程序的时候,最好禁用安全软件,不然即使是安全软件没有直接阻止编译,也会跳出各种各样的询问信息,不胜其扰。
50. Type 'xyz' or Symbol 'abc' could not be resolved。
这些错误一般是由Eclipse CDT (C/C++开发工具)错报出的,而不是由TI本身的编译器所给出的。目前的解决方法是:
从CCSv4的工程升级到CCSv5或者更高版本的时候,如果选择的是project---导入工程,一般会有一定的兼容性问题,可能会产生这样的错误。解决方案则是创建一个新的工作区,然后把所有的源程序、库文件、cmd文件等导入到新的工程中,重新配置工程选项,然后再编译。
或者干脆忽略CDT的语法错误,方法是在CCS中点击
Window->Preferences->General->Editors->Text Editors->Annotations, 选择C/C++ Indexer Markers,然后清除掉所有的选择。
51. Warning: build attribute vendor section TI missing in \compatibility cannot be determined。是什么属性丢失了?
出现这个问题,说明使用的库文件是由一个老版本的编译/链接工具所创建的,在使用新版本的工具进行编译/链接时,这个老的库文件缺失了某些属性,导致了这个警告的产生。在C2000 DSP的开发中,有几个场合特别容易出现此警告: 2 在新的编译环境中,使用了一个老版本的IQmath库文件。 2 在测试时,使用了老版本的编译器生成的Flash API。
2 在使用高分辨率的HRPWM模块时,使用了老版本的SFO库文件来修正MEP。 这个警告总的来说并不影响程序的运行,我们即可以通过把老的库文件换成最新版本来彻底解决此问题,也可以在cmd文件中使用--diag_suppress=16002来消除此警告信息。至于16002这样的警告信息是如何归类的,在CCS的编译提示里就有: #16002-D build attribute vendor section TI missing in
\cannot be determined
52. fatal error: file .....rts2800_fpu32.lib\\specified in a previous file or on the command line。 这个致命错误说明对某些不是FPU32的目标文件启用了
--float_support=FPU32选项进行编译,例如这个目标文件是由不含有FPU的器件上的编译编译而来的时候就会产生,也有可能是这个目标文件没有使用FPU选项。解决的方法是:
2 如果导致错误的目标文件是支持FPU的,则使用-v28
--float_support=FPU32来编译所有的程序。在CCS中,可以把这个选项作为全局选项,或者预编译选项。
2 如果器件不支持FPU,则不要使用FPU32选项。这是因为在含有FPU的器件中,float类型的变量会传递到FPU寄存器中进行处理;而在不含有FPU的器件中,float类型的变量仍然会保存到栈中。
53. Warning: entry-point symbol other than \specified: \。
初学者经常会遇到此问题。事实上这个警告并不会对程序的运行产生什么影响,它只是用来告诉我们,程序的入口点被编译器给自动分配到code_start,而不是默认的_c_int00中;它们的效果是一样的,含义请参考
http://www.eepw.com.cn/article/262926.htm。TI提供的外设例子在编译时也经常会产生此警告。
54. Error: unresolved symbols remain....
符号FD$$MPY、FD$$TOL之类的找不到,这样的问题也是初学者经常遇到的。这样的问题说明相关的库函数被使用了,但是库并没有被添加到工程之中。例如,在程序中使用了c = IQdiv(a,b);这样的程序,但是并没有把IQmath.lib添加到工程中,则IQdiv就会被提示unsolved这样的错误,解决方法则是把对应的库文件添加到工程里就好了。
特别说明:带有两个美元符号$$的函数一般都是实时运行库RTS里的,一定要记得添加对应的RTS库文件。
55. Error: Tag_ISA attribute value of \one previously seen (\
这个错误表明ISA版本这个属性不正确。其中,1代表C27x,2代表C28x。在使用C28x时,应该使用-v28这样的选项来使用C28x模式,而不应该再使用其它的兼容模式了。
56. Error: placement fails for object \
在早期版本的CCS5.x编译器/链接器中,有这个问题,链接器会不停地提示相同名字的段被既保存在page0,又被保存在page1之中,直到我们把它们改好;这算是一个bug吧,升级编译工具codegen的版本,或者干脆升级整个ccs软件,就可以解决此问题。
57. Warning: function declared implicitly
虽然这只是个警告,但是它表明函数的原型不存在,编译器会对函数的参数和返回值做一些假设,这就是bug的一种源头,所以一定要把这个警告给消除掉。 58. 为什么一个看起来很简单的程序,链接的时候却要花费很长的时间?
导致这种现象的最主要的原因是类型合并(type merging)。那什么是类型合并呢?举个简单的例子,在头文件types.h中定义了结构sss,且所有的.c中中都引用了这个types.h。因此在编译之后,描述sss的调试类型信息被包含到每个目标文件之中(除非使用了--symdebug:none来禁用调试信息),因此在链接的时候,链接器会发现有很多个sss类型的副本;默认情况下,链接器使用类型合并把这么多sss类型合并为一个,从而使得最终输出的.out文件中只有一个sss类型,而不是很多个重复的副本,达到减小代码尺寸的目的,并且使得CCS在加载.out文件时也会花费更少的时间。然后,类型合并这个过程中需要大量的计算,因此导致了链接看起来需要花费很长的时间。 解决的方法有两个:
1. 禁用类型合并:使用链接器的-b选项(含义请参考
http://www.eepw.com.cn/article/249328.htm)。这样做的结果是链接的时间变短,但是.out文件变大,需要更长的时间来加载;如果在这个例子中sss的副本非常多,有可能需要很差的时间来加载.out文件。
共分享92篇相关文档