реклама на сайте
подробности

 
 
> LPC1768 непонятное поведение
dpatrakov
сообщение Jan 27 2017, 19:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 20-05-06
Пользователь №: 17 293



Форумчане прошу помощи в поиске проблемы

Проблема в следующем, камень запущен на частоте 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 нс

Код
while (1)
{
f = 1-f;
if (f) PINSET;
else PINCLR;
//LPC_TIM0->MR0 += T0MR0->interval;
}
период выполнения ~85нс

ассемблере тесты различаются всего на 4 инструкции

еще тест
Код
while (1)
{
f = 1-f;
if (f) PINSET;
else PINCLR;
LPC_TIM0->MR0 = T0MR0->interval;
}
итог период выполнения ~300 нс

если рассуждать логически то включение ноги процессора это банальная операция записи в ячейку памяти соответствующую GPIO, а запись в регистр сравнения это такая же операция записи числа в ячеку памяти, но одна выполняется за 10 нс другая аж за 250
Встал в ступор куда копать не знаю

Сообщение отредактировал IgorKossak - Jan 27 2017, 20:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AVI-crak
сообщение Jan 28 2017, 13:12
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(dpatrakov @ Jan 28 2017, 01:27) *
Встал в ступор куда копать не знаю


A Memory Protection Unit (MPU) is included.
Ожидание завершения операции записи в периферийное устройство с дробной системной частотой.
Если отключить блок защиты MPU - начнутся такие весёлости, что вы сами добровольно и с песней побежите его включать.
Go to the top of the page
 
+Quote Post
dpatrakov
сообщение Jan 28 2017, 17:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 20-05-06
Пользователь №: 17 293



Цитата(AVI-crak @ Jan 28 2017, 16:12) *
A Memory Protection Unit (MPU) is included.
Ожидание завершения операции записи в периферийное устройство с дробной системной частотой.
Если отключить блок защиты MPU - начнутся такие весёлости, что вы сами добровольно и с песней побежите его включать.

И включал и выключал

Цитата(jcxz @ Jan 28 2017, 15:06) *
Я понимаю конечно что "чукча не читатель...", но может всё-таки прочитаете и попытаетесь понять, что я писал?
Каждый периферийный блок в LPC1768 тактируется своей частотой, получаемой делением системной частоты на некий делитель.
У Вас этот делитель чему равен? Вы уверены, что он ==1?


Это не инструкции, это си-исходник. Который может компилиться в любое число инструкций. Если хотите получить ВЧ-прерывание, придётся писать на асм.


Если рассуждать логически, то перед написанием ПО, надо сперва прочитать документацию на железо.
Вы её как видно не читали. Иначе бы знали, что такое стэкинг на входе/выходе в ISR и сколько тактов он занимает. Это десятки тактов.


Странно как-то вроде смотрите на картинку, а видите нечто, чего на ней нет... %-)
Я вот вижу, что только GPIO висит на системной шине (AHB), таймеры же - на периферийной шине (APB). И для каждого блока на APB есть свой делитель, в отличие от AHB, где все работают на частоте AHB.


Чувствую что ваяется очередное ногодрыгательное "творение"...
А Вы, позвольте спросить, кроме таймера и GPIO, про какую-нить другую периферию LPC хоть читали?
Да и вообще - хоть даже про таймер-то прочитали? И если да - зачем так много инструкций в Вашем ISR? Можно получать периодическое прерывание от таймера не записывая в него ничего.

Ну вы видимо тот еще читатель, раз это понаписали, или привыкли считать себя умнее других.

Если бы вы внимательно прочитали, то там все подробно написано, и про то что делитель равен 1 уверен на 100%, насчет си исходника ниже написано что компилируется в 12 инструкций ассемблерных, про стекинг было написано выше и это не десятки тактов а 12 то есть 120 нс (видимо плоховато вы знаете контроллер), с чего вы решили что документация не читалась и ваяется ногодрыгалка?

Не имейте привычки флудить чтобы сумничать.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 28 2017, 17:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(dpatrakov @ Jan 28 2017, 20:10) *
Если бы вы внимательно прочитали, то там все подробно написано, и про то что делитель равен 1 уверен на 100%,

Где написано?

Цитата(dpatrakov @ Jan 28 2017, 20:10) *
про стекинг было написано выше и это не десятки тактов а 12 то есть 120 нс

И что?
12 - только вход + прерывание выполняющейся в фоне команды + время на загрузку кода (prefetch) ISR + выполнение ISR + выход ISR + prefetch фонового кода.
И prefetch - вещь длительная из из flash. У Вас откуда прога выполняется? Наверняка из флешь. И какая частота флешь?
Go to the top of the page
 
+Quote Post
dpatrakov
сообщение Jan 28 2017, 18:18
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 20-05-06
Пользователь №: 17 293



Цитата(jcxz @ Jan 28 2017, 20:43) *
Где написано?


