DSP常见编译错误

上传人:豆*** 文档编号:201738003 上传时间:2023-04-20 格式:DOCX 页数:30 大小:1,000.89KB
收藏 版权申诉 举报 下载
DSP常见编译错误_第1页
第1页 / 共30页
DSP常见编译错误_第2页
第2页 / 共30页
DSP常见编译错误_第3页
第3页 / 共30页
资源描述:

《DSP常见编译错误》由会员分享,可在线阅读,更多相关《DSP常见编译错误(30页珍藏版)》请在装配图网上搜索。

1、1.DSP编程技巧究竟有什么好资料? 话说专门进一步解说这个的资料并不是太多,由于大部分DSP书籍都是解说算法或者寄存器是怎么使用的,那尽量罗列一下(如有漏掉请在评论区补充),有: ()DSP 程序员高手进阶 这本书是当年笔者学习DSP的时候看了好几遍的,讲的非常进一步、透彻,可惜早就卖光了并且没有再版。需要的网友可以考虑去图书馆看看,图书馆里最不缺少的就是老版本的书籍了。()EEPW牛人业话 我们EPW首页的牛人业话里,已有大量这方面的总结了,链接太多就不一一列举了,请到中阅读。 (3)官方资料 最权威的固然还是官方资料,特别是TMS32Cx pizg CC+ CileUserue和TMS3

2、08x sebly LnguaTols sersGuid。局限性之处就在于,它们都像教科书,严谨有余,活泼局限性,特别是初入门的人看起来会比较累。 ()参与某些培训好的培训一般都是要付费的,这个要根据自己的实际状况进行取舍了。2. 答疑解惑哪家强? 经验的积累,除了自己努力的自学之外,有时候某些难关还是得有别人的协助才行,也许你花3天搞不定的问题,她一看就想起来是什么因素了。如果是公司客户,那直接联系官方技术支持,很容易就搞定了。或者也可以去官方论坛提问,然后等待解答。对于广大网友来说,直接获得技术支持也许有一定的难度。我们EW的论坛的人气充足,对问题的响应速度也是迅雷不及掩耳的,因此有关P的

3、问题尽可以到。 前面这两个无关具体技术,但是能起到 “源头”的作用。接下来就是具体的技术问题了,有几十个,我们慢慢来看吧。 3 作为入门者,创立一种最基本的工程需要做哪些事情? 最简朴的入门措施是从既有的例子上入手,例如购买开发板的话,一般都会附送十几到几十个上手用的例子工程,把它们研究一遍,基本上入门这关就过了。对于C DS的学习来说,先到TI网站上搜索ContolUIE软件下载安装,里面的入门视频、工程例子和所有的文档资料都是一应俱全的。如果你买书籍来入门的话,和教编程的书籍同样,大部分都还是以“Hel wrld”作为第一种程序入手,然后运营程序显示在调试窗口中的。 4.一种定点的8x起始

4、工程至少需要哪些文献和选项?1) 编译器选项:-v8 -l -mt g -pdr w2) 涉及man()函数的一种.c或者.cpp程序 ) 实时运营支持库文献rts200_l.lib ) 链接文献(.cmd)和头文献:一种小的入门工程,一般从别的工程里把它们复制过来就好了,例如可以从ControlSITE软件的目录下找到相应器件的。 5 一种浮点的C28x起始工程至少需要哪些文献和选项(启用浮点支持)? 1) 编译器选项:-v2 flat_suport=fu3 -ml -mt -g -pdr -w 2)涉及an()函数的一种.c或者.cp程序 3) 实时运营支持库文献rs28fu2.lb4)

5、链接文献(md)和头文献:一种小的入门工程,一般从别的工程里把它们复制过来就好了,例如可以从CtrolSITE软件的目录下找到相应器件的。 . 涉及LA和VC的器件,其入门工程需要哪些额外选项? 新器件层次不穷,短短几年时间,涉及控制律加速器(LA)和VCU加速器(用来执行高效 Viteri、复杂算术运算,1 位迅速傅里叶变换(FT) 和 CRC 算法)的器件已有几十种了,并且像CLA、VU这些技术还在迅速地升级中,如果要在代码中用到这些特性,就需要添加-clupporcla0和-vcu_supot=cu这样的选项。 7. 编译器选项有那么多中,典型的配备有哪些? C28x编译器的选项非常多,

6、我们用了很长的篇幅来解说它们。作为典型配备的话,对于28x的PU来说(一般我们把DS的架构划分为C+外设,更复杂的则尚有FU、CA、VCU等额外单元),常用的选项如表1所示。 注:如果一种选项没有别名,则代表在使用它的时候直接使用全名,如表1的第二列那样的形式。8.具有CLA加速器的PU必备的编译器选项? 除了问答4、5、提到的选项之外,APU对编译器也有一定的规定,如表所示。表 CLCPU必备的编译器选项9 “大内存模型”和“小内存模型”的区别是什么? 8x一般使用大内存模型,假设数据可以寄存在存储单元的任何可用空间中。小内存模型的提出其实针对的是基于C27x模式C的代码,它默认数据是寄存在

