2013-08-19 3 views
0

Вы когда-нибудь рассчитывали mips платы lpc1788? Недавно я вычислил результат с помощью следующего кода работает в ПЗУ:Подсчитайте lpc1788 mips

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 язь, я получил loops_per_ms это 39936 и MIPS будет 79m, whil с Keil , Я получил loops_per_ms 29952, что означает, что mips - 59M.

Скорость MCU установлена ​​на 120 МГц, по спецификации MIPS должно быть 1,25x120 = 150M, я думаю, что код, работающий в ПЗУ, замедляет работу мифов.

У любого органа есть какие-то комментарии или иной результат?

ответ

0

Вы не можете измерить MIPS таким образом. Вы не можете контролировать количество инструкций, которые компилятор будет использовать для реализации определенного высокоуровневого кода, и он будет варьироваться в зависимости от уровня оптимизации.

Ядро достигнет 1,25 MIPS на МГц, но это может быть уменьшено в зависимости от ряда факторов. Например, на встроенной вспышке Cortex-M и встроенной ОЗУ используются отдельные шины, так что оптимальная производительность достигается, когда данные находятся в ОЗУ, а код находится во флэш-памяти. Если во флэш-памяти требуется извлечь данные из флэш-памяти, пропускная способность будет уменьшена, поскольку выборка команд и выборка данных должны быть последовательными, тогда как выборка данных из ОЗУ может происходить параллельно. Если вы запустили код из ОЗУ, вы бы заметили замедление, поскольку все данные и выборки команд были бы последовательными. В большинстве корпусов Cortex-M используется ускоритель вспышки , чтобы компенсировать более медленную флеш-память, чтобы в большинстве случаев добиться выполнения кода с нулевым ожиданием, хотя можно ошибочно написать код, чтобы победить такую ​​выгоду. Другими причинами уменьшения MIPS является латентность шины, вызванная операциями DMA и состояниями ожидания периферийного состояния.

Простейший и наиболее точный метод измерения MIPS для вашего конкретного приложения (который по указанным выше причинам может отличаться от оптимального) заключается в использовании отслегателя, способного отслеживать, который будет захватывать каждую инструкцию, выполненную за определенный период.

+0

Большое спасибо за ваш ответ, за эту процедуру __delay, она написана в ASM точно, чтобы гарантировать наличие двух команд для каждого цикла задержки. и каждая инструкция будет выполняться одним часом. Таким образом, вы можете обнаружить, что вычисляемые мною mips - loops_per_ms/500, что означает, что loops_per_ms * 1000 * 2/1000000. и этот код будет работать, когда плата просто загрузится, и только с установками частоты процессора до 120 МГц, а системный тик включен для генерации irq каждые 1 мс, как вы думаете по этому методу, результат близок к реальным mips? –

+0

Я вижу, что вы имеете в виду при ближайшем рассмотрении. Мне нужно подумать об этом! Прежде всего, я бы хотя бы переключил вывод GPIO между систолами и монитором на область, логический анализатор или таймер/счетчик, чтобы обеспечить правильную настройку синхронизации. – Clifford

Смежные вопросы