关于硬件乘除法的问题。
单片机: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性能现在很强,没想到给我当头棒喝。{:shuai:}
求前辈们指导,谢谢!
关于您提到的STC8H8K64U单片机的硬件乘除法问题,首先需要明确该型号是否支持16位乘法运算(MDU16)以及16×16乘法(即1616)的执行效率问题。
STC8H8K64U是基于增强型8051内核的单片机,其内部集成了一个16位乘法单元(MDU16),用于实现16位乘法运算。该乘法单元支持16×16的乘法操作,但需要注意的是,其执行时间通常为3个时钟周期(约1.2μs在32MHz系统时钟下),但在实际应用中,由于指令流水线、寄存器访问和等待状态等因素的影响,实际执行时间可能会有所增加。
您提供的代码中使用了如下方式:
c
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乘法运算,但具体执行时间受多种因素影响。建议结合实际测试与代码优化,以提升运算效率。
[本文内容由国芯人工智能辅助生成,仅供参考] PI主环路是放在主函数中,但是PI环路输出的系数需要放到PWM ISR中和占空比值运算。这个乘除法不能避免。有没有什么好的方式解决呢?1次乘法就需要10us,这个太多了,1us还能接受。其他函数还有ADC中断采样。这个性能我头大。。。。。
页:
[1]