找回密码
 立即注册
查看: 7|回复: 2

关于硬件乘除法的问题。

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-09-02 18:35:33

5

主题

14

回帖

71

积分

注册会员

积分
71
发表于 5 小时前 | 显示全部楼层 |阅读模式
单片机:STC8H8K64U。32.768MHz。

这款是不是只支持MDU16?16*16怎么感觉非常慢?是我代码问题还是确实有这个bug?
代码:
half_cmd = ((int32_t)SWING_HW * (uint16_t)M_q15) >> 15;
上面这段代码的执行时间是10us。

                        MD1 = SWING_HW >> 8;
                        MD0 = SWING_HW;
                        MD5 = M_q15 >> 8;
                        MD4 = M_q15;
                        ARCON = 0x40;
                        OPCON = 1;        //启动硬件乘法器
                        while((OPCON & 1) != 0);
                        half_cmd  = MD3 << 24;
                        half_cmd += MD2 << 16;
                        half_cmd += MD1 << 8;
                        half_cmd += MD0;
                        half_cmd = half_cmd >> 15;

上面这段代码的执行时间是20us。
软件乘法比硬件乘法更快?
没有什么方法把16位值直接填入寄存器吗?运算结果也可以直接取出来,而不是每8位取一次。百度都没搜到关于MDU的操作。

现在我的需求是用STC8H单片机生成2路互补对称的PWM,这个没问题。但是在PWM ISR中需要运算PI环路,虽然我已经尽可能减少乘除法运算,但是一条乘法运算就需要增加10us的时间。
PWM周期才50us。2条乘法语句就用20us,再加上其他的加减和位移运算,直接干到了25us。占用了ISR的50%时间。这太夸张了!

请问是STC不适合做这些功能吗?论坛前辈们做的PWM控制难道没有PI环路?时钟已经是32.768MHz,时钟算是拉满了,再高的话手册中就不建议了。就这样一个乘法语句都要10us,完全不能接受。
我在手册中看到32位乘除法目前就2款单片机支持?AI8H2K12U、AI8H2K32U?AI8051U?STC32G?是推荐AI8051U做PWM控制吗?CPU指令模式推荐32bit?
还是说不推荐STC做PI环路?就现在的乘法运算需要10us我就头疼,主函数里面但凡多一点乘除法运算那不就完蛋了。我以为STC性能现在很强,没想到给我当头棒喝。
求前辈们指导,谢谢!
回复

使用道具 举报 送花

3

主题

2001

回帖

850

积分

等待验证会员

积分
850
发表于 5 小时前 | 显示全部楼层
关于您提到的STC8H8K64U单片机的硬件乘除法问题,首先需要明确该型号是否支持16位乘法运算(MDU16)以及16×16乘法(即1616)的执行效率问题。

STC8H8K64U是基于增强型8051内核的单片机,其内部集成了一个16位乘法单元(MDU16),用于实现16位乘法运算。该乘法单元支持16×16的乘法操作,但需要注意的是,其执行时间通常为3个时钟周期(约1.2μs在32MHz系统时钟下),但在实际应用中,由于指令流水线、寄存器访问和等待状态等因素的影响,实际执行时间可能会有所增加。

您提供的代码中使用了如下方式:
  1. c
  2. halfcmd = ((int32t)SWINGHW  (uint16t)Mq15) >> 15;
复制代码

此代码本质上是进行一个16位乘法运算,并将结果右移15位,得到一个16位的有符号数。如果该操作耗时10μs,可能的原因包括:

1. 编译器优化不足:若未启用优化选项,编译器可能未能正确识别并调用硬件乘法器,而是使用软件实现的乘法函数,导致执行时间显著增加。
2. 硬件乘法器调用方式不正确:您后续代码中使用了MD1、MD0、MD5、MD4等寄存器,并通过设置ARCON和OPCON启动硬件乘法器。这种方式属于直接调用硬件乘法器的方式,适用于16×16乘法运算,但需确保配置正确且操作顺序无误。
3. 代码结构影响性能:在调用硬件乘法器前,多次对寄存器进行赋值操作,可能导致额外的指令延迟或等待状态,从而影响整体执行时间。

建议您检查以下几点:
确认是否启用了硬件乘法器相关的编译选项;
检查MDU16的配置是否正确,包括ARCON和OPCON的设置;
尝试简化代码逻辑,减少不必要的寄存器访问;
使用调试工具或示波器测量实际执行时间,以确定是代码问题还是硬件限制。

综上所述,STC8H8K64U确实支持16×16乘法运算,但具体执行时间受多种因素影响。建议结合实际测试与代码优化,以提升运算效率。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-09-02 18:35:33

5

主题

14

回帖

71

积分

注册会员

积分
71
发表于 5 小时前 | 显示全部楼层
PI主环路是放在主函数中,但是PI环路输出的系数需要放到PWM ISR中和占空比值运算。这个乘除法不能避免。有没有什么好的方式解决呢?1次乘法就需要10us,这个太多了,1us还能接受。其他函数还有ADC中断采样。这个性能我头大。。。。。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-2 23:57 , Processed in 0.112105 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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