Вы когда-нибудь рассчитывали 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, я думаю, что код, работающий в ПЗУ, замедляет работу мифов.
У любого органа есть какие-то комментарии или иной результат?
Большое спасибо за ваш ответ, за эту процедуру __delay, она написана в ASM точно, чтобы гарантировать наличие двух команд для каждого цикла задержки. и каждая инструкция будет выполняться одним часом. Таким образом, вы можете обнаружить, что вычисляемые мною mips - loops_per_ms/500, что означает, что loops_per_ms * 1000 * 2/1000000. и этот код будет работать, когда плата просто загрузится, и только с установками частоты процессора до 120 МГц, а системный тик включен для генерации irq каждые 1 мс, как вы думаете по этому методу, результат близок к реальным mips? –
Я вижу, что вы имеете в виду при ближайшем рассмотрении. Мне нужно подумать об этом! Прежде всего, я бы хотя бы переключил вывод GPIO между систолами и монитором на область, логический анализатор или таймер/счетчик, чтобы обеспечить правильную настройку синхронизации. – Clifford