7、低64存储空间范畴内的,除非使用ar核心字进行特别指明。目前的P器件片上存储空间普遍比较大,显然使用大内存模型更为合理。1. 什么是“统一内存模型”?统一内存模型“-unifed_meor”指在“统一的内存模式”下产生代码。顾名思义,就是把所有的存储空间定义为一种整体,不管它是片上的SRAM、ROM、OP还是使用XINTF接口的外部的存储单元,一般把外设的寄存器也映射到数据存储空间中。这样编译器在编译时就可以使用PREADPWRIE/等指令来解决大部分的内存复制mmcpy调用和构造体的分派。 1. 实时运营库RT的作用是什么? 在计算机程序设计领域,运营时库是一种被编译器用来实现编程语言内置函

8、数,以提供该语言程序运营时(执行)支持的一种特殊的计算机程序库。这种库一般涉及基本的输入输出或是内存管理等支持。在DS的编程中,它们的作用是用来建立C/C+代码运营的环境,重要涉及如下几种方面:1) ANSI/ISO C/C+原则库。 2) C的输入输出I库。) 为主机的操作系统提供底层的O支持。 )DS的启动程序_c_int00(可参照)。 1. RS中函数的描述从哪里可以找到? 在问答11中,RT涉及了四大类内容。前面两者由于是原则/C+的内容,并没有在TI的文档中给出额外的阐明;此外,C+ L库和它们的API的使用也没有TI官方文档。此时我们可以参照原则/C+的书籍、资料、网页等。如果但

9、愿最权威的参照,可以查阅T提供的参照链接:1) TheStandaC+ Libra: Tialan Referece, Nili .Josuis,ddison-ese,IBN 0-2013796 2) he C+ Programing Langug (irdo peialEditions),ne Stoutp, Addisn-Wley,ISN 0-289-4or 021-703-5) C+onlineee a 4) 代码的静态检查工具 固然,作为DP的开发人员,高效保质地完毕代码工作才是最重要,上面那些书籍、链接,请慢慢研究吧。 1. 从哪里可以找到RS库文献?一般状况下,随S软件安装而提供的

10、RTS库文献都位于CCS安装目录中,编译器odgen相应的子目录中。例如,在新版本的CCS6.x中,C28x的编译器位于CCS安装目录下面的tosopierc_6.2.b中(根据编译器版本的不同,倒数第二个目录名字会有相应的变化)。 在老版本的CS中,RTS库文献被默认安装到操作系统的程序目录中,例如C:rgram FiTesInsrumentsCCode Geeation Tos5.2.4。对于其他某些特殊的库,例如U迅速运营支持库astRS,则在下载安装了FasRTS安装包之后,位于其安装目录之下的lb文献夹中,例如UastRTSV100lirts80_fpu32_fas_suplment

11、li。如果安装了cntroluit软件,则可以通过它内置的阐明或者搜索功能找到相应的库文献。 15. RTS库那么多,我们应当使用哪一种? 随着器件类型、特性的不断发展,目前在CS安装目录下叫RTSxxi的文献已经非常非常多了,那么究竟哪些是适合我们使用的呢?对于C8x器件,总结如表3所示。 表3 C8x DSP使用的实时运营支持库 16.已经启用了ts280_fu32h.ib,为什么还要用rts800_fpu32_ast_sppleent.lib?在具有FPU的器件上,如果在不启用-lot_supportfpu32编译器选项的状况下使用浮点数编程,那么它的运算还是P来执行的,执行效率就和从定

12、点CPU上直接使用浮点运营进行编程同样低;启用了-float_supporpu32编译器选项之后,浮点数的加法、减法、乘法等操作则有FPU来完毕,执行效率自然要高出诸多。 使用ts200pu3fst_suplemntb库的目的,则是为了调用DP的ROM中的数学表迅速计算某些数学函数,涉及aa、atan2、os、divion、irt、in、sinos、sqrt等。如果不使用rts280_fu2_spemet.lib库来完毕这些数学运算,则编译器默认状况下是使用原则CC+数学库里的函数来完毕这些运算的,效率自然不能和查找ROM中的数学表同样迅速。 那么CCS为什么不附带安装tRT库呢?这也许和在定

13、点D的使用中,IQmh库也不是附带安装是通用的道理吧,其他相类似的,某些信号解决函数库,例如FFT、IFFT等也不是CS安装的时候附带的,需要自己去下载安装支持程序。17. 如何把RT库添加到工程文献中? 如果使用命令行脚本的方式添加库文献,则使用-l 来添加即可。在图形化界面下,填加RT库文献的选项在不同版本的CS中是不同样的,在此把它们一一列出。 在CCS6x和5.x版本下:在工程管理器中的工程名上点击右键,选择poprties,然后切换到如下视图。 在CCS.x版本下: 在CCS33版本以及更低的版本下: 针对比S3.3更古老的版本:如果不习惯使用Ecipse样式的开发环境,或者某些仿真

