关于CUBEMX死区模式使用?
用STM32G474 如何实现带同步整流管的BUCK 电路负载小的时候时提前关闭同步整流管的驱动功能?
使用IHM0003kit套件以及MCworkbench在生成代码时出现路径错误,具体的环境配置下面详细描述
STlink 在Cubemonitor中采样率
stm32g431cbu6,dac无法输出
ST的开发组件B-G431-ESC1 ,支持FOC有感吗?
SPI DMA发送不成功的问题
关于STM32G4 ADC同步TIM触发采样时间的疑问
B-G431B-ESC1开发板问题
st_link utility 报错 can not connect to device
固件包的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]感谢