И что?
12 - только вход + прерывание выполняющейся в фоне команды + время на загрузку кода (prefetch) ISR + выполнение ISR + выход ISR + prefetch фонового кода.
И prefetch - вещь длительная из из flash. У Вас откуда прога выполняется? Наверняка из флешь. И какая частота флешь?


Вы отчего так невнимательны, нервничаете?

вот в первом посте было написан пример проверки, выполняется в мэйне с отключенными прерываниями, включено только тактирование периферии
Код
while (1)
{
f = 1-f;
if (f) PINSET;
else PINCLR;
LPC_TIM0->MR0 += T0MR0->interval;
}

дак вот этот код выполняется за 500нс

если из него убрать операция обращения к регистру сравнения LPC_TIM0->MR0 += T0MR0->interval;
то время выполнения цикла падает до 85нс
на ассемблере цикл занимает 9 инструкций и 5 инструкций вот это LPC_TIM0->MR0 += T0MR0->interval;
дак если читали внимательно, я писал что 9 инструкций цикла выполняются за 85 нс а 5 которые записывают в регистр таймера около 500

По поводу флешь, вы что не знали что она требует 5 тактов задержки? значит 20МГц, но этот вариант был проверен сразу, путем отключения ускорителя, во вторых в мэйне код выполняется в одном месте и не прыгает в прерывание, поэтому перезагрузка не требуется

Сообщение отредактировал dpatrakov - Jan 28 2017, 18:24
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dpatrakov   LPC1768 непонятное поведение   Jan 27 2017, 19:27
- - skripach   Цитата(dpatrakov @ Jan 27 2017, 22:27) Н...   Jan 27 2017, 20:25
|- - dpatrakov   Я это в душе понимаю, но как посмотреть? 250нс это...   Jan 27 2017, 20:41
|- - jcxz   Цитата(dpatrakov @ Jan 27 2017, 23:41) Я ...   Jan 28 2017, 07:43
|- - dpatrakov   Цитата(jcxz @ Jan 28 2017, 10:43) Смотрит...   Jan 28 2017, 08:39
|- - jcxz   Цитата(dpatrakov @ Jan 28 2017, 11:39) Та...   Jan 28 2017, 12:06
- - KRS   Если уж боретесь за наносекунды, пишите код оптима...   Jan 28 2017, 19:36
|- - dpatrakov   Цитата(KRS @ Jan 28 2017, 22:36) Если уж ...   Jan 28 2017, 20:18
|- - KRS   Цитата(dpatrakov @ Jan 28 2017, 23:18) И ...   Jan 30 2017, 18:42
|- - dpatrakov   Цитата(KRS @ Jan 30 2017, 21:42) в данном...   Feb 1 2017, 14:25
- - RabidRabbit   Цитата(dpatrakov @ Jan 27 2017, 22:27) Пр...   Jan 28 2017, 20:46
|- - dpatrakov   Цитата(RabidRabbit @ Jan 28 2017, 23:46) ...   Jan 28 2017, 20:58
|- - jcxz   Цитата(dpatrakov @ Jan 28 2017, 23:51) А ...   Jan 28 2017, 21:03
||- - dpatrakov   Цитата(jcxz @ Jan 28 2017, 23:59) Прям бе...   Jan 28 2017, 21:16
||- - jcxz   Цитата(dpatrakov @ Jan 29 2017, 00:16) Вы...   Jan 28 2017, 21:28
||- - jcxz   Цитата(dpatrakov @ Jan 29 2017, 00:16) 1 ...   Jan 28 2017, 21:35
||- - dpatrakov   Цитата(jcxz @ Jan 29 2017, 00:35) На этом...   Jan 28 2017, 21:43
||- - jcxz   Цитата(dpatrakov @ Jan 29 2017, 00:43) 20...   Jan 28 2017, 21:53
||- - dpatrakov   Цитата(jcxz @ Jan 29 2017, 00:53) Опять п...   Jan 28 2017, 22:59
||- - Dog Pawlowa   Цитата(dpatrakov @ Jan 29 2017, 01:59) ма...   Jan 29 2017, 06:57
||- - jcxz   Цитата(Dog Pawlowa @ Jan 29 2017, 09:57) ...   Jan 29 2017, 12:50
|- - Dog Pawlowa   Не могу похвастаться хорошим знанием ARM, но рассч...   Jan 28 2017, 21:18
|- - dpatrakov   Цитата(Dog Pawlowa @ Jan 29 2017, 00:18) ...   Jan 28 2017, 21:23
|- - Dog Pawlowa   Цитата(dpatrakov @ Jan 29 2017, 00:23) wi...   Jan 28 2017, 21:28
|- - dpatrakov   Цитата(Dog Pawlowa @ Jan 29 2017, 00:28) ...   Jan 28 2017, 21:35
- - dpatrakov   Вот думал тут, на шине где висит таймер, есть друг...   Jan 29 2017, 08:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th August 2025 - 19:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01439 секунд с 7
ELECTRONIX ©2004-2016