首先是
@dontium 。共同讨论C2000系列中的CLA的一个计算方法。
图片截取自网络。其中第一项是比例项,第二项是积分项,第三项是微分项。对应的系数是kp,ki,kd。然后根据这个表达式的恒等变换可以得到最后一个表达式。如果计算第一个表达式。每次需要三次减法,三次乘法,两次加法可以得到计算结果。但是使用最后一个结果只要使用三次乘法和两次加法。可以得到结果。从直观来看这样子似乎会比较省步奏。
但是实际上还有点问题。CLA还有个并行指令的功能。对于寄存器操作的加减乘法都可以有并行的移动指令。用dontium 的方法多出来的三个减法指令都可以加入并行的移动指令所以还是10个指令完成。
附上今天写的cla程序。手边没有单片机不好试。可能会有流水线冲突问题。
- MMOV32 MR1, @_deltTK2
- MMOV32 MR2, @_deltTK1
- MMOV32 MR0, @_deltT
- MMPYF32 MR1, MR1, @_KC1
- MMPYF32 MR3, MR2, @_KB1
- MADDF32 MR3, MR3, MR1
- || MMOV32 @_deltTK2, MR2
- MPYF32 MR1, MR0, @_KA1
- MADDF32 MR3, MR3, MR1
- || MMOV32 @_deltTK1, MR0
复制代码其中deltTK是从c28X内核算出来的当前误差。所以就相当于少了两个指令,所以还是很dontium的速度是一样。
程序还没调试程序很可能有流水线冲突问题。
另外还有两个小问题希望请教下@dontium 大哥
1像MMOV32 MR1, @_deltTK2
MMPYF32 MR1, MR1, @_KC1
这样的指令是否会不满足流水线操作问题。 乘法从MR1中取数据,是否不是上一个指令从deltTK2中取到的值?
2如果我有某几个参数是保存在flash里面。然后开机后复制到ram里面运行。同时这个数据我会更新他,并且要求掉电保存。
我的想法就是把他更改后的数据写到这个参数在flash保存的地址上。这样就能实现掉电保存了。但问题是我如何获得这个数据在flash中保存的位置。