14、器不兼容CCS4.x以及以上版本,或者你还在使用最古老的T2C33这样的芯片,否则至少应当升级到CC3.3这样的版本了。 . 在对库文献进行修改,或者使用不同版本的编译器时,如何重新编译库文献?在编译器版本不低于60.的状况下,我们可以直接使用编译器提供的工具来重新编译RTS库文献,即kli程序。如需使用此工具,请参照它的协助阐明文档。 在编译器版本低于60.的状况下,我们需要进入编译器coeen的库文献目录中,找到rtsrc.zp这个文献并解压,然后根据其中rssrc_zp_READMEtxt里面描述的环节进行库文献的重新编译。22. 除了使用编译器的优化选项之外,还可以使用什么措施提高程序

15、的性能? 编译器的优化选项,只能在代码满足众多选项的规定期,才干得到较好的优化效果。在我们编程的时候,一方面要做到心里有数,尽量使用某些高效的编程方式,例如使用右移操作替代除以2的倍数的操作,可以大幅度地减少代码运营时间等。这些技巧诸多是与C/C+的纯熟使用所有关的。此外,根据器件的特点,例如与否涉及PU、LA等,把特定的代码放在不同的区域执行,也能起到提高程序性能的效果;根据代码对性能的规定,把它们运营在不同的位置,例如RA快于Flash,Flah又快于XINF等;在器件涉及数学表的状况下,使用内建的数序函数库,而不是原则的C数学库等。在此我们可以给出某些提示: 1)代码运营在Fash中一定

16、要使能预读缓冲区,并配备合适的等待状态。一般在各个器件的头文献与外设示例包里均有相应的例子。 2) 把时间核心的代码和/常数数组等从Fla复制到AM中运营 在RA中运营时,最大的指令周期比lsh中运营时要高,其执行速度也要快出不少,因此可以根据需要把实时性能规定较高的程序复制到RM中运营,具体的措施和实例可以参照nning a Applcatio fromIntenal lash Mer o he S320F28xxxDSP。3) 评估代码和数据的存储地址的划分,并根据需要修改链接文献 i 如果某段代码和它所读取的数据位于同一种物理内存区间中,则由于它们使用相似的地址总线等资源,无法同步访问,

17、导致了资源的冲突,这会减少程序的性能,因此最佳把代码和数据保存在不同的内存区间中。 ii 等待状态(ait)会减少系统性能,由于P会执行过多的无用状态且在此期间无法解决别的任务:当CP读取或者访问存储单元或者外设的时候,该存储器或者外设有也许在C默认分派的时间内无法完毕数据的传播,此时就需要在CU的ready信号中插入等待状态,直到数据传播完毕才干让CPU继续执行别的任务。28器件上,大部分的ARA都是零等待的,但是在C233x器件中,有某些模块却不是,例如某些Flsh/OTP的访问等。 iii 如果在代码中大量使用两个数据缓冲区,则把两个数据缓冲区寄存在不同的RM模块中有也许会提高代码的性能

18、,由于大量读写同一块RM区间会产生更多的流水线停滞,导致性能的减少。 4) 使用编译器中的统一内存模式-uni_memory 此模式把所有的存储空间定义为一种整体,这样编译器在编译时就可以使用RT与RAD指令来解决大部分的内存复制调用和构造体的分派。 5)使用Flash和外部存储器如果代码需要在Fsh或外部存储器中运营,则在编译时启动me选项。它将严禁编译器使用迅速分支指令(SBF/B),转而使用一般的跳转指令(/)。BF指令在默认状况下是被启用的,它可以将跳转分支使用的指令周期从7个减少到4个,在零等待状态的AM中执行时,迅速分支指令的预读特性使得它较为高效,但是在非零等待的存储器中执行时,

19、SBF/F的预读反而导致了性能的下降,此时需要人为地对预读和等待进行规划。) 使用内联函数 在编译时启动内联函数功能,则编译器会自动把多次调用的函数进行内联,大大减少函数调用和返回操作所带来的开销。固然,根据“空间换时间”的原则,启动内联会增长一定的代码尺寸。2. 为什么一种char类型的数组中,每个元素都占用了1bit的地址? 这是由于在C28x上,字节(bte)和字(rd)是等价的:也就是说它们都是1位或者说16比特(bit)宽的,即sizof(int) = sieof(har)= 1。 4. sieof(n)=ize(char) =1貌似与ANSI原则是相违背的? 在ANSI/SO的C定

