whale 6 21 августа Опубликовано 21 августа (изменено) · Жалоба Just now, iiv said: 700кГц по идее должно потянуть, вернее если на вашем процессоре первый цикл тоже как у меня 6 тактов, то 888кГц и ниже все должно охватить. а чем он больше-то? У меня в страницу поместилось все со всеми тестами. Если говорить о том, что вам конкретно надо, так это только nop_delay1 и nop_delay2, которые займут примерно 50 байт в бинарнике. Я сомневаюсь, что простыня нопов и скачки по ним будут лучше, а то, что ваш метод дает вольность контроллеру не закачивать часть нопов из флеша, даст вам сказочные неприятности, у вас то будет работать, то не будет работать. Будут скачки из за выборки из памяти. Для эксперимента можно попробовать чуть позже, для задания сейчас верхней граничной частоты нужно 40 нопов, уложиться ваш код в них ? Пока вроде глюков не наблюдается. Изменено 21 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 22 21 августа Опубликовано 21 августа · Жалоба 1 hour ago, iiv said: сделаю еще одну попытку прояснить вам мою идею. У вас stm32g070, у которого такт - 64МГц и вам нужен ногодрыг на 500кГц, то есть между переключениями у вас есть как минимум 64 такта. То, что я предлагаю, позволяет дозировать задержку с точностью до одного такта в диапазоне от 36 тактов до бесконечности. То есть вы с легкостью получите 500кГц, выставив 64 такта задержку, и 64/65/2*1000=492.3кГц, а если согласитесь на слегка не 50% форму сигнала, то и 64/129*1000=496.12кГц. Больше с этого дохлого контроллера взять не получится. ЗЫ: хоть и мое решение занимает меньше страницы уже отлаженного кода, считаю, что ТС надо при таких хотелках задуматься о более жирном процессоре, а лучше плиске. Не рекламы ради, очень советую взять мелкий GoWin - на нем с легкостью можно сделать шаг в районе 500кГц вплоть до единиц Герцев, если конечно еще подавать слегка не равномерные длины окон тактовой. и я бы сделал аргументы глобальными а не передавал в параметрах функций Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 26 21 августа Опубликовано 21 августа · Жалоба 10 minutes ago, whale said: для задания сейчас верхней граничной частоты нужно 40 нопов, уложиться ваш код в них ? у вас наверное сложности сравнить 36 с 40 🙂 1 minute ago, firstvald said: и я бы сделал аргументы глобальными а не передавал в параметрах функций конечно там масса возможностей, главное - уловить суть - сделать два цикла, один на 6 тактов, другой на 7, и для любой произвольной задержки выбрать сколько надо первого и второго цикла. Дешего, сердито, и довольно кросс-платформено. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 22 21 августа Опубликовано 21 августа · Жалоба в голове всплывает что- то "дробно рациональное" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 августа Опубликовано 21 августа (изменено) · Жалоба 5 hours ago, iiv said: у вас наверное сложности сравнить 36 с 40 Как то я сильно сомневаюсь, у вас старт nop_delay_ini1 вызывает nop_delay(time); в которой есть умножение и деление, которая в свою очеред вызывает nop_delay1 финиш те общее время складывается из всего этого последовательного вызова старт-финиш, деления, умножения, сравнения и все это укладывается в 36 команд ? Изменено 21 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 26 21 августа Опубликовано 21 августа · Жалоба 16 minutes ago, whale said: те общее время складывается из всего этого последовательного вызова старт-финиш, деления, умножения, сравнения и все это укладывается в 36 команд ? вы на форуме эти жалкие три строчки обсуждаете дольше, чем если бы взяли мой специально для вас готовый код и посмотрели бы как работает. Вам же разжевали и на блюдечко положили, а вы все сомневаетесь, и, что самое удивительное, ни прилагаете ни малейшей попытки понять эту идею. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 августа Опубликовано 21 августа (изменено) · Жалоба Just now, iiv said: а вы все сомневаетесь. Я во всем сомневаюсь и проверить его не так просто как вам кажется для это минимум надо разобрать железку которая на тесте и подключить ее к программатору, осциллографу итд Изменено 21 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 августа Опубликовано 21 августа (изменено) · Жалоба Just now, iiv said: эти жалкие три строчки Что такое CCOUNT что за команда RSR(CCOUNT, begin); Изменено 21 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 26 21 августа Опубликовано 21 августа · Жалоба 10 minutes ago, whale said: что за команда RSR(CCOUNT, begin); можно было погуглить добавив тот процессор, на котором я это тестировал (esp32), можно было догадаться, что это - измерение времени в тактах процессора. Такое чувство, что мне больше надо, чтобы у вас это запустилось, чем вам, так как вы, к моему полнейшему сожалению, совершенно не проявляете любопытства и не пытаетесь додумать что в каких местах этого кода могло бы быть написано 😞 Призываю, или действительно забить на мое решение и искать свой самостийный путь, или начать хоть чуть чуть читать, что я уже написал и хоть чуть-чуть думать. Вы за это время могли бы сами этот код в вами удобных обозначениях записать и оттестировать, но похоже, вам больше интересно это обсуждать, чем реально получить результат. Предвкушая ваш следующий вопрос, а то вы опять что-то не дочитаете, тайминги у вас могут слегка отличаться от моих, поэтому значения NOP_Param_1, NOP_Param_2 могут быть на несколько единиц больше или меньше и их надо подобрать методом научного тыка, ну или решив не сильно сложное уравнение. Это уравнение я не стал здесь приводить, так как по опыту предыдущих Ваших вопросов я уверен, что не смогу даже за неделю вам это объяснить, и предлагаю совместно сэкономить наше время, а решать научным тыком. 57 minutes ago, whale said: Я во всем сомневаюсь и проверить его не так просто как вам кажется для это минимум надо разобрать железку которая на тесте и подключить ее к программатору, осциллографу итд да, очень вас понимаю, поэтому в своих подделках в первую очередь стараюсь создать удобную для себя среду разработки, и только потом начинаю что-то разрабатывать. Часто из-за этото бываю сильно ограничен типами используемых контроллеров, но зато, могу разрабатывать довольно заумные алгоритмы прямо в железе. Попробуйте также, может этот совет вам тоже будет полезен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 августа Опубликовано 21 августа (изменено) · Жалоба Just now, iiv said: можно было погуглить добавив тот процессор Слишком запутанный и заумный код, я так понял RSR(CCOUNT, begin); мне не надо . Изменено 21 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 августа Опубликовано 21 августа · Жалоба Just now, iiv said: очередь стараюсь создать удобную для себя среду разработки Если свести всю вашу простыню к вот такому коду void nop_delay(unsigned int time) { int NOP_Param_1=6; int NOP_Param_2=6; unsigned int i; unsigned int q = time - NOP_Param_2; unsigned int q2 = q/NOP_Param_1; unsigned int q1 = q - q2*NOP_Param_1; i=q1; while(i>0) { asm("nop"); i--; } i=q2-q1; while(i>0) { asm("nop"); asm("nop"); i--; } return; } то при time 0..1...2 итд i в while постоянно вылетает в минус и все виснет, какие критерии для выбора time ? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 августа Опубликовано 21 августа · Жалоба Короче, если выше код правильный то при задании time от 0 и выше происходят жесткие глюки с частотой, мало того постоянно все виснет так еще и бегает в разные стороны ) Сдвигать она конечно может на такт но вычисление q1 q2 неверно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergey_Aleksandrovi4 2 21 августа Опубликовано 21 августа · Жалоба On 8/16/2024 at 9:51 PM, whale said: while(FG2--){__NOP();} есть ли конструкция аналогичная выше но выполняемая в 5-10 раз быстрее ? Быстрее в 3 раза без лишних телодвижений: выбрасываете из тела цикла абсолютно ненужный nop, включаете хотя бы самую лёгкую оптимизацию. Вместо портянки из 6 инструкций/итерацию Оптимизиция -O0 void TEST(unsigned int FG2) { while(FG2--){__NOP();} } 080002cc: nop 080002ce: ldr r3, [r7, #4] 080002d0: subs r2, r3, #1 080002d2: str r2, [r7, #4] 080002d4: cmp r3, #0 080002d6: bne.n 0x80002cc <TEST+16> получаете 2 инструкции/итерацию Оптимизиция -O1 void TEST(unsigned int FG2) { while (--FG2); } 08000260: subs r0, #1 08000262: bne.n 0x8000260 <TEST+6> Выхлоп из GCC, но IAR на таких тривиальных вещах должен выдавать аналогичный результат Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 21 августа Опубликовано 21 августа · Жалоба Just now, Sergey_Aleksandrovi4 said: получаете 2 инструкции нужна одна Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 72 21 августа Опубликовано 21 августа · Жалоба 2 hours ago, Sergey_Aleksandrovi4 said: получаете 2 инструкции/итерацию Выхлоп из GCC, но IAR на таких тривиальных вещах должен выдавать аналогичный результат bne ещё не за 1 такт выполняется, а iar этот пустой цикл без наличия volatile выкинет целиком скорее всего, при хоть какой-то включенной оптимизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться