This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28035我新装了codegen version 6.1.0想用C

Other Parts Discussed in Thread: CONTROLSUITE

以前用汇编做过CLA,由于汇编不怎么会用,现在想着改到C下来写,我新装了codegen version 6.1.0,库、头文件都设置好,复制例程中的 2806x_sin.cla 文件到工程中,编译结果出现以下问题:

1. Cla1Regs.MVECT1 = ((Uint16)Cla1Task1 - (Uint16)&Cla1Prog_Start); 提示 Cla1Prog_Start 找不到,extern Uint16 Cla1Prog_Start;这句我有,但是不知道Cla1Prog_Start 原始怎么定义的,我想可能是在.cla文件编译过程的汇编文件中吧,顺带问一下怎么能看到编译过程中生成的asm文件。

2. extern cregister volatile unsigned int IFR; 对这一句提示两个错误,cregister is not allowed on this declaration 和 unrecognized cregister name 'IFR' 。

3. 我发现codegen version 6.1.0里面没有–cla_support option in the Runtime Model Options,我使用6.0.1版本的时候使能过,现在找不到了。

急!!!请专家大侠逐条解答!!!

  • 我把CLAMath.lib文件包含到工程中了,也在File search path 中制定了路径,应该没有问题!

  • –cla_support 选项找到了在processor options下面

  • 楼主你好!

    对于CLA C的项目来说,Cla1Prog_Start是定义在.CMD文件中,而_Cla1funcsRunStart;编译器编译完自动生成.

    建议楼主,参考TI 的CLA 的C例程或或者在TI CLA 的C例程上修改,这样会比较容易。

    CLA 的支持在Processor Options中选择。

    _Cla1Prog_Start = _Cla1funcsRunStart;

  • extern cregister volatile unsigned int IFR; 对这一句提示两个错误,cregister is not allowed on this declaration 和 unrecognized cregister name 'IFR这一句呢!

    还有我就是参考TI 的CLA 的C例程,TI CLA 的C例程上没有28035只有28069的!

  • Cla1Prog :  LOAD = FLASHD,
                         RUN = RAML3,
                         LOAD_START(_Cla1funcsLoadStart),
                         LOAD_END(_Cla1funcsLoadEnd),
                         RUN_START(_Cla1funcsRunStart),
                         LOAD_SIZE(_Cla1funcsLoadSize),
                         PAGE = 0

    这是CMD文件中的定义,里面没有_Cla1Prog_Start,而以前我用汇编的时候汇编里有这样的定义!

    .sect "Cla1Prog"
    _Cla1Prog_Start
    .align 2

    所以我还是觉得实在  .cla 文件编译后的asm文件里面的,我怎么才能看到CCS4编译C文件过程中生成的asm文件呢!

  • 不同版本的例程里面的.cmd文件不一样。controlSUITE里面最新的F28035 CLA的例程为V126,楼主可以升级你的controlSUITE,然后可以在以下路径里面找到。

    C:\TI\controlSUITE\device_support\f2803x\v126\DSP2803x_examples_cla

    在.CMD文件中有下面内容,因此Cla1Prog_Start 是在.CMD里面定义的 。

    _Cla1Prog_Start = _Cla1funcsRunStart;

      ramfuncs            : LOAD = FLASHD,
                             RUN = RAMM0,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_SIZE(_RamfuncsLoadSize),
                             RUN_START(_RamfuncsRunStart),
                             PAGE = 0

     

    如果楼主要看编译过程中生成的.asm文件,请在按如下选择:C2000 complier-->Advanced Options-->Assembler Options里面选择Keep the generated assembly language(.asm) file(--keep_asm,-k)

  • 因为CLA编译器不支持cregister关键字,如果你的*.cla文件的头文件申明部分含有DSP2803x_Project.h或DSP2803x_Device.h的话,CLA编译器在展开此头文件的过程中,会在DSP2803x_Device.h里发现如下语句,进而报错:
    extern cregister volatile unsigned int IFR;
    extern cregister volatile unsigned int IER;

    一、我的建议是建立合理的软件项目结构和模块分类,CLA协处理器相关的c和h文件不要和DSP主核程序的c和h文件交叉使用,*.cla文件的头文件申明部分只含有和CLA程序相关的头文件,不要包含DSP2803x_Project.h或DSP2803x_Device.h。

    二、如果一定要包含,又不想引起编译错误,可以使用宏定义的方法:

    1. 在DSP2803x_Device.h中更改定义: 
      #ifndef CLA_FILE
      extern cregister volatile unsigned int IFR;
      extern cregister volatile unsigned int IER;
      #endif
    2. 而在*.cla中这样申明头文件:
      #ifndef CLA_FILE
      #define CLA_FILE
      #include "DSP28x_Device.h"
      //REMARK: #undef and #endif is added since CLA Compiler doesn't allow cregister keyword.
      #undef CLA_FILE
      #endif 

    这样的话,编译器在展开*.cla中的头文件DSP28x_Device.h之前先定义了宏CLA_FILE,在展开DSP28x_Device.h时就会忽略其中含有cregister的语句,在完成展开DSP28x_Device.h之后又会清除宏CLA_FILE的定义,不会对其他c文件中申明DSP28x_Device.h造成任何影响。

  • 今天更新了driver,从CLA例程里发现,其实,在头文件”DSP28x_Project.h“里,把头文件“DSP2803x_Cla_typedefs.h“前置到”DSP2803x_Device.h“之前,即可简易地解决该问题。

    因为在头文件“DSP2803x_Cla_typedefs.h“里有这样的定义

    #ifndef __TMS320C28XX__
    #define __cregister
    #endif

    这里定义了关键字"__cregister",这样的话,后面的头文件”DSP2803x_Device.h“中的寄存器定义语句

    extern __cregister volatile unsigned int IFR;
    extern __cregister volatile unsigned int IER;

    就不会出错了。