20、义中,zof操作符以字节形式给出了其操作数的存储大小。SI/I还规定,ief操作符取char的值时,返回值为1。由于TS2C2x中的字节是1位的,char也是6位的,因此sizeof的成果符合AS原则的。作为补充,选16位,而不是位或者别的什么位数作为car的宽度,重要是为了统一寻址的便利,虽然在某种限度上说这增长了一定的存储器空间占用,或者说挥霍了某些空间,由于它们在存储空间中制造了某些空洞。 25. 如果har是16位的,那么如何高效地访问8位的值? 可以使用_yte()和_vbe()这样的编译器内联函数。请参照。 2. 编译成果提示undfnd sybls,名字中涉及$符号,怎么破? 名

21、字中带美元符号的函数,例如FSMY, S$OL等,都是RT库里的内置函数,编译器提示我们这些函数未定义,表白我们没有把相应的TS库给加入到工程中,例如PY是数学函数,需要添加有关的数学库,例如U数学库等。 2.链接器提示“_c_it0 isnot defned”,怎么破? 在这篇文章中,已经分析了int0的含义。找不到c_in00的话,阐明我们漏掉了涉及它的TS库,例如rts20_m.ib、rs800_u32lib等待,这些RTS库的具体区别在答疑解惑的第15条中已有对比了()。 8.新版本的编译器中,pritf()/sprntf()函数貌似要使用更多的栈?这是由于prif()函数被重新修改了

22、,以支持多种级别的prntf格式阐明符支持和修正,以减少代码大小和总内存大小(涉及bss)。printf由srinf()间接调用,它使用一种0个元素的大小的局部数组。为了保存一致性,prif()始终都在使用这样大的内存空间,而编译器也在尽量避免使用allc()进行内存分派。与老版本所不同的的是,此数组此前是静态的,而目前它被保存在ss,而不是栈中;这样做的目的是,如果顾客使用CI/O,则她们往往会在使用合适尺寸的栈的同步尽量减小.bs的使用。9. 如果不需要prntf()/sprintf()的所有特性,怎么样才干减小代码体积?初学者往往使用prntf打印“Hello World”这样的方式来完

23、毕第一种DS编程的程序,这种措施虽然是非常直观明了的,感觉起来功能也是非常简朴的,但是一编译成果发现提示栈的空间不够,或者有“progam willot fit into aailabememory”之类的错误。这是由于原则的rinf()/sprif()提供了非常多的特性支持,导致了在DSP上实现时,产生的代码尺寸非常大。 此时我们可以根据需要调节不同级别的格式格式限定符,例如通过链接器的选项,我们可以指定-pritf_suppt=fll, minima或者nfloa, fl为默认参数,表达支持所有的格式;noflot不支持对浮点类型的数据的输入/打印,涉及%a,%A,f, %F,%g,%G,

24、%e和%E,支持其他的字符、定点格式等;miml:对数据格式的最小支持,只涉及了不指定数据宽度和精度标志的整形、字符型或者字符串,即只支持%,d,%o,%,s和格式。其具体含义可参照。需要注意的是,如果-ntf_suppot使用了不支持的格式,链接器并不能给出特定的实时运营库的错误提示,在使用时要仔细检查。 此外,如果不去指定链接器选项,我们也可以修改pritf函数默认相应的源程序_printfi.来实现类似的效果,它的途径一般在编译器的库函数目录下,例如ticcs6tolscoierc6.2.5libsrc。在此途径下,有个print函数相应的c程序,它们与链接器选项的相应关系如下表所示。

25、由此我们也可以看出,支持所有格式的rit的源程序的大小,达到了最小格式支持下源程序大小的23倍还要多。30.CS编译器与否支持任何工业原则? 1) 所有的TS支持的C语言原则: 89 (ISO/IE 9899:190,或者叫NS X.159-1989) C9 (ISOIE 9899:199). 不完全支持。 ) 不支持的C语言原则: C1(IS/I 99:) 3) 支持的C+原则:C8 (SOC 14882:1998)C+03 (本质是C+9的ug修复) )不支持的+原则:C+ TR1 C+11 (IO/IE 14882:) 5)IEEE-754 (SO/IECIEEE69)原则: I的AR和

26、DSP的/C+编译器支持32位和64位的二进制浮点数运算,可以支持IEEE5原则中大部分特性。 ) MIRA-CMIRC是由汽车产业软件可靠性协会(MIR,motorndtry softare riabiityasocato)提出的C语言开发原则,在控制有关的代码中是非常有用的原则,具体使用措施可参照。 )其他原则 在工业领域中,fety安全特性在某些应用场合中已经是规定必须具有的功能了,有关的原则涉及IEC0、TV认证等。目前已有一部分涉及硬件aety特性的DSP器件了;如果使用软件来实现这些特性,则目前还需要我们自己来编写代码以支持这样的特性。 31. CCS编译器对GC扩展的支持如何?G

27、NU编译器结合G支持许多原则ANSI/ISOC/+所不支持的特性。在开源应用和iu等开发中,GC的编译器gc和+等都被广泛使用。所觉得了保证对CC工具所开发的代码的兼容性,的编译器也支持某些C的扩展特性。目前支持的某些特性基本都涉及在GCC43中,可查看:。32. 如何理解有关编译/代码产生工具的已知问题,并获得最新进展? 老外喜欢用IBM的larQuest系统来报告bug并分享解决方案,我们可以使用TI提供的开放链接、查看分享解决方案等,其界面如下图所示:避开老旧的“老式”ug的最佳措施固然是定期升级编译器和开发环境了。通过配备,新版本的CC在启动后会自动检测升级并自动升级,这也简化了我们对

28、开发环境的维护工作。33. 链接文献中涉及那么多种段,有什么迅速辨认的措施? 把下面这个例子记牢就好了: / / Globl vaes y= .ess / niiavau2 & 7 =.cinit /intx = ; int =7; oid main() lon z;/ calvariable= .stac z = x + y; / Code = text 34. 为什么我们需要链接文献.cmd?为什么编译器不能自动分派存储空间并进行内存管理? 在操作系统存在的状况下,这些工作的确不需要我们耗费太多的心思。但是在嵌入式的DSP解决中,这样做的重要因素是解决能力和存储空间是十分有限的,必须要我们

29、进行一定的介入,例如我们需要考虑的因素涉及:)运营速度:在A中比在Flas中快,在lash中又比在外部存储器(使用XINF)中快。 2) 代码与否需要存储在非易失的存储器中(例如lsh)? 3)任务与否是时间核心的?例如需要把某个时间核心的IS被保存在lash中,然后运营时复制到里。 4) 某些R可被MA模块所访问,而另某些则不行。 ) 使用单独的物理RA模块来避免资源的冲突。例如,在C DS中,RAM模块都是在单个机器周期内只能访问一次的SARAM(SinglecessRAM)。 ) 资源与否位于外部存储器中? 7) 代码与否需要保存在涉及缓存或者预读的存储器中以提高性能?在CDSP中,我们

30、几乎见不到缓存或者预读的概念,它们一般出目前涉及ARM解决器的器件中。 8)存储器在程序空间、数据空间中与否具有等待状态?) 与否有需要被代码安全模块CSM所保护的代码?CM并不能保护所有的代码空间。以上这些因素,在我们编程时也是需要特别关注,甚至是较为头疼的事情,显然让编辑器去自动实现它们,在目前阶段是不也许的(除非编译器的算法有一天能实现一定限度的人工智能)。因此在现阶段,我们需要使用链接器命令文献cmd去描述每个段所需要使用的内存状况。如果我们没有把某一种特殊的或者自定义的段给指定到特定的存储空间中,则此时链接器会自动把它给分派到一种可用的存储空间里,这有也许会影响到程序的执行效果。因此

31、我们要启动编译器的-w选项,这样在在未定义的输出段被创立时,开发环境的控制台窗口中会产生有关的警告信息。35. 虽然可用的存储空间看起来比setion的长度要大,但是链接器为什么提示“laceent ais for obet”? 这种状况一般是由于段的空间的分派是并不是我们想象中的持续的一种紧挨一种,而是被编译器给“分块”管理了。在内存地址分派时,一种段需要完全适配到页(pa)中,或者从页的边界开始持续分派;为了满足这个规定,段在分派到页中时,也许无法完全运用某些页,导致内存地址中产生了间隙(hoe),使得实际所需要的内存空间超过了根据变量大小计算出来的理论值。编译器这样做的目的是为了优化数据

32、页(P)寄存器的加载,达到减小代码尺寸和优化程序性能的目的。例如,针对一种数组,如果数组的长度不不小于64字(wor),则编译器仅需安全地加载D一次就可以访问数组的所有元素;如果数组长度不小于4字,则在访问每6字的数组元素时,编译器仅需加载一次P,固然如果访问多种64字的数组元素则仍需要多次加载DP。 举例阐明: 在md里定义:RM1 : oigin = 0x0040,egth = 0x004 /* -chip RM lk M */ cmmbuf:RAMM PAGE =1 在minc里定义如下几种变量 ragma DATSECTION(sendT, ommuf)Uint16 send20; m

33、a DAT_STION(receT, commf)Uin16 ceT260; #pragma DTASTION(CntPR, combuf)Un32 CnR50; 表面上共需20+260+25=1020,mmbuf正好放得下.但ccs提示空间不够: (ruplacetfailsfor oject combf, si x47 (pag 1). Avaiabranes: RAMM1ize: 0x40 unused: 0x0x he: 0400)产生错误的因素是根据DP加载的原则,age被划分为4wd的小单元,而数组被存储在持续的、整块的单元上,未使用到的空间不会再分派给其他数组或者变量使用。因此1

34、6位20长度的数组实际占用了64*5=320 (4*4=256 FLAH| FLSH FLAS,PA = 0 措施三:完整分割法 这个名字有点古怪,它本质仍然是把tx分割,目的区域也可以有多种,但是当第一种区域就满足规定期,则只把它分派到第一种区域中,剩余的目前区域事实上未被使用到。 在实际编程实现时,这些措施仍然存在一定的限制,涉及:1在涉及控制律加速器CA的iccoo器件中,只有特定的内存区域可被CA所使用。 2. 在具有DM的器件中,并不是所有的内存都可被D所访问。. 一般状况下,SRAM都是单个机器周期内只能访问一次,但是0等待状态的。但在某些器件中,程序内存控制是涉及等待状态的,例如

35、在某些233x器件中,DMA可访问的数据空间是0等待状态的,但是程序控制是1等待状态的。这些SRM空间更适合纯数据访问类型的使用。37. 在cmd文献中,可以把持续的Flash模块组合为一种整体的区间吗? 答案是可以的。在Flas的烧写中,可以在同一时间被烧写的ash的最小长度被称为扇区(sctor),因此通过把我们的代码进行分区烧写,就可以把它们对齐到扇区。 F模块结合的措施一:直接合并法 以把两个Flash扇区组和为一种段为例: 合并前,两个扇区的定义是: MORY / / Invdul setors E ad F caled ut n he MEMORY description/.FAS

36、HF : origin =0x3100, lenth = 0008000 /* ochi FASH */ FLASE: igin 0x31800, enh = 0x008000 /*on-cip FLSH / . 合并之后的Flh区间为: RY / / Seors and Ferged itooe in the EMOR desriion / . FSH:origi=0x30000, ength = 0x010000/* onch FAS FLAS/ . 措施二:反其道行之,把段分派到多种ash模块中,与问答36的措施二是一致的,例如:SCIONS text: *(.text) LASH FA

37、SHH . 在md文献中,可以把相邻的AAM模块组合为一种整体的区间吗? 答案是可以的,措施与las组合的措施同样。 虽然这样做是完全没有问题的,但需要牢记SARAM模块都是单个机器周期内只能访问一次的,所觉得了优化程序的性能,最佳把代码给分区到不同的物理SRM模块中,这样可以减少大量读写操作中的资源冲突。39 对于SP/BIOS的工程,如何理解链接的信息? DSP/BIOS 的配备工具生成一种md文献,规定如何连接所有DSP/BIOS生成的程序段,并且默认链接至所有/+ 语言编译程序生成的程序段。 当从 RM 运营程序时,也许只需要这一种m文献就够了。但在当从Flsh中执行时,很有也许需要生

38、成且连接一种或多种自定义的程序段。 此外,任何配备片载Fla控制寄存器(例如,lash等待状态)的代码不能从Flh执行。我们也许需要从 RAM(而非Fa)中运营特定期间核心函数来大幅提高性能。 必须创立一种自定义cmd来解决这些我们定义的程序段。可以参照unnng ppicion fro neral Flsh Memoy on the TMS32028x DSP这个文档,其示例代码在。 需要注意的是,这些文档和程序与新版本的中所涉及SS/IOS并不是完全兼容的。此外,如果我们想使用第三方的操作系统,例如VxWork、s/S、INEGRITY等,则要根据这些R的特点进行内存的分派与管理。4 Er

39、or: ptio -inlude_ath is singts paaer di,如何解决?本文引用地址: 这个错误的发生往往是编译器没有可以对的地解析涉及变量或者宏的头文献的途径。解决措施可以运用上图中的Variabes选项卡,点击Add,把自定义的变量添加进去,此时S会检查该编译器变量与否符合原则。 44. Error: uresolved syml remin,如何解决? 浮现这个错误阐明链接器在符号表中找不到有关的符号定义。在这个例子中,源程序example中使用了函数yuc,但是在编译生成的所有目的文献(obj)或者所有的库文献(.)中都找不到这个函数。解决的措施自然是找到这个函数从哪

40、里来的?然后把它的源添加到工程中。 在使用Stelarise或者trolSute套件中的例子来创立我们自己的工程时,如果忘了使用librry选项把库文献添加到链接器的途径里,则常常会浮现此错误。这些库文献涉及:Stelarisware/Tivaware中的riverlb, grib, ublib,ContoSute中的driveli, IMth等等。 那么接下来的环节就是添加相应的库文献了。最直接的措施是在工程属性里选择,如下图所示: 此外,如果在C代码中引用C代码的头文献,如果这个头文献是自定义的(而不是系统提供的),则最佳在头文献中添加extn C .以以便在C+代码中以便使用#ilude

41、来引用该头文献。那么问题又来了:C编译器不结识exten C怎么办?此时要使用#ifdef这样的宏来在中屏蔽它们,即: #if_cluslusexter C #end 5. Eror:pcent fail for setin xx,如何解决? 这个错误阐明我们定义的段超过了指定存储器区间的大小。可以从如下几种方面来解决此问题:1. 检查栈和堆的长度,看看是不是给它们配备了过大的值,导致了在RM中保存不下去?然后尝试减小它们的长度。 2.尝试使能或者增长编译器的优化级别,未经优化的代码往往需要更多的存储空间。3. 如果使用了/O代码,则它们会明显增长代码尺寸,例如在诸多小容量的器件上,一种pri

42、ntf()函数就能超过存储容量了,此时可以使用rn()的最小格式,请参照。 .可以考虑修改cd文献,以增长某个段所使用的存储空间的长度;代价是别的存储空间的长度会相应减小,有也许导致新的placemenfai这样的错误产生。具体可参照。 5. 尝试精简/优化代码,在不影响功能的状况下,使用某些编程技巧来减小代码尺寸。 例如,我们可以使用“空间换时间”,或者“时间换空间”的措施,在代码尺寸和执行速度上做某些折衷。例如对于一种滑动傅立叶变换(sD),我们既可以使用很大的数组来保存滑动值, 从而实现很高的运算速度;也可以减少运算速度,每个周期只使用几种点来完毕计算,这样可以极大地减小存储空间的占用。

43、 不到万不得已,不要去考虑更换芯片。 但是如果在产品开发的评估阶段,存储空间就已经捉襟见肘了,则还是要提早考虑升级芯片的,否则后来再增长新的功能,或者哪怕是仅仅修正了一种小的u,有也许就彻底放不进去了。6. TagMemy_Model attribute valueo 1 tha is ferntta one reviosl se (2); ombiing incompatible e,是神马意思? 这个错误表白链接器所链接的目的文献中存在不同的内存模式,例如说有的目的文献使用了大内存模式,而有的使用的是小内存模式。修改的措施则是让所有的文献在链接时都使用相似的内存模式。 事实上这种错误浮现的

44、场合并不算太多,重要出目前工程中引用了别人提供的某些obj文献或者库文献的时候。在上,新建工程的时候推荐人们统统使用大内存模式(ml)选项。 47.Error:file rl.ib as bilt wthoutVFPcpoesor spprt whil apeviously een files; cobining ncopatile files,是神马意思? 这个错误与上面那个错误的因素是类似的,表白链接器所链接的目的文献中存在不同的浮点支持模式。修改措施则是让所有的目的文献和库文献使用相似的浮点支持-flo_supo选项。 48. 为什么编译的时候总是提示Wrning: creatingut

45、putsctio x whoutaSETIONspeciaton? 在使用默认的cmd文献进行编程,而工程中有使用了某些cm中未明拟定义的段的时候,就会浮现这个警告。由于没有在cmd中定义这个段,因此链接器会使用默认的算法来创立和分派输出段“XXX”;这样虽然能保证程序的工作,却不被建议这样做,由于它不利于内存地址空间的有效分派和管理。一般来说,最佳不要有任何的链接器警告,以消除程序运营时潜在的bug。 .莫名其妙的gmake: ccess denie。 在编译程序的时候,编译器会生成一系列的中间文献,涉及bj、lib、a等等,这个过程被某些带有积极防御系统的杀毒软件和安全软件当作危险行为,因

46、此就被严禁掉了,导致编译失败,如下图所示: 因此在编译程序的时候,最佳禁用安全软件,否则虽然是安全软件没有直接制止编译,也会跳出多种各样的询问信息,不胜其扰。 50 Typexyzr Syboabc ou not e eolved。 这些错误一般是由Eis CDT(CC+开发工具)错报出的,而不是由TI自身的编译器所给出的。目前的解决措施是: 从CSv4的工程升级到CS5或者更高版本的时候,如果选择的是project-导入工程,一般会有一定的兼容性问题,也许会产生这样的错误。解决方案则是创立一种新的工作区,然后把所有的源程序、库文献、cmd文献等导入到新的工程中,重新配备工程选项,然后再编译。

47、 或者干脆忽视CDT的语法错误,措施是在CCS中点击indo-Preereces-enerl-Editos-TeEdits-nnotatin, 选择C/C+ Inde Mrkers,然后清除掉所有的选择。 51arnn: build attriu vndrsction TImssin i : compaibity cano bdernd。是什么属性丢失了? 浮现这个问题,阐明使用的库文献是由一种老版本的编译/链接工具所创立的,在使用新版本的工具进行编译/链接时,这个老的库文献缺失了某些属性,导致了这个警告的产生。在CDSP的开发中,有几种场合特别容易浮现此警告: 在新的编译环境中,使用了一种老

48、版本的Qmath库文献。 在测试时,使用了老版本的编译器生成的Flh API。 在使用高辨别率的HRPWM模块时,使用了老版本的SFO库文献来修正MEP。 这个警告总的来说并不影响程序的运营,我们即可以通过把老的库文献换成最新版本来彻底解决此问题,也可以在cmd文献中使用-diagupess1002来消除此警告信息。至于1602这样的警告信息是如何归类的,在CS的编译提示里就有:#1600-D uil atribu ndorsetionTI missg in c:/ti/csv/toolscomiler/C2.2libImth.lb: compaiiity cannot be dtemined

49、 52. ftal eror:file.rs20f32.ib spcfeISA rii C28FPU32,which i not compatil i ISA revisio C280 pecfd ia previus fle or oe commandln。这个致命错误阐明对某些不是32的目的文献启用了-floasuotFP32选项进行编译,例如这个目的文献是由不具有FPU的器件上的编译编译而来的时候就会产生,也有也许是这个目的文献没有使用U选项。解决的措施是: 如果导致错误的目的文献是支持FPU的,则使用-v8 -flatsupprt=FPU32来编译所有的程序。在CC中,可以把这个选项作

50、为全局选项,或者预编译选项。 如果器件不支持FP,则不要使用FPU32选项。这是由于在具有P的器件中,flot类型的变量会传递到FPU寄存器中进行解决;而在不具有F的器件中,foat类型的变量仍然会保存到栈中。 5Wrin: entry-poin ybo ote thn _c_nt00 specified: _strt。 初学者常常会遇到此问题。事实上这个警告并不会对程序的运营产生什么影响,它只是用来告诉我们,程序的入口点被编译器给自动分派到codest,而不是默认的_cnt0中;它们的效果是同样的,含义请参照。TI提供的外设例子在编译时也常常会产生此警告。 4. rrr: ureved sy

51、bols ein. 符号D$MY、FD$T之类的找不到,这样的问题也是初学者常常遇到的。这样的问题阐明有关的库函数被使用了,但是库并没有被添加到工程之中。例如,在程序中使用了c = Idiv(,b);这样的程序,但是并没有把IQmath.lib添加到工程中,则IQdiv就会被提示nsved这样的错误,解决措施则是把相应的库文献添加到工程里就好了。 特别阐明:带有两个美元符号$的函数一般都是实时运营库RTS里的,一定要记得添加相应的RTS库文献。 5. Errr: Tg_ISAattribute vle of 2 that isifrenttha one reviul een (1); cmin

52、g inompatibl fles. 这个错误表白ISA版本这个属性不对的。其中,代表C27,代表C28x。在使用28x时,应当使用-v28这样的选项来使用C2x模式,而不应当再使用其他的兼容模式了。 56. Ero: laceent fails for objec csmpsswds在初期版本的CCS5.x编译器链接器中,有这个问题,链接器会不断地提示相似名字的段被既保存在age0,又被保存在pae之中,直到我们把它们改好;这算是一种bu吧,升级编译工具coge的版本,或者干脆升级整个s软件,就可以解决此问题。 5. Wning: unctiondeareimpicy 虽然这只是个警告,但是

53、它表白函数的原型不存在,编译器会对函数的参数和返回值做某些假设,这就是bug的一种源头,因此一定要把这个警告给消除掉。58. 为什么一种看起来很简朴的程序,链接的时候却要耗费很长的时间? 导致这种现象的最重要的因素是类型合并(typmergi)。那什么是类型合并呢?举个简朴的例子,在头文献tyes中定义了构造sss,且所有的.c中中都引用了这个typeh。因此在编译之后,描述ss的调试类型信息被涉及到每个目的文献之中(除非使用了-smdebug:o来禁用调试信息),因此在链接的时候,链接器会发既有诸多种sss类型的副本;默认状况下,链接器使用类型合并把这样多sss类型合并为一种,从而使得最后输

54、出的ot文献中只有一种ss类型,而不是诸多种反复的副本,达到减小代码尺寸的目的,并且使得CS在加载o文献时也会耗费更少的时间。然后,类型合并这个过程中需要大量的计算,因此导致了链接看起来需要耗费很长的时间。解决的措施有两个: 1禁用类型合并:使用链接器的-选项(含义请参照)。这样做的成果是链接的时间变短,但是.ot文献变大,需要更长的时间来加载;如果在这个例子中ss的副本非常多,有也许需要很差的时间来加载out文献。 2. 使用-sebg:ne选项来完全严禁把调试信息写入o文献。这样做既可以减小链接时间,又可以减小out的尺寸和缩短加载时间,但后果是代码的调试功能被大大削弱了。 9. 如何使用

55、一种.md文献在具有不同的内部存储空间的芯片上来实现段的优先级? 假设有下面的状况:器件有64b迅速的内部存储,而器件2有28kb。目前我们有4个核心的代码段: .tet:_ :20kb .text:_b: 3b .t:_c :20kb .text:d : 1kb 其中段a的运算重要性最高,段的次之,以此类推。 给片内的迅速存储器命名为RAM,而片外的慢速存储器命名为DAM。假设在器件上,我们必须把.text:_a和.text:_b保存在IRAM中以保证运营速度,而.ext:_c和.text:_d则既可以保存在IRAM,也可以保存在S中。在器件2中,由于片上存储明显增大,可以把abc四个段都保存在DM中。此时我们可以使用下面的方式,使用同一种cmd

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!