Интересный факт: Продвинутый пользователь платформы меня поправил, самый быстрый код (из адекватных) для и изменения состояния пина Ардуино в цикле будет: while(1) { PORTD = 0x4; PORTD =~0x4; } Что дает нам 4 цикла или 4МГц скорости изменения :)
Спасибо за инфу. Лично мне как НЕ написавшему ни 1 строки кода на асме для атмел - всегда были интересны причины давнего холивара "атмел или пик". 6:22 вполне даёт часть ответа - на атмеле команды "чтение-модификация-запись" исполняются 2 цикла, на Пике - 1 цикл. И второй момент - в Пик18 в дополнение к "очистить" и "поставить" есть команда "смена состояния бита", на атмеле я её НЕ увидал. В итоге - ногодрыг 1 ногой (в отличие от приведённого примера на Си где меняется ВЕСЬ порт как я понял код Си) на пике будет 3 цикла (смена состояния и безусловный относительный переход), при этом меандр со скважностью 1/1 будет генерится. Если чуть схитрить и сделать например 8 штук смен состояния подряд а потом безусловный переход - то будет уже 1.125 цикла на смену состояния в среднем, но сигнал на ноге не будет меандром. Какие выводы ? Как минимум обработка флагов на Пиках вдвое быстрее, а код достаточно сложного прожекта весьма часто обрабатывает флаги, как минимум в диспетчере потоков, на который приходится 1/10-1/3 потока исполнения в реальном прожекте. Через это - то что лично мне удалось впихнуть в 12 МИПС на Пик-18 - поклонники атмела вряд ли смогут сделать на 16 МИПС на атмеле.
@@pswru атмеги они такие) Честно говоря этот холиар потерял свой смысл очень-очень давно, сейчас это как сравнивать ВАЗ 2101 и москвич 412-й, когда рядом стоит BMW, и которая стоит дешевле🙂
@@TDMLab Блин длинный ответ потерялся из-за клика мышой мимо - вкратце суть была в расширении сравнения полуторки-1940 и экстраполяции на БМВ-2050 и возвращаясь к мелкопроцам - сегодняшним реалиям "код конфигуратора" и "иксов" собирающих прожект из кубиков. И вывод от лично меня был - ресурса безусловно больше, но эффективность его использования безусловно меньше - в итоге полноценных самописанных частотников на новых камнях больше не станет. Но люди как обезъяны станут умничать про "новые возможности" и продавать друг другу гигагерцы и ширину шин и мегапиксели вместо достижения результата минимальными затратами ресурса.
@psw2.ru "продавать друг другу гигагерцы и ширину шин ... вместо достижения результата ..." - да, именно так и происходит😆 Справедливости ради у тех же STM-ов 1.25 DMIPS/MHz то есть в среднем за такт выполняется больше одной команды и если к этому прибавить DMA, тут сложно спорить, что они на голову опережают AVR и PIC. А так, конечно согласен, что нужно достигать результата минимальными средствами, но эти заветы предков уже почти забыты)))
@@TDMLab Пик в отличие от многих других продавцов гигагерцев - всегда славился богатой периферией в сравнении с атмелом как минимум. В той длинной потерянной мессаге лично я собственно отвлёкся на поиски ссылки даташита на новые 16 бит Пики которые в том числе для контроля моторов. Например ww1.microchip.com/downloads/en/DeviceDoc/dsPIC33CK256MP508-Family-Data-Sheet-DS70005349H.pdf - 600 страниц текста, и это без нюансов типа описания PWM подробного.
конечно скорость это хорошо . но бывает что в прерывании не видит переменную и это в тормознутом коде. а если нужно считать показания с термодатчика например скорость дает неправильные показания . или надо всю библиотеку переписывать под ассемблер .
@@vzo6951 Нет, это просто жестко связывает переменную и ее адрес в памяти и позволяет работать с ней из любой части программы хоть из прерывания, хоть из основного цикла, не боясь потерять данные.
Отличный ролик! Правда грустно, что для большинства ардуинщиков такая информация остается за скобками. Зачем напрягаться и изучать внутренности самого контроллера, когда можно писать, как code monkey и не париться. Так инженерная культура и умирает. Смотришь на современного программиста и тоска берет: человек не просто не понимает работу процессора и периферии, так даже фреймворк, с которым работает лень изучить. Как итог - приложения на десятки гигабайт, так еще и тормозят и глючат.
Да! Избыток ресурса развращает. Я помню лет 30 назад в нашем КБ осваивали Автокад и машины были IBM PC 286 (!) Так я тогда заморочился на формировании и оптимизации команды построения рамки чертежа с угловыми штампами автозаполнением, и масштабированием для форматов А4; А3; А2; А1 и всё это на LISP.... Кажется Уложился тогда менее чем 1,5 Кбайта. Вот что дефицит аппаратных ресурсов делал. Тогда была актуална 1001 заповедь: _любую программу можно сократить на один шаг_ А сейчас я вообще далеёк от этого. Так жизнь повернулась. Вот решил вспомнить и мозги немного раскачать.
Меткое замечатени.. А ведь автор, всего лишь, приоткрыл шторку и подсказал что "электричетсво берется не совсем из розетки".. Только вот, инженерная культура, имхо, не совсем умирает, хоть и ее становится все менее видно за поделками доморощенных "ардуинщиков" (не понимающих процесс происходящего). Пока еще много задач, и будет много, в которых без понимания процессов не сделать ничего.
Портируемый код это удел персональных компьютеров. Я предпочитаю использовать сильные "железные" стороны микроконтроллеров. При этом код будет работать на 8битных AVR МК с аналогичной системой регистров.
@@TDMLab Вовсе не удел ПК. Ибо адрес регистра даже на ATmega разных моделей отличаются. Вот и приходится вспоминать, что за порт скрывается под номером. Пример: TCNT2 на ATmega32A имеет адрес 0x24(0x44), на ATmega324A адрес TCNT2 уже 0xB2. Чипы по распиновке абсолютно одинаковые. И если приспичило сменить "камень" и прошивку в ней, то всю работу по правильной адресации ляжет на компилятор, а не разработчика.
@@Al.Sy. Согласен. Для портируемости никто не запрещает использовать библиотеки с адресацией регистров различных МК. В любом случае ассемблерные вставки это тонкий инструмент разового пользования.
@@TDMLab А разве во вставках на асме в Си нельзя использовать символьные имена аппаратных регистров, которые наследуются из включаемого файла описания ресурсов мелкопроца ?
ну вы и гении, ребята, почему таких людей не видит "наше" правительство и не производит процессоры, а когда санкции то автоваз встал и всё 'замерло' :((
Интересный факт:
Продвинутый пользователь платформы меня поправил, самый быстрый код (из адекватных) для и изменения состояния пина Ардуино в цикле будет:
while(1)
{
PORTD = 0x4;
PORTD =~0x4;
}
Что дает нам 4 цикла или 4МГц скорости изменения :)
Спасибо за инфу.
Лично мне как НЕ написавшему ни 1 строки кода на асме для атмел - всегда были интересны причины давнего холивара "атмел или пик".
6:22 вполне даёт часть ответа - на атмеле команды "чтение-модификация-запись" исполняются 2 цикла, на Пике - 1 цикл.
И второй момент - в Пик18 в дополнение к "очистить" и "поставить" есть команда "смена состояния бита", на атмеле я её НЕ увидал.
В итоге - ногодрыг 1 ногой (в отличие от приведённого примера на Си где меняется ВЕСЬ порт как я понял код Си) на пике будет 3 цикла (смена состояния и безусловный относительный переход), при этом меандр со скважностью 1/1 будет генерится. Если чуть схитрить и сделать например 8 штук смен состояния подряд а потом безусловный переход - то будет уже 1.125 цикла на смену состояния в среднем, но сигнал на ноге не будет меандром.
Какие выводы ? Как минимум обработка флагов на Пиках вдвое быстрее, а код достаточно сложного прожекта весьма часто обрабатывает флаги, как минимум в диспетчере потоков, на который приходится 1/10-1/3 потока исполнения в реальном прожекте. Через это - то что лично мне удалось впихнуть в 12 МИПС на Пик-18 - поклонники атмела вряд ли смогут сделать на 16 МИПС на атмеле.
@@pswru атмеги они такие)
Честно говоря этот холиар потерял свой смысл очень-очень давно, сейчас это как сравнивать ВАЗ 2101 и москвич 412-й, когда рядом стоит BMW, и которая стоит дешевле🙂
@@TDMLab Блин длинный ответ потерялся из-за клика мышой мимо - вкратце суть была в расширении сравнения полуторки-1940 и экстраполяции на БМВ-2050 и возвращаясь к мелкопроцам - сегодняшним реалиям "код конфигуратора" и "иксов" собирающих прожект из кубиков.
И вывод от лично меня был - ресурса безусловно больше, но эффективность его использования безусловно меньше - в итоге полноценных самописанных частотников на новых камнях больше не станет. Но люди как обезъяны станут умничать про "новые возможности" и продавать друг другу гигагерцы и ширину шин и мегапиксели вместо достижения результата минимальными затратами ресурса.
@psw2.ru "продавать друг другу гигагерцы и ширину шин ... вместо достижения результата ..." - да, именно так и происходит😆
Справедливости ради у тех же STM-ов 1.25 DMIPS/MHz то есть в среднем за такт выполняется больше одной команды и если к этому прибавить DMA, тут сложно спорить, что они на голову опережают AVR и PIC.
А так, конечно согласен, что нужно достигать результата минимальными средствами, но эти заветы предков уже почти забыты)))
@@TDMLab Пик в отличие от многих других продавцов гигагерцев - всегда славился богатой периферией в сравнении с атмелом как минимум. В той длинной потерянной мессаге лично я собственно отвлёкся на поиски ссылки даташита на новые 16 бит Пики которые в том числе для контроля моторов. Например ww1.microchip.com/downloads/en/DeviceDoc/dsPIC33CK256MP508-Family-Data-Sheet-DS70005349H.pdf - 600 страниц текста, и это без нюансов типа описания PWM подробного.
Век живи век учись ))) Спасибо за новые знания )))
Очень доходчиво, спасибо
Спасибо. Было интересно.
все получилось , ассемблер такая же ширина импульсов
2 способ дергание всем портом.
Или же я ошибаюсь?
А можно ли сделать таким способом очень быстрый ЦАП хотя бы на 2Мгц?
на ардуино нет.
Вообще на другом канале даже показывали какая ассемблерная простыня выходит при классическом методе дрыгания ногами... Простыня..........
ассемблерная вставка не работает может библиотека нужна?
Нет, по идеи нет. По крайней мере на тот момент ничего не нужно было. Asm по дефолту встроен в компилятор gcc. Ошибку дает?
конечно скорость это хорошо . но бывает что в прерывании не видит переменную и это в тормознутом коде. а если нужно считать показания с термодатчика например скорость дает неправильные показания . или надо всю библиотеку переписывать под ассемблер .
Что бы переменная могла изменяться в прерывании и корректно возвращаться можно использовать ключевое слово volatile
@@TDMLab значит это возможно притормаживает чтение в прерывании ))
@@vzo6951 Нет, это просто жестко связывает переменную и ее адрес в памяти и позволяет работать с ней из любой части программы хоть из прерывания, хоть из основного цикла, не боясь потерять данные.
@@TDMLab спасибо !
И еще момент: НИКОГДА не используйте команду GOTO в С++ от слова СОВСЕМ ;)
Я это делаю только в научных целях))))
получается что на встроенной функции loop тратится 600кгц. интересно, что там происходит в ней
запятую забыл но ширина импульса такая же
Отличный ролик! Правда грустно, что для большинства ардуинщиков такая информация остается за скобками. Зачем напрягаться и изучать внутренности самого контроллера, когда можно писать, как code monkey и не париться. Так инженерная культура и умирает. Смотришь на современного программиста и тоска берет: человек не просто не понимает работу процессора и периферии, так даже фреймворк, с которым работает лень изучить. Как итог - приложения на десятки гигабайт, так еще и тормозят и глючат.
Да! Избыток ресурса развращает. Я помню лет 30 назад в нашем КБ осваивали Автокад и машины были IBM PC 286 (!) Так я тогда заморочился на формировании и оптимизации команды построения рамки чертежа с угловыми штампами автозаполнением, и масштабированием для форматов А4; А3; А2; А1 и всё это на LISP....
Кажется Уложился тогда менее чем 1,5 Кбайта. Вот что дефицит аппаратных ресурсов делал. Тогда была актуална 1001 заповедь: _любую программу можно сократить на один шаг_
А сейчас я вообще далеёк от этого. Так жизнь повернулась. Вот решил вспомнить и мозги немного раскачать.
Меткое замечатени.. А ведь автор, всего лишь, приоткрыл шторку и подсказал что "электричетсво берется не совсем из розетки".. Только вот, инженерная культура, имхо, не совсем умирает, хоть и ее становится все менее видно за поделками доморощенных "ардуинщиков" (не понимающих процесс происходящего). Пока еще много задач, и будет много, в которых без понимания процессов не сделать ничего.
заработала
еще быстрее это перепаять кварц)))
А подключить таймер без делителя разве не самый быстрый способ? Тогда процессор вообще задействовать не нужно
Программный способ, не аппаратный.
Автор скромно умолчал, что расплата за такой код - плохая переносимость, плохо отслеживаемый код с волшебными константами.
Портируемый код это удел персональных компьютеров. Я предпочитаю использовать сильные "железные" стороны микроконтроллеров. При этом код будет работать на 8битных AVR МК с аналогичной системой регистров.
@@TDMLab Вовсе не удел ПК. Ибо адрес регистра даже на ATmega разных моделей отличаются. Вот и приходится вспоминать, что за порт скрывается под номером. Пример: TCNT2 на ATmega32A имеет адрес 0x24(0x44), на ATmega324A адрес TCNT2 уже 0xB2. Чипы по распиновке абсолютно одинаковые. И если приспичило сменить "камень" и прошивку в ней, то всю работу по правильной адресации ляжет на компилятор, а не разработчика.
@@Al.Sy. Согласен. Для портируемости никто не запрещает использовать библиотеки с адресацией регистров различных МК. В любом случае ассемблерные вставки это тонкий инструмент разового пользования.
@@TDMLab А разве во вставках на асме в Си нельзя использовать символьные имена аппаратных регистров, которые наследуются из включаемого файла описания ресурсов мелкопроца ?
@@pswru Да, можно, я просто не совсем правильно выразился.
можно еще выжать несколько сотен килогерц, почти до 4 МГц
И как же?
@@niyazleushkin лол, 2 года прошло, я уже и не помню о чем речь
@@СергейКураев-в2з ну что, выжали ? Или нам еще год подождать ?
@@valbob8144 ждите, мне то что?
ну вы и гении, ребята, почему таких людей не видит "наше" правительство и не производит процессоры, а когда санкции то автоваз встал и всё 'замерло' :((