新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > DSP编程技巧之33---答疑解惑哪家强之(8)

DSP编程技巧之33---答疑解惑哪家强之(8)

作者:paradoxfx时间:2015-01-04来源:电子产品世界收藏

  答疑解惑哪家强?当属我们EEPW最强。。。接下来继续了解一下与编译器和链接器的常见错误、警告有关的问题原因和解决方法。

本文引用地址:http://www.eepw.com.cn/article/267641.htm

  46. Tag_Memory_Model attribute value of "1" that is different than one previously seen ("2"); combining incompatible files,是神马意思?

  这个错误表明链接器所链接的目标文件中存在不同的内存模式,比如说有的目标文件使用了大内存模式,而有的使用的是小内存模式。修改的方法则是让所有的文件在链接时都使用相同的内存模式。

  事实上这种错误出现的场合并不算太多,主要出现在工程中引用了别人提供的某些obj文件或者库文件的时候。在C2000上,新建工程的时候推荐大家统统使用大内存模式(-ml)选项。

  47. Error: file grlib.lib" was built without VFP coprocessor support while a previously seen file was; combining incompatible files,是神马意思?

  这个错误与上面那个错误的原因是类似的,表明链接器所链接的目标文件中存在不同的浮点支持模式。修改方法则是让所有的目标文件和库文件使用相同的浮点支持--float_support选项。

  48. 为什么编译的时候总是提示Warning: creating output section "xxx" without a SECTIONS specification?

  在使用默认的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 的开发中,有几个场合特别容易出现此警告:

  ² 在新的编译环境中,使用了一个老版本的IQmath库文件。

  ² 在测试时,使用了老版本的编译器生成的Flash API。

  ² 在使用高分辨率的HRPWM模块时,使用了老版本的SFO库文件来修正MEP。

  这个警告总的来说并不影响程序的运行,我们即可以通过把老的库文件换成最新版本来彻底解决此问题,也可以在cmd文件中使用--diag_suppress=16002来消除此警告信息。至于16002这样的警告信息是如何归类的,在CCS的编译提示里就有:

  #16002-D build attribute vendor section TI missing in "c:/ti/ccsv6/tools/compiler/C2000_6.2.2/lib/IQmath.lib": compatibility cannot be determined

  52. fatal error: file .....rts2800_fpu32.lib" specifies ISA revision "C28FPU32", which is not compatible with ISA revision "C2800" specified in a previous file or on the command line。

  这个致命错误说明对某些不是FPU32的目标文件启用了--float_support=FPU32选项进行编译,例如这个目标文件是由不含有FPU的器件上的编译编译而来的时候就会产生,也有可能是这个目标文件没有使用FPU选项。解决的方法是:

  ² 如果导致错误的目标文件是支持FPU的,则使用-v28 --float_support=FPU32来编译所有的程序。在CCS中,可以把这个选项作为全局选项,或者预编译选项。

  ² 如果器件不支持FPU,则不要使用FPU32选项。这是因为在含有FPU的器件中,float类型的变量会传递到FPU寄存器中进行处理;而在不含有FPU的器件中,float类型的变量仍然会保存到栈中。

  53. Warning: entry-point symbol other than "_c_int00" specified: "code_start"。

  初学者经常会遇到此问题。事实上这个警告并不会对程序的运行产生什么影响,它只是用来告诉我们,程序的入口点被编译器给自动分配到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 "2" that is different than one previously seen ("1"); combining incompatible files.

  这个错误表明ISA版本这个属性不正确。其中,1代表C27x,2代表C28x。在使用C28x时,应该使用-v28这样的选项来使用C28x模式,而不应该再使用其它的兼容模式了。

  56. Error: placement fails for object "csmpasswds"

  在早期版本的CCS5.x编译器/链接器中,有这个问题,链接器会不停地提示相同名字的段被既保存在page0,又被保存在page1之中,直到我们把它们改好;这算是一个bug吧,升级编译工具codegen的版本,或者干脆升级整个ccs软件,就可以解决此问题。

  57. Warning: function declared implicitly

  虽然这只是个警告,但是它表明函数的原型不存在,编译器会对函数的参数和返回值做一些假设,这就是bug的一种源头,所以一定要把这个警告给消除掉。

c++相关文章:c++教程




关键词: DSP 编程

评论


相关推荐

技术专区

关闭