ercircle
发表于 2025-9-3 11:46:02
水水水木木木 发表于 2025-9-3 11:41
所以是不是要换支持MDU32的单片机?支持MDU32的单片机型号不多,最强大的应该是STC32G和AI8051U了吧?为 ...
提升主频到44.2368,可以测到875ns。需求是多少呢?Ai8051U系列是可以兼容8bit和32bit,且支持MDU32
ercircle
发表于 2025-9-3 11:50:44
水水水木木木 发表于 2025-9-3 11:45
8051还能优化啊。这我第一次知道。这个等级一般建议多少?7级吗?我是默认的0级测试的。你用我的语句测试 ...
我是在7级测试。
//7.62us@44.2368MHz
//half_cmd = ((int32_t)SWING_HW * (uint16_t)M_q15) >> 15;
//875ns@44.2368MHz
half_cmd = ((uint16_t)SWING_HW * (uint16_t)M_q15) >> 15;
水水水木木木
发表于 2025-9-3 11:52:56
ercircle 发表于 2025-9-3 11:46
提升主频到44.2368,可以测到875ns。需求是多少呢?Ai8051U系列是可以兼容8bit和32bit,且支持MDU32
...
我将优化等级设置为7级。下面的代码+其他语句的时间是8us不到。如果只看下面的语句,估计有4us左右。我是在PWM ISR中断里面反转IO电平用示波器测量的。我的主频是32.768MHz。我将其他语句尽可能去掉。我再试试。其中M_q15是加了volatile关键字。优化等级设置为7级,有没有什么弊端?我怕程序会出现某明奇妙的故障。
MD1U16 = SWING_HW;
MD5U16 = M_q15;
ARCON = 4 << 5;
OPCON = 1; //启动硬件乘法器
while((OPCON & 1) != 0);
half_cmd = MD3U32 >> 15;
ercircle
发表于 2025-9-3 11:55:03
水水水木木木 发表于 2025-9-3 11:52
我将优化等级设置为7级。下面的代码+其他语句的时间是8us不到。如果只看下面的语句,估计有4us左右。我是 ...
一般都是78,刚看了下新建工程是8
水水水木木木
发表于 2025-9-3 11:58:58
ercircle 发表于 2025-9-3 11:46
提升主频到44.2368,可以测到875ns。需求是多少呢?Ai8051U系列是可以兼容8bit和32bit,且支持MDU32
...
IO只测这段语句。实测是4us。编译器优化等级7。主频32.768MHz。正常吗?为啥你测得这么低?
水水水木木木
发表于 2025-9-3 12:04:33
ercircle 发表于 2025-9-3 11:50
我是在7级测试。
我测是10us左右。32.768MHz,优化等级7级。所以这个语句确实没有用到内部的MDU16,应该是32*16位运算。
IO3 = 1;
half_cmd = ((int32_t)SWING_HW * (uint16_t)M_q15) >> 15;
IO3 = 0;
水水水木木木
发表于 2025-9-3 12:10:48
ercircle 发表于 2025-9-3 11:36
我测试手册例程16位乘以16位取32位结果只需要,可以发下您的测试程序吗?
如果按照你这个示例的话,我测是1.5us不到。但是MD1和MD5这种是8位指针,可以传递16位数据吗?MD3是8位指针可以传递32位数据吗?这个用法是不是有问题?
IO3 = 1;
MD1 = SWING_HW;
MD5 = M_q15;
ARCON = 4 << 5;
OPCON = 1; //启动硬件乘法器
while((OPCON & 1) != 0);
half_cmd = MD3 >> 15;
IO3 = 0;
ercircle
发表于 2025-9-3 12:48:33
水水水木木木 发表于 2025-9-3 12:10
如果按照你这个示例的话,我测是1.5us不到。但是MD1和MD5这种是8位指针,可以传递16位数据吗?MD3是8位指 ...
是的有点问题,头文件里默认没MDxU16, 16位的定义16位指针.
使用lib库的话,直接进行乘除运算就行,不用操作寄存器。
ercircle
发表于 2025-9-3 13:02:38
水水水木木木 发表于 2025-9-3 11:58
IO只测这段语句。实测是4us。编译器优化等级7。主频32.768MHz。正常吗?为啥你测得这么低? ...
//4.75us@32.768
//half_cmd = ((uint32_t)SWING_HW * (uint16_t)M_q15) >> 15;
//750ns@32.768
half_cmd = ((uint16_t)SWING_HW * (uint16_t)M_q15) >> 15;
水水水木木木
发表于 2025-9-3 14:44:55
ercircle 发表于 2025-9-3 13:02
//4.75us@32.768
//half_cmd = ((uint32_t)SWING_HW * (uint16_t)M_q15) >> 15;
...
找到问题点了。
1.MDU16操作必须是无符号整数。
2.必须是16位乘法。
我的运算包含了2点:
1.有符号数。将uint16转换成int32运算,因此时间大幅增加。
2.32位*16位。
下面的语句仅仅是符号不同,需要的时间差距很大。无符号是4us左右,有符号是10us左右。
主频影响时间,编译器优化等级影响的时间倒不是很大。
half_cmd = ((uint32_t)SWING_HW * (uint16_t)M_q15) >> 15;
half_cmd = ((int32_t)SWING_HW * (uint16_t)M_q15) >> 15;
如果按照无符号计算,4+4+4=12us。50us的PWM ISR中断函数能执行12us能接受。但是我有个乘法运算是有符号的,这个就头疼了。有符号乘法运算需要10us左右的时间。10+4+4=18us。距离PWM周期数的一半25us已经很接近了。
而MDU32是支持有符号和无符号运算的。显然AI8051U比STC8H强太多了。PWM ISR中断执行的时间肯定是越短越好,一般10us已经算是很长时间了,5us内最好。还好ADC中断里面不需要乘除法运算,否则根本不满足功能要求。为了后续功能考虑,显然换成AI8051U最好,不然就算现在能用,以后更新算法之类的遇到瓶颈再换就麻烦了。
请问AI8051U的CPU指令模式是推荐8位还是32位比较好呢?手册中提到AI8051U比传统的8051单片机快70倍。这个性能对比应该是用32位实测的吧?您有没有用过AI8051U,CPU指令8位和32位在实际使用时有什么比较大的性能差距吗?谢谢!