|
LPC1768 непонятное поведение |
|
|
|
Jan 27 2017, 19:27
|
Участник

Группа: Участник
Сообщений: 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] - для короткого!
|
|
|
|
|
 |
Ответов
|
Jan 28 2017, 20:58
|
Участник

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

|
Цитата(RabidRabbit @ Jan 28 2017, 23:46)  Настраиваете таймер 1 раз и он будет генерить до потери пульса без Вашего участия. Ему не надо каждый раз параметры перенастраивать... мне надо каждый раз период перестраивать А во вторых в таймере 4 регистра сравнения, их нужно проверить и сбросить флаги при необходимости, и вот каждая из этих операций длится 250нс Еще по поводу того что - не читал документацию, не понимаю что делаю прошу заметить что зарегистрировался я 11 лет назад, и за это время всего 18 сообщений, это потому что 11 лет не было вопросов, и за это время прочитаны тысячи документаций и реализовано десятки больших проектов, но вот сейчас наступил на какие то грабли и обратился к залу так сказать.
|
|
|
|
|
Jan 28 2017, 21:03
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(dpatrakov @ Jan 28 2017, 23:51)  А во вторых в таймере 4 регистра сравнения, их нужно проверить и сбросить флаги при необходимости, и вот каждая из этих операций длится 250нс Прям беда эти 250нс! И что за задача такая, интересно, требующая прерывания в 1МГц?? Цитата(dpatrakov @ Jan 28 2017, 23:58)  реализовано десятки больших проектов, но вот сейчас наступил на какие то грабли и обратился к залу так сказать. Ага "реализованы десятки проектов" и после этого не знаете, что получить такие частоты прерывания крайне проблематично - не знаете?? Имхо - это вроде как почти самоочевидно. Сомнения берут в десятках проектов... И каким образом кстати произведены все эти замеры с точностью до десятков нс? Вы умудрились воткнуть щуп осциллографа прямо в AHB? Поделитесь вашим бесценным опытом!
|
|
|
|
|
Jan 28 2017, 21:16
|
Участник

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

|
Цитата(jcxz @ Jan 28 2017, 23:59)  Прям беда эти 250нс! И что за задача такая, интересно, требующая прерывания в 1МГц?? 250 нс не беда, но когда выполняются 3 такие инструкции подряд, плюс время входа и выхода из прерывания это 1 мкс, это дофига. 1 МГц мне не нужен, я писал ранее, нужно 200 кГц, но это тоже не мало. самая медленная операция в прерывании это посчитать теорему пифагора для 6мерного пространства тоесть корень из суммы 6квадратов Цитата(jcxz @ Jan 29 2017, 00:03)  И каким образом кстати произведены все эти замеры с точностью до десятков нс? Вы умудрились воткнуть щуп осциллографа прямо в AHB? Поделитесь вашим бесценным опытом!  Вы что издеваетесь? в первом посте все написано, меряю все цифровым осциллографом, ножкой для этого и дергаю
|
|
|
|
|
Jan 28 2017, 21:35
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(dpatrakov @ Jan 29 2017, 00:16)  1 МГц мне не нужен, я писал ранее, нужно 200 кГц, но это тоже не мало. На этом МК я получал частоты прерывания от таймера (с полезной работой внутри в десяток команд) до 500-600 КГц. И получал работающий ISR на частоте 200КГц с выполнением нескольких десятков команд внутри ISR с записью всех регистров в память и копированием до 2-х десятков слов ОЗУ-ОЗУ. Странно, что с вашим опытом в десятки проектов  у Вас не получается гораздо более простая задача...
|
|
|
|
|
Jan 28 2017, 21:43
|
Участник

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

