这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » DSP编程技巧:揭开编译器神秘面纱之处理器选项

共1条 1/1 1 跳转至

DSP编程技巧:揭开编译器神秘面纱之处理器选项

专家
2013-12-27 17:09:39     打赏

  也许你已经熟练使用了CCS好多年,可是当某一天出现一个与cl2000有关的错误的时候,突然间也摸不着头脑了;例如使用老版本的还不支持C2000 FPU的CCS来编译28335的程序,cl2000就会提示你各种不支持然后报错不运行了。Cl2000.exe是神马?

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

  Cl2000.exe就是和我们的程序编译密切相关的编译器了,使用的方法是:

  cl2000 [编译器选项] [需要编译的文件] [--运行链接器 [链接器选项] 目标文件]]

  使用方法看起来很复杂,还好CCS已经帮我们调用它了(或者说CCS就是一个框架,它完成的编译、调试、链接等功能几乎都需要调用一些别的exe来执行,所以你可能体会过升级了一些库文件、编辑器版本等,界面文件等却不需要进行任何的更改),这些句子会显示在工程的属性里面。当然如果你想亲自体验一把,也可以在ccs安装目录下面的tools\compiler\c2000_6.1.5\bin下面找到它,即cl2000.exe,然后用命令行的方式运行起来)。举个简单例子:

  cl2000 -v28 symtab.c file.c seek.asm --run_linker --library=lnk.cmd

  --output_file=myprogram.out

  在上面的例子中,如果需要编译的文件,例如几个.c或者.asm找不到,CCS就会提示xxx.c或者xxx.asm找不到或者未定义了;或者你改了目标文件的名字,例如改成了a.out,但是加载程序到DSP中的时候却仍然使用更改前的b.out,自然有可能出现预料之外的结果了:在以前帮助网友解决问题的时候,确实出现过这样的状况。

  明白了编译器的调用方法之后,我们就更进一步,揭开编译器中形形色色选项的神秘面纱,从此看到编译器提示的形形色色的警告和错误不再用发怵。

  具体说来,编译器的选项有多大20个大类,超过一百个具体的选项。当然这些选项是有轻重之分的,有的是必须用到的,例如支持一下FPU等功能;有的则是不常接触的,例如MISRA这样的汽车工业软件可靠性检查,只有在对软件进行标准化时才会用到。所以我们首先看一下最常用的选项,例如处理器的选项,它们的意义在于定义了在编译程序时CPU的模式。补充一点是,cl2000的帮助里看到的选项都是很长的名字,在CCS里面为了书写方便(因为选项框就那么点面积啊),一般用别名来代替;没有别名的则直接使用选项名字。

处理器选项

别名

含义

--silicon_version=28

-v28

C28x架构的产生目标文件;不选择的话模式为C27x模式,也可以选择为C2xLP兼容模式(例如让C28CPU支持C24的汇编语句,存在较多的兼容性问题,因为寻找模式、CPU架构等都发生了一定的变化,有的指令不再适用于新器件)。后两种模式大部分网友都几乎不会用到,所以我们的选项里面一般都会选择-v28。更详细的信息可以参考CPU介绍和汇编编程指南。

--large_memory_model

-ml

产生大内存模式下的代码。开启这个选项的话,会强迫把整个地址空间当作一块完整的22位宽的空间(实际是分为16位宽的低地址和超过16位宽度之后的高地址空间的),从而使得寻址时使用的指针也是22位的(这个指针是针对CPU寻址来说的,不是我们C程序里用的指针),这样寻找空间就不必局限于216次方,即64K了。这种模式适合在C++编程的时候使用,使得编译生成的代码可以访问超过16位宽度的地址空间的存储单元,这样就没有64K字的空间限制了。

那么为什么在在C++编程时使用呢?是因为目前不支持C++的关键字far;如果你了解C++关键字的话,那用同样的思路来理解这个模式就容易了。

此外,在开启的情况下,大内存模式是必须开启的,否则编译器会报错。

在新建C2000的工程,需要添加相关的库文件的时候,如果你再看到有的库是rts2800.lib,有的是rts2800_ml.lib,这次应该明白改用哪个了吧。小建议是为了省事和保持兼容性,没有别的顾虑的话就把这个选项打开吧。

--unified_memory

-mt

统一的内存模式下产生代码。顾名思义,就是把所有的存储空间定义为一个整体,这样编译器在编译时就可以使用RPTPREAD指令来处理大部分的内存复制memcpy调用和结构体的分配(它也不用“担心”存储空间突然出个断层,没法连续寻找了)。例如像下面的汇编指令就可以得到更加高效的执行:

MOVL XAR7, #Array1   ;XAR7指向数组1

MOVL XAR2, #Array2   ;XAR2指向数组2

RPT #(N-1) ;重复执行下一条指令N

||PREAD *XAR2++,*XAR7 ;Array2[i]=Array1[i],i++

这样的一段汇编代码我们可以直接手工编写;如果你有个for循环的C代码的话,看一下编译生成的汇编代码,是不是几乎一模一样的?

--cla_support[=cla0]

--cla_supportC2833x系列之后的Piccolo系列才有的特性,叫控制规律加速器,意思是把一些与控制系统性能息息相关的代码放到CLA中独立运行,不占用CPU时间,这样整个控制软件的运行速度都得到极大提高,从而保证实时性。

--float_support={fpu32|softlib|fpu64}

在启用了-v28-ml的前提下才能使用;含义是启用软件处理(比如调用一些优化好的库函数)、32位或者64位的协处理器进行浮点运算,从而支持相关的汇编指令。

这这个子选项是不能同时使用的,即使用方法为:

--float_support=fpu32

或者--float_support=fpu64等。

需要补充的是,这里的64位浮点运算指的数据类型是long double,而实际上28335这样的目前只硬件支持32位的FPU运算,64位的浮点运行要经过CPU折算再送给FPU处理的,所以不是必须的话尽量不要使用FPU64这样的运算。

--vcu_support[=vcu0]

VCUF2837xD这样的高端芯片上具备的功能,指的是Viterbi and complex unit (VCU II) accelerators,即通过采用viterbi 复杂单元 (VCU II) 加速器执行振动分析来更好地预测电机故障,振动信号的来源是加速度传感器或者振动传感器等,可以使用流行的MEMS,可以贴在电机的外壳、编码器等部位。如果需要使用这个功能的话,就需要在编译器选项里面打开它。




关键词: FPU     CCS     DSP     编译器    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]