Проблема в следующем, камень запущен на частоте 100 МГц тоесть инструкции должны выполняться за 10нс, дерганье ножкой показывает что примерно так и есть, но вот возникла задача генерить высокую частоту таймером, и больше 1 мегагерца не получилось, хотя по мануалу вход в прерывание занимает 12 тактов или 120 нс, путем тыка найдена инструкции которые выполняются не за 10нс а за целых 250.
Вот проблемная команда LPC_TIM0->MR0 += T0MR0->interval; ее выполнение занимает 500 нс, это не то что медленно, а вообще жесть.
в ассемблере это занимает всего 4 инструкции (загрузка адреса, чтение, сложение, выгрузка обратно)
в итоге прерывание даже пустого таймера выполняется за 750 нс плюс 120нс вход и 120 выход тоесть 1мкс.
750 получается из 1) операция проверки флага mr0 2) сброс флага 3) изменение mr0
Вторую проверку проводил так
Код
while (1)
{
f = 1-f;
if (f) PINSET;
else PINCLR;
LPC_TIM0->MR0 += T0MR0->interval;
}
итог период выполнения ~600 нс{
f = 1-f;
if (f) PINSET;
else PINCLR;
LPC_TIM0->MR0 += T0MR0->interval;
}
Код
while (1)
{
f = 1-f;
if (f) PINSET;
else PINCLR;
//LPC_TIM0->MR0 += T0MR0->interval;
}
период выполнения ~85нс{
f = 1-f;
if (f) PINSET;
else PINCLR;
//LPC_TIM0->MR0 += T0MR0->interval;
}
ассемблере тесты различаются всего на 4 инструкции
еще тест
Код
while (1)
{
f = 1-f;
if (f) PINSET;
else PINCLR;
LPC_TIM0->MR0 = T0MR0->interval;
}
итог период выполнения ~300 нс{
f = 1-f;
if (f) PINSET;
else PINCLR;
LPC_TIM0->MR0 = T0MR0->interval;
}
если рассуждать логически то включение ноги процессора это банальная операция записи в ячейку памяти соответствующую GPIO, а запись в регистр сравнения это такая же операция записи числа в ячеку памяти, но одна выполняется за 10 нс другая аж за 250
Встал в ступор куда копать не знаю