|
Цитата(jcxz @ Jan 29 2017, 00:35)  На этом МК я получал частоты прерывания от таймера (с полезной работой внутри в десяток команд) до 500-600 КГц. И получал работающий ISR на частоте 200КГц с выполнением нескольких десятков команд внутри ISR с записью всех регистров в память и копированием до 2-х десятков слов ОЗУ-ОЗУ. Странно, что с вашим опытом в десятки проектов  у Вас не получается гораздо более простая задача... 200 килогерц прерывание работает, и выполняет свою функцию, но 3 операции по обслуживанию прерывания, занимаю столько времени как весь код самого обработчика Цитата(jcxz @ Jan 29 2017, 00:35)  На этом МК я получал частоты прерывания от таймера (с полезной работой внутри в десяток команд) до 500-600 КГц. ну естественно 1мкс вход выход и непонятные задержки, и десяток команд это 100-150 нс, еще и основному потоку остается время правда мало, вставь в такое прерывание вычисление корня и оно у тебя повиснет, а с десятком команд у меня до 800кГц получалось
Сообщение отредактировал dpatrakov - Jan 28 2017, 21:44
|
|
|
|
|
Jan 28 2017, 21:53
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(dpatrakov @ Jan 29 2017, 00:43)  200 килогерц прерывание работает, и выполняет свою функцию, но 3 операции по обслуживанию прерывания, занимаю столько времени как весь код самого обработчика Опять про нс.... Похоже Вы не поняли - я уже выше написал в чём у Вас проблема. Никто не меряет сигналы в десятки нс, измерителем с разрешением в десяток МГц. На какой частоте Вы думаете у Вас GPIO работает? Измерять время выполнения команд надо таймером, а не GPIO. Ну а если так хочется GPIO, то измерять только группу команд от 1000 и больше чтобы получить полезный результат.
|
|
|
|
|
Jan 28 2017, 22:59
|
Участник

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

|
Цитата(jcxz @ Jan 29 2017, 00:53)  Опять про нс.... Похоже Вы не поняли - я уже выше написал в чём у Вас проблема. Никто не меряет сигналы в десятки нс, измерителем с разрешением в десяток МГц. На какой частоте Вы думаете у Вас GPIO работает? Измерять время выполнения команд надо таймером, а не GPIO. Ну а если так хочется GPIO, то измерять только группу команд от 1000 и больше чтобы получить полезный результат. Ну у меня с этого и началось. При возникновении прерывания, TC==MR0, тоесть после проверки флага и его сброса что занимает 12 тактов плюс 12 тактов на сохранение регистров при вызове обработчика TC должен опередить MR0 на 24 такта, а по факту опережает на 75 согласен что при входе в обработчик переписывается префетч, но в простом цикле тот же результат Да еще изменение частоты тактирования таймера не влияет на результат [indent][/indent] Цитата(jcxz @ Jan 29 2017, 00:28)  Да это Вы похоже издеваетесь, мозг тут всем выносите, "десятки проектов" и т.п. И при этом меряете команды дёргая ножкой и ещё про какие-то нс пишете!  О этот пост я пропустил. мальчик ты чего раздухарился так? ты вообще понимаешь как найти время выполнения конкретной инструкции? похоже что нет вот ты jcxz дофига умный расчитай время выполнения следующего кода Код ;;;1257 while (1) 000128 e011 B |L1.334| |L1.298| ;;;1258 { ;;;1259 f=1-f; 00012a f1c40401 RSB r4,r4,#1 ;;;1260 if (f) LPC_GPIO0->FIOCLR = 1; 00012e b11c CBZ r4,|L1.312| 000130 2001 MOVS r0,#1 000132 4919 LDR r1,|L1.408| 000134 61c8 STR r0,[r1,#0x1c] 000136 e002 B |L1.318| |L1.312| ;;;1261 else LPC_GPIO0->FIOSET = 1; 000138 2001 MOVS r0,#1 00013a 4917 LDR r1,|L1.408| 00013c 6188 STR r0,[r1,#0x18] |L1.318| ;;;1262 LPC_TIM0->MR0 += 1000; 00013e f04f2040 MOV r0,#0x40004000 000142 6980 LDR r0,[r0,#0x18] 000144 f500707a ADD r0,r0,#0x3e8 000148 f04f2140 MOV r1,#0x40004000 00014c 6188 STR r0,[r1,#0x18] |L1.334| 00014e e7ec B |L1.298| ;;;1263 }
|
|
|
|
Сообщений в этой теме
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 AVI-crak Цитата(dpatrakov @ Jan 28 2017, 01:27) Вс... Jan 28 2017, 13:12 dpatrakov Цитата(AVI-crak @ Jan 28 2017, 16:12... Jan 28 2017, 17:10  jcxz Цитата(dpatrakov @ Jan 28 2017, 20:10) Ес... Jan 28 2017, 17:43   dpatrakov Цитата(jcxz @ Jan 28 2017, 20:43) Где нап... Jan 28 2017, 18:18 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    jcxz Цитата(dpatrakov @ Jan 29 2017, 00:16) Вы... Jan 28 2017, 21:28  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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|