|
发表于 2024-4-1 21:43:36
|
显示全部楼层
本帖最后由 梁工 于 2024-4-1 22:15 编辑
研究了一晚上,指令都比较齐全。
有点疑问:
加法运算没有说明是否有符号,没看到“32位有符号加法”这样的描述,
大部分加法计算都是要带符号的。
当然,能区分有符号、无符号是更好的。
乘加运算一定要是有符号的加法运算。
还有,用户编程一般都是C语言,具体怎么使用呢?
比如我要执行下面的8阶数字滤波算法,其实就是有符号整数乘加运算,每次循环(2阶)计算5次有符号整数乘加运算,8阶就是4*5=20次有符号乘加运算:
#define ORD 8 //滤波器阶数, 必须是偶数
long edata Xin[ORD/2][3];
long edata Yout[ORD/2][2];
long edata Coef[(ORD*5)/2]; //A0 A1 A2 B0 B1
long edata out;
long code Coef[20]={ //low pass, fc=250/8192, 8阶巴特沃斯
252, 505, 252, -54201, 22446,
259, 518, 259, -55533, 23803,
271, 543, 271, -58173, 26492,
289, 579, 289, -62026, 30417
};
//========================================================================
// 函数: void filters(u16 adc)
// 描述: 8阶滤波函数. 30MHz计算时间: 19.2us或20.8us @30MHz.
// 参数: adc: 当前采样值.
// 返回: none.
// 版本: V1.0, 2020-9-8
//========================================================================
void filters(u16 adc)
{
u8 p;
out = (long)adc - 2048; //输入ADC值为12位无符号整数, 转为32位有符号整数
for(p=0; p<ORD/2; p++)
{
Xin[p][2] = Xin[p][1];
Xin[p][1] = Xin[p][0];
Xin[p][0] = out;
out = (Coef[p*5+0] * Xin[p][0] + Coef[p*5+1] * Xin[p][1] + Coef[p*5+2] * Xin[p][2] - Coef[p*5+3] * Yout[p][0] - Coef[p*5+4] * Yout[p][1])/32768; //@30MHz, 整数计算1次乘加运算0.56us.
Yout[p][1] = Yout[p][0];
Yout[p][0] = out;
}
}
这是STC32F12K54的程序,不知道C251编译后,是怎么调用上述的DPU指令的?
|
|