Перейти к содержанию
    

_pv

Свой
  • Постов

    4 363
  • Зарегистрирован

  • Посещение

  • Победитель дней

    16

Сообщения, опубликованные _pv


  1. 3 minutes ago, jcxz said:

    Может такое быть? Да, может.

    может, а lto может увидеть, что никто больше ничего в переменную glb из секции zero bss не пишет, ни в одной единице трансляции, и посчитать что там всегда 0.

  2. 4 hours ago, jcxz said:

    Где же это видно? Вы неправы. Видно, что есть некая внешняя функция foo(), а также видно что glb - глобальная. А значит может изменяться например внутри той же foo(). А значит - она не может быть "всегда равна 0". Поэтому "выкинуть всё" - нельзя ни в каком случае. Была бы glb объявлена со "static" - другое дело.

    как бы да, но нет, foo() никогда не будет вызвана так как и glb и sv проинициализованны нулями, соответственно менять glb больше некому, а в коротком примере ничего больше и нет.

    не буду утверждать что оптимизатор у иара столь прозорливый и сгенерил приведённый странный код поэтому, а не из-за бага, но впринципе, в том коротком примере выкинуть всё право имел.

     

  3. 3 hours ago, iiv said:

    и данные все хранить надо. Там проще Фурьем грохнуть сразу 

    для нескольких определённых частот ДПФ будет быстрее ФФТ, да и как раз на лету считается без буферизации вообще, в отличии от. И того же Гёрцеля можно попробовать скрестить с примитивным БИХ фильтром, чтобы он старые отсчёты "забывал" экспоненциально и просто на каждом новом отсчёте за нескольких умножений уточнять значение фазы за последние N милисекунд.

    сигнал узкополосный и вычислять весь пустой спектр через ффт, а не на 2-3 частотах около единственного максимума, чтобы найти фазу смысла особого нет.

  4. для дальномера частоту ТС скорее всего сам себе и генерирует, так что должна быть известна.

    при неизвестной частоте МНК делать как-то совсем не проще, а частота если известна, то вроде как вообще без разницы - результат будет одинаковый, но Гёрцель тригонометрию всю через одно единственное умножение считает.

    а если частота известна "примерно", можно тем же Гёрцелем несколько точек вокруг посчитать, через них какую-нибудь параболу провести, найти где у неё максимум на самом деле и на этой частоте уже считать фазу.

  5. 55 minutes ago, SergeyVas said:

    Есть две ацп ads8681 могу на них завести  в микроконтроллере есть cordic  только с ацп думаю вариант дороже, сильнее будет грузить проц , программно сложнее, а точность значительно не увеличиться по сравнению с компараторами. Поправте если ошибаюсь?

    встроенных АЦП для 10кГц и 30дБ вроде как должно хватить с запасом.

    при известной частоте косинусное преобразование делается парой целочисленных умножений на отсчёт. см. "Алгоритм Гёрцеля"

    с компараторами ухудшение точности от уровня шума зависит, так как весь период превращается в одну единственную точку (перехода через 0), и соответственно все шумы делённые на производную сигнала прямиком попадают как ошибка фазы для всего периода. если же фаза считается умножением на синус/косинус через ДПФ, то шумы заметно давятся им как узкополосным фильтром и на фазу влияния оказывают меньше.

  6. 2 hours ago, Sergey_Aleksandrovi4 said:

    получаете 2 инструкции/итерацию

    Выхлоп из GCC, но IAR на таких тривиальных вещах должен выдавать аналогичный результат

    bne ещё не за 1 такт выполняется, а iar этот пустой цикл без наличия volatile выкинет целиком скорее всего, при хоть какой-то включенной оптимизации.

  7. 45 minutes ago, EdgeAligned said:

    При линейном исполнении кода и при правильно настроенных буферах предвыборки задержек возникать не должно, поскольку по параллельной шине с флеши забирается инструкций больше, чем требуется. Задержки из-за сброса конвейера могут происходить при ветвлении кода.

    это при правильно настроенных, PRFTEN по умолчанию выключен у STM32G070.

    в ram перенести этот десяток nopов всё равно надёжней.

  8. 44 minutes ago, whale said:
    2 hours ago, _pv said:

    flash wait states, исполнение из ram

    Поправить как нить можно  в данном контексте?

    собственно второе и лечит первое, вызванное тем что МК на большой частоте не успевает читать флэш что даже кэш на несколько слов не помогает и соответственно добавляет паузы.

  9. 1 hour ago, whale said:

    Мы видим постоянные сравнения что и приводит к шагу в 50кгц

     

    On 8/18/2024 at 2:15 AM, jcxz said:

    При достаточно большой величине N должен получиться как раз ваш "вычисляемый переход".

    при 4 ветках видимо "дешевле" развернуть в сравнения, если сделать switch побольше и ещё и оптимизацию по скорости включить вроде должен нормально сделать, но опять же без особых гарантий что при смене параметров оптимизации не сломается.

  10. 2 minutes ago, whale said:

    switch if  и прочее я пробовал еще до постинга этой темы, там минимум 35-50кгц шаг, оптимизацию тоже разную пробовал,

    листинг в студию.

    clang для арма из предложенного jcxz свича сам делает ровно такую же последовательность нопов и инкремент pc.

  11. 41 minutes ago, whale said:

    Черт возьми но вот это похоже работает, сдвигает на 3кгц но есть нюанс,

    это clang аргумент в r0 передаёт, и вроде ничего больше не делает, судя по godbolt.org,

    что именно там делает iar в прологе если фунция не naked объявлена это в листинг смотреть надо.

    инструкция nop вроде как два байта занимает, и почему при сдвиге на нечётный адрес он вообще в какой-нибудь hard fault не улетает я не очень понимаю.

    jcxz на первой странице нормальный вариант на С через switch привёл. Да, за компилятором в листинг поглядывать надо, потому что при разных уровнях оптимизации он вероятно может и в цепочку ifов скомпилировать, но такие вещи либо целиком на ассемблере, либо бороться с оптимизатоциями компилятора без каких-либо гарантий.

    • Like 1
  12. 2 hours ago, jcxz said:

    А чем мой способ не угодил предводителю дворянства?

    слишком просто и даже переносимо получается.

     

    надо сделать что-нибудь вроде 

    void delay(int cycles){
      __asm__("add pc, r0");
      __asm__("nop");
      __asm__("nop");
      __asm__("nop");
      __asm__("nop");
    //...
    }
    чтобы потом всё раком встало при "не правильном" переданном значении аргумента функции.

    • Like 2
  13. 2 hours ago, mantech said:

    Там все более менее быстрое скорее всего реализовано в их железе и частично драйверах.

    "их железо" от обычных ПК с виндой только корпусом отличается, на дин рейку. Но да в ядро они влезли.

    XP/7/10, 11 пока вроде не осилили, пересели на freebsd.

  14. 1 hour ago, khach said:

    National Instruments

    И все равно ничего путного не вышло.

    не удивительно, "Олег за всё берется смело..., а если за labview берется то просто тратит меньше сил"

    у beckhoffа с их twincatом вроде вполне получилось, правда тоже недавно рантайм ещё и TwinCAT/BSD выкатили, но со средой разработки win only, на базе msvs :)

  15. 3 hours ago, makc said:

    Спасибо, посмотрел но для моего случая это плохо подходит, т.к. синтаксис C мало кому привычен из техников. С админами проще, но тоже будут вопросы, поэтому я и ищу что-то типа TCL.

    у этого C4 ноги вероятно отсюда растут:

    http://www.iro.umontreal.ca/~felipe/IFT2030-Automne2002/Complements/tinyc.c

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

     

    если хочется именно tcl есть https://github.com/zserge/partcl, сам не использовал, просто под руку попался.

    но вот "set x 4; puts [+ [* $x 10] 2]" с пробелами, по сравнению со скобочками у C выглядит ну совсем не лучше

    • Upvote 1
  16. 1 hour ago, makc said:

    Под виндой, согласен, печаль. Но в линуксе с патчами есть варианты.

    в виндах тоже есть варианты типа TwinCAT, но не бесплатно и не "без доп.драйверов на уровне ядра"

  17. Как-то очень давно в 7 или даже XP, опрашивал параллельным ещё портом какой-то микрометр с ~2кГц последовательным интерфейсом, через тупой опрос inp(), драйверами параллельного порта от avreal.

    Путём спихивания процесса руками через SetProcessAffinityMask на какое-нибудь ядро с номером повыше, чтобы там ему никто не мешал, работало вполне стабильно, но какой там именно был джиттер не проверял. Без этого, просто изменением приоритета, было хуже.

    Можно наверное ещё где-то шедулеру посоветовать определённые ядра не использовать другими процессами, чтобы там только он один крутился.

    я бы вот сюда ещё бы посмотрел: https://learn.microsoft.com/en-us/windows/win32/procthread/multimedia-class-scheduler-service

     

  18. 2008 вроде бы самая адекватная была насколько помню, дольше всех прожила,

    https://download.microsoft.com/download/E/8/E/E8EEB394-7F42-4963-A2D8-29559B738298/VS2008ExpressWithSP1ENUX1504728.iso

     

    3 hours ago, dimka76 said:

    Можно рассмотреть вариант MinGW + Eclipse CDT

    не надо так, хотя бы codeblocks какой-нибудь, хоть и страшненький, но более менее рабочий из коробки:

    https://www.codeblocks.org/downloads/binaries/#imagesoswindows48pnglogo-microsoft-windows

    codeblocks-20.03mingw - с компилятором

     

    з.ы. а для "сложной консольной программы, которая читает из одного текстового файла и пишет в другой", и плюсы-то не особо нужны, хватит поди tinycc, и встроенного редактора в FARе. ну или http://www.smorgasbordet.com/pellesc/

    • Upvote 1
  19. Многофазность на момент (особенно если его в саженях*пуд измерять) не особо влияет, разве что на плавность хода и количество шагов на оборот.

    У двухфазного в тех же габаритах момент даже больше:

    https://www.oyostepper.com/goods-53-Nema-17-Stepper-Motor-Bipolar-18-deg-65Ncm-92ozin-21A-336V-42x42x60mm-4-Wires.html

    https://www.oyostepper.com/goods-1374-Nema-17-Stepper-Motor-5-Phase-05Nm-072deg-18A-42x42x60mm-5-Wires.html

     

    Редуктор какой попало тоже может не подойти, у китайских планетарных градуса 3 люфта спокойно наберётся особенно под нагрузкой, что с плечом в 12 дюймов легко даст полвершка ошибки позиционирования. А "безлюфтовые" волновые редукторы (типа harmonic drive) денег совсем дурных стоят.

×
×
  • Создать...