This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2530:在 IAR 平台上测试32位移位、加法、减法、乘法和除法运算非常耗时。 这是正常的吗?

Guru**** 2589280 points
Other Parts Discussed in Thread: CC2530

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1013000/cc2530-testing-32-bit-shift-add-subtract-multiply-and-divide-operations-on-iar-platform-is-very-time-consuming-is-it-normal

器件型号:CC2530

如上所述、我在 IAR EW8051 9.10.1上创建了一个新项目、 然后使用示波器测量32位数据(无符号长整型)运算的时间计算。
然而,发现 存在着相当严重的耗时问题,例如:
31位左/右移位运算需要大约60us、除法需要123us、依此类推。
问题是什么?
非常感谢您的关注!

 代码如下:

////////////////////////////////////////////////////////////////////////////////
/*
Test time elapsed time of 32-bit operetion.
*/ 
////////////////////////////////////////////////////////////////////////////////
#include <ioCC2530.h>

#define LED1    P0_0
#define LED2    P0_1
#define LED3    P0_4
#define LED4    P0_5
#define LED5    P0_6
#define LED6    P0_7

#define SetRegBitValue(Reg, BitNum, State) \
((State) ? ((Reg) |= (((unsigned char)1) << BitNum)) : ((Reg) &= ~(((unsigned char)1) << (BitNum))))

#define SetRegValue(Reg, Bit7, Bit6, Bit5, Bit4, Bit3, Bit2, Bit1, Bit0) \
(Reg = (unsigned char)(Bit0) + (unsigned char)((Bit1)<<1) + (unsigned char)((Bit2)<<2) + (unsigned char)((Bit3)<<3) \
     + (unsigned char)((Bit4)<<4) + (unsigned char)((Bit5)<<5) + (unsigned char)((Bit6)<<6) + (unsigned char)((Bit7)<<7) )

#define BinValue(Bit7, Bit6, Bit5, Bit4, Bit3, Bit2, Bit1, Bit0) \
((unsigned char)(Bit0) + (unsigned char)((Bit1)<<1) + (unsigned char)((Bit2)<<2) + (unsigned char)((Bit3)<<3) \
  + (unsigned char)((Bit4)<<4) + (unsigned char)((Bit5)<<5) + (unsigned char)((Bit6)<<6) + (unsigned char)((Bit7)<<7))

//typedef signed   char   int8;
//typedef unsigned char   uint8;
//
//typedef signed   short  int16;
//typedef unsigned short  uint16;
//
//typedef signed   long   int32;
//typedef unsigned long   uint32;

////////////////////////////////////////////////////////////////////////////////
int main( void )
{
    //--------------------------------------------------------------------------
    //32MHz
    //[7][OSC32K]1(1,R/W), 32kHz RCOSC
    //[6][OSC]0(1,R/W), 32MHz XOSC
    //[5:3][TICKSPD]101(001,R/W), Timer Ticks = 1MHz
    //[2:0][CLKSPD]000(001,R/W), 32MHz
    SetRegValue(CLKCONCMD, 1, 0, 1,0,1, 0,0,0);
    while(CLKCONSTA != BinValue(1, 0, 1,0,1, 0,0,0));
    
    //--------------------------------------------------------------------------
    EA = 0; //Close Global Interrupt
  
    //Init Pins
    SetRegBitValue(P0SEL, 0, 0); //0, General I/O
    SetRegBitValue(P0DIR, 0, 1); //1, Output
    
    SetRegBitValue(P0SEL, 1, 0); //0, General I/O
    SetRegBitValue(P0DIR, 1, 1); //1, Output
    
    SetRegBitValue(P0SEL, 4, 0); //0, General I/O
    SetRegBitValue(P0DIR, 4, 1); //1, Output
    
    SetRegBitValue(P0SEL, 5, 0); //0, General I/O
    SetRegBitValue(P0DIR, 5, 1); //1, Output
    
    SetRegBitValue(P0SEL, 6, 0); //0, General I/O
    SetRegBitValue(P0DIR, 6, 1); //1, Output
    
    SetRegBitValue(P0SEL, 7, 0); //0, General I/O
    SetRegBitValue(P0DIR, 7, 1); //1, Output
    
    //--------------------------------------------------------------------------
    while(1)
    {
        unsigned long A = 0xF32E9AD0; 
        unsigned long B = 0xE9A3D02E; 
        
        LED1 = 1;
        /* Tests:
        1--7.5us. 5--14.6us.  10--23.6us.  13--29.0us.  16--34.4us.
        19--39.6us.  24--48.8us.  29--57.6us.  31--61.2us.     */
        unsigned long C = A << 31; 
        LED1 = 0;
        
        LED2 = 1;
        /* Tests:
        1--7.6us.  5--15us.  10--24.4us.  13--29.8us.  16--35.4us.
        19--41.2us.  24--50.4us.  29--59.6us.   31--63.2us.    */
        unsigned long D = A >> 31;
        LED2 = 0;
        
        LED3 = 1;
        unsigned long E = A + B; //Test: 8.3us
        LED3 = 0;
        
        LED4 = 1;
        unsigned long F = A - B; //Test: 8.9us
        LED4 = 0;
        
        LED5 = 1;
        unsigned long H = A * B; //Test: 18.6us
        LED5 = 0;
        
        LED6 = 1;
        unsigned long I = A / B; //Test: 123us
        LED6 = 0;
    }
    //--------------------------------------------------------------------------
    return 0;
}

////////////////////////////////////////////////////////////////////////////////

一些环境设置如下:
   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Lu Lu、

    TRM 的第2.4节详细介绍了算术指令集。  您应该使用 IAR 调试器来检查时钟寄存器、以确保所需的时钟速度被使用。  您可以联系 IAR 支持、以获得编译器和工具方面的进一步帮助。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的回复。  
    但是、我的时钟寄存器似乎没有问题、我的 CLKSPD 设置为32MHz。  
     下面是 IAR 调试模式下的屏幕截图:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的验证。  鉴于编译器处理的数学函数较长、我建议您联系 IAR 以获得更多帮助。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢。 我想知道 您的机器上相同代码的32位移位、加法、减法、乘法和除法运算的正确时间成本是多少?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    CC2530仅受 IAR IDE 支持、执行时间取决于编译器优化 和设置、尤其是对于长算术运算。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 非常感谢。