找回密码
 立即注册

关于硬件乘除法的问题。

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 2025-9-3 11:46:02 | 显示全部楼层
水水水*** 发表于 2025-9-3 11:41
所以是不是要换支持MDU32的单片机?支持MDU32的单片机型号不多,最强大的应该是STC32G和AI8051U了吧?为 ...

提升主频到44.2368,可以测到875ns。需求是多少呢?Ai8051U系列是可以兼容8bit和32bit,且支持MDU32
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 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;

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-09-08 10:24:44

6

主题

37

回帖

134

积分

注册会员

积分
134
发表于 2025-9-3 11:52:56 | 显示全部楼层
erci*** 发表于 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;

点评

一般都是78,刚看了下新建工程是8 [attachimg]113826[/attachimg]  详情 回复 发表于 2025-9-3 11:55
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 2025-9-3 11:55:03 | 显示全部楼层
水水水*** 发表于 2025-9-3 11:52
我将优化等级设置为7级。下面的代码+其他语句的时间是8us不到。如果只看下面的语句,估计有4us左右。我是 ...

一般都是78,刚看了下新建工程是8

截图202509031154596899.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-09-08 10:24:44

6

主题

37

回帖

134

积分

注册会员

积分
134
发表于 2025-9-3 11:58:58 | 显示全部楼层
erci*** 发表于 2025-9-3 11:46
提升主频到44.2368,可以测到875ns。需求是多少呢?Ai8051U系列是可以兼容8bit和32bit,且支持MDU32
...

IO只测这段语句。实测是4us。编译器优化等级7。主频32.768MHz。正常吗?为啥你测得这么低?
截图202509031159106802.jpg

点评

//4.75us //half_cmd = ((uint32_t)SWING_HW * (uint16_t)M_q15) >> 15; //750ns half_cmd = ((uint16_t)SWING_HW * (uint16_t)M_q15) >> 15;  详情 回复 发表于 2025-9-3 13:02
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-09-08 10:24:44

6

主题

37

回帖

134

积分

注册会员

积分
134
发表于 2025-9-3 12:04:33 | 显示全部楼层
erci*** 发表于 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;
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-09-08 10:24:44

6

主题

37

回帖

134

积分

注册会员

积分
134
发表于 2025-9-3 12:10:48 | 显示全部楼层
erci*** 发表于 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;

点评

是的有点问题,头文件里默认没MDxU16, 16位的定义16位指针. 使用lib库的话,直接进行乘除运算就行,不用操作寄存器。 [attachimg]113832[/attachimg] [attachimg]113833[/attachimg]  详情 回复 发表于 2025-9-3 12:48
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 2025-9-3 12:48:33 | 显示全部楼层
水水水*** 发表于 2025-9-3 12:10
如果按照你这个示例的话,我测是1.5us不到。但是MD1和MD5这种是8位指针,可以传递16位数据吗?MD3是8位指 ...

是的有点问题,头文件里默认没MDxU16, 16位的定义16位指针.
使用lib库的话,直接进行乘除运算就行,不用操作寄存器。

截图202509031247283893.jpg
截图202509031248039498.jpg

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 2025-9-3 13:02:38 | 显示全部楼层
水水水*** 发表于 2025-9-3 11:58
IO只测这段语句。实测是4us。编译器优化等级7。主频32.768MHz。正常吗?为啥你测得这么低? ...

stc8H.zip (142.75 KB, 下载次数: 2)
        //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;

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-09-08 10:24:44

6

主题

37

回帖

134

积分

注册会员

积分
134
发表于 2025-9-3 14:44:55 | 显示全部楼层
erci*** 发表于 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位在实际使用时有什么比较大的性能差距吗?谢谢!

点评

当然优先使用32位 做了个简单测试参考: //2.75us @ half_cmd = ((uint16_t)SWING_HW * (uint16_t)M_q15) >> 15; //10us @ half_cmd = ((uint32_t)SWING_HW * (uint32_t)M_q15) >> 15; //70ns @ half_c  详情 回复 发表于 2025-9-3 15:52
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-14 11:14 , Processed in 0.191187 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表