DSP编程技巧

40. 如何快速定位错误信息?

  在CCS V4及以上版本里,在编译、链接之后有一些错误和警告是包含有链接的,如下图所示。DSP编程技巧_第1张图片

  此时可以点击带下划线的超链接,从而显示出详细的错误信息,如下图所示。DSP编程技巧_第2张图片

  这个功能目前还没有非常智能化,例如下面的错误就没有更详细的提示信息。此时需要我们根据错误描述去尝试解决了。

  上面的错误解决起来也容易,它的意思是在链接器选项里使用了-l选项来引用库文件,却没有提供给它库文件的信息,所以就报错了。

  41. Warning: function declared implicitly,如何解决?

  这个警告是非常常见的,它表明在发生函数调用的时候,编译器发现函数并没有提前声明。因为这只是个警告信息,所以编译器会强迫自己来想象函数的参数和返回值,这样虽然有可能可以通过编译,结果却是存在隐患的,它会导致程序在运行时很难诊断运行时错误,甚至可能导致函数的输出与设计的功能完全不相关。

  然而你也可能会疑惑:一般大家都知道先声明再使用的原则,函数我已经在头文件里定义了啊?此时的问题是函数调用发生在头文件引用之前了,只要把头文件引用放在函数调用之前就能解决此问题,通常把头文件的引用放在调用这个函数的源程序的开头就好了。

  42. Error: could not open source file "xxx.h",如何解决?DSP编程技巧_第3张图片

  这个错误有点灰色幽默的感觉: 明明看到头文件就在工程列表里,我们双击也能打开它,编译器却就是死活不认识,还要报出什么致命性的错误。

  解决此错误可以使用下面的步骤:

  1. 检查头文件是否存在,并确认其名字是否正确。

  2. 经检查发现不存在上面的问题,则此时需要手动把头文件的路径指定给编译器。在CCS工程管理器中右键点击工程名,选择属性,并切换到头文件对应的选项卡,如下图所示。可以点击图中的方框框出来的+镜像添加,路径则即可以使用相对路径,也可以使用绝对路径,使用相对路径更容易方便工程的移动。DSP编程技巧_第4张图片

  注:上图中的ProjName是编译器中内置的系统变量,我们可以很方便地使用它们来构建头文件、库文件等的相对路径,如下图所示。DSP编程技巧_第5张图片



43. Error: option --include_path is missing its parameter 'dir',如何解决?

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

  这个错误的发生往往是编译器没有能够正确地解析包含变量或者宏的头文件的路径。解决方法可以利用上图中的Variables选项卡,点击Add,把自定义的变量添加进去,此时CCS会检查该编译器变量是否符合标准。

  44. Error: unresolved symbols remain,如何解决?DSP编程技巧_第6张图片

  出现这个错误说明链接器在符号表中找不到相关的符号定义。在这个例子中,源程序example中使用了函数myfunc,但是在编译生成的所有目标文件(.obj)或者所有的库文件(.lib)中都找不到这个函数。解决的方法自然是找到这个函数从哪里来的?然后把它的源添加到工程中。

  在使用Stellarisware或者ControlSuite套件中的例子来创建我们自己的工程时,如果忘了使用—library选项把库文件添加到链接器的路径里,则经常会出现此错误。这些库文件包括:Stellarisware/Tivaware中的driverlib, grlib, usblib,ControlSuite中的driverlib, IQMath等等。

  那么接下来的步骤就是添加对应的库文件了。最直接的方法是在工程属性里选择,如下图所示:DSP编程技巧_第7张图片

  此外,如果在C++代码中引用C代码的头文件,如果这个头文件是自定义的(而不是系统提供的),则最好在头文件中添加extern "C" {...}以方便在C++代码中方便使用#include来引用该头文件。那么问题又来了:C编译器不认识extern "C"怎么办?此时要使用#ifdef这样的宏来在C中屏蔽它们,即:

  #ifdef __cplusplus

  extern "C" {

  #endif

  45. Error: placement fails for section "xxx",如何解决?DSP编程技巧_第8张图片

  这个错误说明我们定义的段超过了指定存储器区间的大小。可以从以下几个方面来解决此问题:

  1. 检查栈和堆的长度,看看是不是给它们配置了过大的值,导致了在RAM中保存不下去?然后尝试减小它们的长度。

  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,有可能就彻底放不进去了。

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



你可能感兴趣的:(DSP编程技巧)