CubeAI生产keil代码时出现报错。这个ai_platform.h文件在什么地方?
adc采集电压
STM32G474的HRTIM和高级定时器有什么区别
LL库变成黑色,不能用,怎么回事
按照文档标注ADC最高输入时钟为60兆, 将主频配置为120(原来是170M),AD再进行1分频/2分频/4分频,对应的转换位数12位,采样周期2.5,对应的频
关于stm32g431串口与FDCAN数据不同同时处理问题
STM32G431的CAN控制器在收发器开路后,程序发送数据后,TX高电平。RX低电平。
在使用FDCAN控制器发送字节有问题
keil无法对G474CBTx扇区擦除烧录较大程序是什么原因?
关于CUBEMX死区模式使用?
固件包的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]感谢