dpatrakov 0 27 января, 2017 Опубликовано 27 января, 2017 (изменено) · Жалоба Форумчане прошу помощи в поиске проблемы Проблема в следующем, камень запущен на частоте 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 Встал в ступор куда копать не знаю Изменено 27 января, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 27 января, 2017 Опубликовано 27 января, 2017 · Жалоба Надо смотреть на какой шине таймер висит, какая частота шины, много факторов влияет на скорость доступа к переферии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpatrakov 0 27 января, 2017 Опубликовано 27 января, 2017 · Жалоба Я это в душе понимаю, но как посмотреть? 250нс это 4Мгц таких источников вроде нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Я это в душе понимаю, но как посмотреть? 250нс это 4Мгц таких источников вроде нет Смотрится это по мануалу, в частности "Simplified block diagram" и "Architectural overview". И выставляются соответствующие делители частоты для каждой периферии. Процессор работает на своей частоте, периферийные блоки - каждый на своей. В LPC1768 можно каждому периферийному блоку назначить свой делитель частоты. Получить 1МГц прерывание можно, только писать ISR надо оптимально. И возможно на асм, чтобы не грузить CPU на 100% одним только ISR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpatrakov 0 28 января, 2017 Опубликовано 28 января, 2017 (изменено) · Жалоба Смотрится это по мануалу, в частности "Simplified block diagram" и "Architectural overview". И выставляются соответствующие делители частоты для каждой периферии. Процессор работает на своей частоте, периферийные блоки - каждый на своей. В LPC1768 можно каждому периферийному блоку назначить свой делитель частоты. Получить 1МГц прерывание можно, только писать ISR надо оптимально. И возможно на асм, чтобы не грузить CPU на 100% одним только ISR. Таймер висит на шине APB0, тактируется cclk (100МГц) Запустить на мегагерце получается пустое прерывание, но при этом процессор загружен почти на 100% из за выполнения всего трех инструкций if (TIM_GetIntStatus(LPC_TIM0, TIM_MR0_INT)== SET) //250нс { LPC_TIM0->MR0 = m_tc + T0MR0->interval; //500нс TIM_ClearIntPending(LPC_TIM0, TIM_MR0_INT); //250нс } на ассемблере эта конструкция занимает 12 операций тоесть если рассуждать логически то должна отработать за 120нс, а по факту получается 1000нс что в 10 раз больше, остальные инструкции в обработчике если добавить код выполняются примерно за 10нс на картинке 2 пути отмечены, GPIO и таймеры висят на системной шине, к выводам шина напрямую время доступа 10нс, к таймеру через AHB->APB мост и время увеличивается до 250нс, то есть получается скорость работы моста 4МГц? вроде бред, или в документации было бы написано что операции чтения регистров периферии ОЧЕНЬ медленныеи используйте их осторожно Вообще мне мегагерц прерывание не нужно, фактически нужно до 200кГц выполнить нужную задачу, и еще мэйну оставить время для работы, но на такой частоте получаем только операции обслуживания прерывания жрут 20% скорости, а приплюсовав еще один таймер для задержек и пару уартов то наверное и все 50% пропадает Изменено 28 января, 2017 пользователем dpatrakov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Таймер висит на шине APB0, тактируется cclk (100МГц) есть получается скорость работы моста 4МГц? вроде бред, или в документации было бы написано что операции чтения регистров периферии ОЧЕНЬ медленныеи используйте их осторожно Я понимаю конечно что "чукча не читатель...", но может всё-таки прочитаете и попытаетесь понять, что я писал? Каждый периферийный блок в LPC1768 тактируется своей частотой, получаемой делением системной частоты на некий делитель. У Вас этот делитель чему равен? Вы уверены, что он ==1? Запустить на мегагерце получается пустое прерывание, но при этом процессор загружен почти на 100% из за выполнения всего трех инструкций Это не инструкции, это си-исходник. Который может компилиться в любое число инструкций. Если хотите получить ВЧ-прерывание, придётся писать на асм. на ассемблере эта конструкция занимает 12 операций тоесть если рассуждать логически то должна отработать за 120нс, а по факту получается 1000нс что в 10 раз больше, остальные инструкции в обработчике если добавить код выполняются примерно за 10нс Если рассуждать логически, то перед написанием ПО, надо сперва прочитать документацию на железо. Вы её как видно не читали. Иначе бы знали, что такое стэкинг на входе/выходе в ISR и сколько тактов он занимает. Это десятки тактов. таймеры висят на системной шине, Странно как-то вроде смотрите на картинку, а видите нечто, чего на ней нет... %-) Я вот вижу, что только GPIO висит на системной шине (AHB), таймеры же - на периферийной шине (APB). И для каждого блока на APB есть свой делитель, в отличие от AHB, где все работают на частоте AHB. Вообще мне мегагерц прерывание не нужно, фактически нужно до 200кГц выполнить нужную задачу, Чувствую что ваяется очередное ногодрыгательное "творение"... А Вы, позвольте спросить, кроме таймера и GPIO, про какую-нить другую периферию LPC хоть читали? Да и вообще - хоть даже про таймер-то прочитали? И если да - зачем так много инструкций в Вашем ISR? Можно получать периодическое прерывание от таймера не записывая в него ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Встал в ступор куда копать не знаю A Memory Protection Unit (MPU) is included. Ожидание завершения операции записи в периферийное устройство с дробной системной частотой. Если отключить блок защиты MPU - начнутся такие весёлости, что вы сами добровольно и с песней побежите его включать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpatrakov 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба A Memory Protection Unit (MPU) is included. Ожидание завершения операции записи в периферийное устройство с дробной системной частотой. Если отключить блок защиты MPU - начнутся такие весёлости, что вы сами добровольно и с песней побежите его включать. И включал и выключал Я понимаю конечно что "чукча не читатель...", но может всё-таки прочитаете и попытаетесь понять, что я писал? Каждый периферийный блок в LPC1768 тактируется своей частотой, получаемой делением системной частоты на некий делитель. У Вас этот делитель чему равен? Вы уверены, что он ==1? Это не инструкции, это си-исходник. Который может компилиться в любое число инструкций. Если хотите получить ВЧ-прерывание, придётся писать на асм. Если рассуждать логически, то перед написанием ПО, надо сперва прочитать документацию на железо. Вы её как видно не читали. Иначе бы знали, что такое стэкинг на входе/выходе в ISR и сколько тактов он занимает. Это десятки тактов. Странно как-то вроде смотрите на картинку, а видите нечто, чего на ней нет... %-) Я вот вижу, что только GPIO висит на системной шине (AHB), таймеры же - на периферийной шине (APB). И для каждого блока на APB есть свой делитель, в отличие от AHB, где все работают на частоте AHB. Чувствую что ваяется очередное ногодрыгательное "творение"... А Вы, позвольте спросить, кроме таймера и GPIO, про какую-нить другую периферию LPC хоть читали? Да и вообще - хоть даже про таймер-то прочитали? И если да - зачем так много инструкций в Вашем ISR? Можно получать периодическое прерывание от таймера не записывая в него ничего. Ну вы видимо тот еще читатель, раз это понаписали, или привыкли считать себя умнее других. Если бы вы внимательно прочитали, то там все подробно написано, и про то что делитель равен 1 уверен на 100%, насчет си исходника ниже написано что компилируется в 12 инструкций ассемблерных, про стекинг было написано выше и это не десятки тактов а 12 то есть 120 нс (видимо плоховато вы знаете контроллер), с чего вы решили что документация не читалась и ваяется ногодрыгалка? Не имейте привычки флудить чтобы сумничать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Если бы вы внимательно прочитали, то там все подробно написано, и про то что делитель равен 1 уверен на 100%, Где написано? про стекинг было написано выше и это не десятки тактов а 12 то есть 120 нс И что? 12 - только вход + прерывание выполняющейся в фоне команды + время на загрузку кода (prefetch) ISR + выполнение ISR + выход ISR + prefetch фонового кода. И prefetch - вещь длительная из из flash. У Вас откуда прога выполняется? Наверняка из флешь. И какая частота флешь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpatrakov 0 28 января, 2017 Опубликовано 28 января, 2017 (изменено) · Жалоба Где написано? И что? 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МГц, но этот вариант был проверен сразу, путем отключения ускорителя, во вторых в мэйне код выполняется в одном месте и не прыгает в прерывание, поэтому перезагрузка не требуется Изменено 28 января, 2017 пользователем dpatrakov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Если уж боретесь за наносекунды, пишите код оптимально LPC_TIM0->MR0 += T0MR0->interval; особенно в цикле... мягко скажем не оптимально (особенно учитывая что регистры описаны как volatile) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpatrakov 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Если уж боретесь за наносекунды, пишите код оптимально LPC_TIM0->MR0 += T0MR0->interval; особенно в цикле... мягко скажем не оптимально (особенно учитывая что регистры описаны как volatile) И как это оптимизировать? в цикле я проверяю за сколько времени выполняется код в ассемблере это 5 команд LPC_TIM0->MR0 += 1000; 00012a f04f2040 MOV r0,#0x40004000 -- 1 цикл 00012e 6980 LDR r0,[r0,#0x18] -- 2 цикла 000130 f500707a ADD r0,r0,#0x3e8 -- 1 цикл 000134 f04f2140 MOV r1,#0x40004000 -- 1 цикл 000138 6188 STR r0,[r1,#0x18] -- 2 цикла итого 7 циклов по 10 нс = 70нс, а выполняется за 500 вот в чем вопрос Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RabidRabbit 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Проблема в следующем, камень запущен на частоте 100 МГц тоесть инструкции должны выполняться за 10нс, дерганье ножкой показывает что примерно так и есть, но вот возникла задача генерить высокую частоту таймером, и больше 1 мегагерца не получилось Настраиваете таймер 1 раз и он будет генерить до потери пульса без Вашего участия. Ему не надо каждый раз параметры перенастраивать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpatrakov 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Настраиваете таймер 1 раз и он будет генерить до потери пульса без Вашего участия. Ему не надо каждый раз параметры перенастраивать... мне надо каждый раз период перестраивать А во вторых в таймере 4 регистра сравнения, их нужно проверить и сбросить флаги при необходимости, и вот каждая из этих операций длится 250нс Еще по поводу того что - не читал документацию, не понимаю что делаю прошу заметить что зарегистрировался я 11 лет назад, и за это время всего 18 сообщений, это потому что 11 лет не было вопросов, и за это время прочитаны тысячи документаций и реализовано десятки больших проектов, но вот сейчас наступил на какие то грабли и обратился к залу так сказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба А во вторых в таймере 4 регистра сравнения, их нужно проверить и сбросить флаги при необходимости, и вот каждая из этих операций длится 250нс Прям беда эти 250нс! :smile3009: И что за задача такая, интересно, требующая прерывания в 1МГц?? реализовано десятки больших проектов, но вот сейчас наступил на какие то грабли и обратился к залу так сказать. Ага "реализованы десятки проектов" и после этого не знаете, что получить такие частоты прерывания крайне проблематично - не знаете?? Имхо - это вроде как почти самоочевидно. Сомнения берут в десятках проектов... И каким образом кстати произведены все эти замеры с точностью до десятков нс? Вы умудрились воткнуть щуп осциллографа прямо в AHB? :blink: Поделитесь вашим бесценным опытом! B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться