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.

CLA除法运算问题



大家好,我想请教个问题,我现在使用28035的CLA模块,在做除法运算时出现问题,在cla模块中大概的代码如下:

res1 = 123/10;这个代码可以运行,通过仿真器可以观察到结果,但是

res = 10;  res1 = 123/res;时出现问题,res1的运行结果为0.0.请问这是怎么回事?变量所在的RAM区没有问题,实在很困惑,请高手指点一二

  • res 的数据类型是什么?  

  • 请确认定义变量为float类型,或者常量写成10.0的形式,参考例程的相关处理。

  • 试过了,问题依旧,很奇怪的问题,我还遇到类似的问题,PI控制输出限幅,经过if语句后,就是没有输出,始终结果都是0,很奇怪的现象。CLA对C语言的支持是不是特别有限。

  • 你是在哪里查看的变量结果?如果在expression,请确保你已经将内核选定在CLA而不是C28x CPU,另外,你可以在memory窗口里直接输入变量的地址查看内存。

    CLA对C语言的支持请查看发下wiki链接:

    http://ap-fpdsp-swapps.dal.design.ti.com/index.php/C2000_CLA_%27C%27_Compiler_Prototype#C_Language_Restrictions

  •  你好,我选择的确实是CPU,但是可以查看变量的状态,同时,当我变换一些代码时,即使是从CPU中查看的变量,也可以看出变化来。另外,当我观察不到变化时,我的机器实际工作中PI也确实是没有输出的。

  • 您给的链接我打不开,CLA的文档我也看了很多,本来以为驾轻就熟,没想到这个用起来还是有很多陷阱。看似代码没问题,实则有问题。

    PIDout = (Vvars.Out <= Ivars.Out)?Vvars.Out:Ivars.Out;这个代码有时候不工作,换成if语句逐个判断就能工作。有时候是相反的。

    还有,有时候逐个的if语句不能工作,if else能工作,真的是特别奇怪。

  • http://processors.wiki.ti.com/index.php/C2000_CLA_C_Compiler#CLA_C_Language_Implementation

    不好意思,刚刚这个是内部链接,这个wiki应该是可以的。更多资源可以查看:

    http://processors.wiki.ti.com/index.php/Category:Control_Law_Accelerator_for_C2000

    http://processors.wiki.ti.com/index.php/Control_Law_Accelerator_Resources

    http://processors.wiki.ti.com/index.php/Control_Law_Accelerator_(C2000_CLA)_FAQ

    http://processors.wiki.ti.com/index.php/Control_Law_Accelerator_(C2000_CLA)_Debug_on_CCS_FAQ

    CLA它并不是C28x这样一个通用的CPU,所以确实有比较多的限制,对于上面的语句,建议使用更高效的专用汇编指令完成,而你实际是使用TI提供的C/C++ Compiler Intrinsics函数,参考编译器手册的Table 10-1. C/C++ Compiler Intrinsics for CLA.

  • 感谢您的耐心解答,之前我也想过用汇编来实现,后来查看了编译器手册,我也尝试过用__maxf32()和__minf32()来完成限幅工作,但是事与愿违,使用这两个语句依然无法工作!糟心吧,本人表示很糟心,最后用if语句逐个比较大小实现的。

  • 对了,我忘了说一个很重要的信息,就是当我环路里只有电压环工作的时候,是没问题的,后来加了电流环,两个环都出了问题,PI没有输出,后来才动的PI限幅代码,就可以了。我把编译器也升级到了最新版本了,问题依旧。

  • __maxf32()和__minf32()就是用来实现限幅功能的,所以可能还需要你提供更多的详细信息方便定位问题在哪里。很多其他用户都在使用,肯定是没有问题的。

    关于环路控制,可能需要你单步调试去查看每一个的执行结果具体在什么时候开始出问题的。另外,你自己可以查看一下控制时序上是否存在问题。


  •  你好,感谢回答!我今天发现一个问题,我升级了编译器之后一直有一个警告,我没有重视,今天看了一下,

    .scratchpad 这个段我在CMD里面没有定义,我查了一下,是CLA的一个栈。我问下,如果没有这个栈,会不会产生类似的问题?
    我今天搞了一下,电流环误差赋值操作没有完成,我把.scratchpad这个段加上后,就没事了,如果是这个原因就太好了。另外,
    有没有相关的资料详细介绍编译器和这个段的关系或者作用机理的?
  • .scrachpad就是CLA的堆栈,就像C28x的.stack一样,它主要用于C语言模式下,存储临时变量(局部变量)和进行函数调用和中断时的现场保护,因此必须有它才可能让CLA正常工作。有可能你的问题是因为添加更多函数以后,导致它的大小不够,程序运行才异常的。你可以在未定义之前查看一下生成的.map文件确认一下分配情况验证这一点。

    关于它的详细介绍,在之前提供的wiki链接里是有的,同时有编译器手册里搜索关键字也可以找到。

  • 非常感谢你的耐心解答!

  • 您好,请问您的问题是如何解决的?