
STM432G4单片机IAP程序+上位机
关于STM32G474 双BANK的测试问题
STM32G473 flash擦除时程序卡死
STSPIN32G4内部驱动电压输出问题
comp输出用于tim1刹车,消隐源和pwm输出是不是得是同一个TIM?
STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?
workbench6.3.2生成的代码,无法用pilot电机参数识别,无法通讯
stm32G474的flash模式如何判定?single bank 和dual bank
STM32G474高精度定时器HRTIM配置死区互补PWM极端输出问题
hrtim里update reset和reset update同时打开不会互相激励吗,另外为什么现在定时器周期值不用-1了
固件包的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]感谢