计算lpc1788 mips

时间:2013-08-19 05:16:38

标签: embedded rtos cortex-m3 lpc

你曾经计算过lpc1788板的mips吗?最近我通过以下代码在rom中运行计算结果:

volatile uint32_t tick;

void SysTick_Handler()
{
    tick++;
}

unsigned long loops_per_ms;

extern void __delay(int n);

int calculate_mips()
{
    int prec = 8;
    unsigned long ji;
    unsigned long loop;

    loops_per_ms = 1 << 12;

    while (loops_per_ms) {
        ji = tick;

        while (ji == tick) ;
        ji = tick;
        __delay(loops_per_ms);

        if (ji != tick)
            break;

        loops_per_ms <<= 1;
    }

    loops_per_ms >>= 1;
    loop = loops_per_ms >> 1;

    while (prec--) {
        loops_per_ms |= loop;

        ji = tick;

        while (ji == tick) ;
        ji = tick;
        __delay(loops_per_ms);

        if (ji != tick)
            loops_per_ms &= ~loop;

        loop >>= 1;
    }

    return loops_per_ms / 500;
}

delay.s:

  PUBLIC __delay
  SECTION .text:CODE:REORDER(2)
  THUMB
__delay
        subs r0, r0, #1
        bhi __delay
        mov pc, lr
  END

使用IAR ide,我得到loops_per_ms是39936,mips将是79M,与Keil一样,我得到一个loops_per_ms是29952,这意味着mips是59M。

MCU的速度设置为120MHz,MIPS应该是1.25x120 = 150M,我认为在ROM中运行的代码会减慢mips的速度。

任何机构都有一些评论或其他结果?

1 个答案:

答案 0 :(得分:0)

您无法以这种方式衡量MIPS。您无法控制编译器将使用多少指令来实现特定的高级代码源,它将随优化级别而变化。

核心将达到每MHz 1.25 MIPS,但可能会因许多因素而降低。例如,在Cortex-M片上闪存和片上RAM使用单独的总线,因此当数据在RAM中并且代码在闪存中时,可以实现最佳性能。如果闪存中的指令需要从闪存中获取数据,则吞吐量将减少,因为取指令和数据取指必须是顺序的,而从RAM中取出数据可以并行发生。如果您从RAM运行代码,您会发现速度变慢,因为所有数据和指令提取都是顺序的。大多数Cortex-M部件采用某种类型的闪存加速器来补偿较慢的闪存,以在大多数情况下实现零等待代码执行,尽管可以反过来编写代码来破坏这种好处。 MIPS降低的其他原因是由DMA操作和外设等待状态引起的总线延迟。

为您的特定应用程序测量MIPS的最简单,最准确的方法(由于上述原因可能与最佳原因不同)是使用具有跟踪功能的调试器,它将捕获一段时间内执行的每条指令。