《MCSDK5.X中增加位置环》提及mc_position.c/mc_position.h
STM32G473 DRDY不置位?
stspin32G4这颗mcu里面集成的是哪一款G4?能不能用cubemx来进行配置
STM32G473是否支持硬件AES?
STM32G473VET6同时使用6个片上放大器(OPAMP)的PGA加外部偏置模式,引脚位置让差分信号走线分离,信号有无较大影响?
stm32G474的flash模式如何判定?single bank 和dual bank
STM32G474 ADC无法正常启动转换
STM32G474 HRTIM无法正常触发ADC
STM32G431RB,变量接受不到串口发下去的数据
foc电流环无法正确维持Iq在自己设定的数值。
固件包的CMSIS目录下docs->index.html-> cortex-M->reference->Intrinsic functions for SIMD instructions
根据你的描述和注释来看,SIMD的指令你可能用法错了,应该传入2个32的数,高半字和低半字分别是要平行加法的两个数,这样结果也是32位,我觉得是快一倍。具体你参照说明。
This function enables you to perform two 16-bit signed integer additions. The GE bits in the APSR are set according to the results of the additions.
Parameters| val1 | first two 16-bit summands. | | ------ | ----------------------------- | | val2 | second two 16-bit summands. |
Returns* the addition of the low halfwords in the low halfword of the return value.
Each bit in APSR.GE is set or cleared for each byte in the return value, depending on the results of the operation.If res is the return value, then:* if res[15:0] >= 0 then APSR.GE[1:0] = 11 else 00
Operation:res[15:0] = val1[15:0] + val2[15:0]
res[31:16] = val1[31:16] + val2[31:16]
[md]你好,我看了你的回复后,认为一个UADD16指令相当于进行了两次16bit加法,参数1的低16bit+参数2的低16bit以及参数1的高16bit+参数2的高16bit,最终两者的和放在返回值得低16bit和高16bit。
按照我的理解,我写了如下的测试代码:
1.用UADD16指令进行一次加法
__ASM volatile ("uadd16 %0, %1, %2" : "=r" (*(uint32_t*)(uiRes+0)) : "r" (((uint32_t)uiCal1[1]<<16)+uiCal1[0]), "r" (((uint32_t)uiCal2[1]<<16)+uiCal2[0]));
2.直接进行两次加法
uiRes[0]=uiCal1[0]+uiCal2[0];
uiRes[1]=uiCal1[1]+uiCal2[1];
两种代码的执行结果是一样的,测试了执行时间也是相同的,都是996ns,那岂不是执行速度是一样的吗?我哪里理解错误了吗?
[md]你的理解没错。但是两者还是有区别,用UADD16指令的话,内核一次读入2个数据,一次32位加完成2个16位加,然后再返回到存储器。如果用两次加法,要读4次,加2次,写回2次,这样从总时间上看是要更耗时,可以从反汇编看出指令的区别。我觉得要测试的话,需要循环多次,如果是UADD16的话,循环次数应该减半。如果是乘加指令,是_SMLAD,这个比较明显。
[md]你好,我试了一下100次for循环加法,UADD16确实只循环50次就算完了,但对比两种计算方法,UADD16只比直接运算快了2us,优势不是很明显
[md]其实不然,SIMD指令,一条指令相当于普通指令的2倍,时间开销也约节省一半
__ASM volatile ("uadd16 %0, %1, %2" : "=r" (*(uint32_t*)(uiRes+i)) : "r" (((uint32_t)uiCal1[i+1]<<16)+uiCal1), "r" (((uint32_t)uiCal2[i+1]<<16)+uiCal2));
因为我传给UADD16的参数本身就是个加法运算。。。
另外,你之前发的SIMD指令说明文档的链接能发我一下吗?我想看一下乘加的复合运算,SIMD指令怎么用,谢谢了
你好,我知道为什么我测试的结果是差不多快慢了
__ASM volatile ("uadd16 %0, %1, %2" : "=r" (*(uint32_t*)(uiRes+i)) : "r" (((uint32_t)uiCal1[i+1]<<16)+uiCal1), "r" (((uint32_t)uiCal2[i+1]<<16)+uiCal2));
因为我传给UADD16的参数本身就是个加法运算。。。
另外,你之前发的SIMD指令说明文档的链接能发我一下吗?我想看一下乘加的复合运算,SIMD指令怎么用,谢谢了
[md]感谢