Jump to content
    

Плавный переход C -> C++ под МК

22 minutes ago, Arlleex said:

Еще страшнее, когда он летит коту под хвост из-за того, что весь проект ты когда-то решил написать пока что еще не до конца освоенными подходами в программировании))

Вот именно поэтому выше я и спросил коллегу, а делал ли он замеры в цифрах результатов своего нового "подхода" ))

 

Share this post


Link to post
Share on other sites

В 18.09.2023 в 23:00, Forger сказал:

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

Не припомните, что за книга/книги?

Share this post


Link to post
Share on other sites

7 minutes ago, std said:

Не припомните, что за книга/книги?

Увы, не помню   ((

но вот по поиску за пару минут наткнулся на такие материалы:

https://web.engr.oregonstate.edu/~traylor/ece473/pdfs/minimize_interrupt_response_time.pdf

https://www.beningo.com/3-tips-for-speeding-up-interrupt-handlers/

А вообще минимизация времени нахождения в прерывании, как и минимизация накладных расходов на их обслуживание - кмк одно из самых важных правил оптимизации кода и проекта в целом.

Share this post


Link to post
Share on other sites

1 minute ago, Forger said:

А вообще минимизация времени нахождения в прерывании, как и минимизация накладных расходов на их обслуживание

Если в цикле __NOP или __WFI - есть разница по времени входа в прерывании ? Может кто мерял.

Share this post


Link to post
Share on other sites

3 часа назад, Forger сказал:

Увы, не помню   ((

но вот по поиску за пару минут наткнулся на такие материалы:

https://web.engr.oregonstate.edu/~traylor/ece473/pdfs/minimize_interrupt_response_time.pdf

https://www.beningo.com/3-tips-for-speeding-up-interrupt-handlers/

А вообще минимизация времени нахождения в прерывании, как и минимизация накладных расходов на их обслуживание - кмк одно из самых важных правил оптимизации кода и проекта в целом.

Спасибо. Мне не этот вопрос интересен, есть интерес почитать волшебные книги реальных гуру. Я уже размечтался. 😃

От себя скажу, схема с выставлением булевого или битового флага в прерывании (флаг что прерывание произошло) связана не только с "минимизацией времени обработки прерывания".
Этот архитектурный паттерн для меня обладает иной ценностью. Прерывания представляют собой полноценный параллельный поток выполнения. И если внутри прерывания отрабатывают какие-то алгоритмы зависимые по данным с основным потоком, придется вводить примитивы синхронизации. С возможностью ошибки. Рабочий алгоритм программы разбавится еще и вызовами синхронизации, блокировками, итд.
Паттерн с выставлением из прерывания флажка и анализа флажка в заданном нами месте позволяет "обработать" прерывание именно тогда когда мы желаем, в заданной очередности, избегая синхронизации.

     

4 часа назад, x893 сказал:

Если в цикле __NOP или __WFI - есть разница по времени входа в прерывании ? Может кто мерял.

Для wfi есть.  В большинстве реализаций это вход в режим энергосбережения с возможной приостановкой сигналов синхронизации и проч. Соответственно, прерывание придет и понадобится время раскочегариться.

Share this post


Link to post
Share on other sites

31 minutes ago, std said:

Мне не этот вопрос интересен, есть интерес почитать волшебные книги реальных гуру.

Так об и нужно было спрашивать )))

Например мои буквари были эти:

  • Роберт Мартин. ЧИСТЫЙ КОД
  • Ален И. Голуб. ВЕРЕВКА ДОСТАТОЧНОЙ ДЛИНЫ, ЧТОБЫ ВЫСТРЕЛИТЬ СЕБЕ В НОГУ
  • Christopher Michael Kormanyos. "Real-Time C++ Efficient Object-Oriented and Template Microcontroller Programming"
  • Скотт Мейерс  Наиболее эффективное использование C++

 

 

31 minutes ago, std said:

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

Именно! По сути с этой целью я и делаю прерывания предельно короткими, а для синхронизации с фоном задач как раз и используются сервисы ос: семафоры, очереди ... 

К примеру, при разборе очереди данных с последовательных портов я использую счетные семафоры и программные очереди (буферы), которые уже потом разгребаются в фоне соотв. задач.

В прерывании не анализирую приходящие данные, нет на этого времени. Их нужно быстро забрать из аппаратного буфера, и тут же переложить в программный, сказать об этом и тут же освобождать время ядра для других.

Share this post


Link to post
Share on other sites

В 19.09.2023 в 09:37, Forger сказал:

Получается что мой выигрыш в несколько тактов на входе в прерывание при отказе от делегата никакой погоды вообще не сыграет, овчинка выделки не стоит ))

А мне вспоминается один проект, где "молодые и продвинутые" программеры, в алгоритме сигнальной обработки на DSP накодили на всяких с++-ных плюшках (использовали и перегруженные операторы и наследование и виртуальные методы и т.п. модные и "продвинутые" плюшки). Для простого чтения входных данных из нескольких циклических буферов в цикле сигнальной обработки. И.... вдруг оказалось, что довольно мощный DSP (который выбирался вроде как с запасом по производительности) сильно не тянет. Т.е. - даже базовый функционал он успевает исполнять только на ~30% (быстродействия не хватает уже трёхкратно). А ведь это был только базовый функционал! :shok: Позже планировалось ещё навернуть несколько этажей обработки над ним.

Стали разбираться. Покатили бочку на нас со смехотехником, типа: "Это вы выбрали DSP, не адекватный задаче". Руководство решило вообще закрыть проект, как неудачный. Потом оно ещё посовещалось. Кого-то уволило. Спросили меня - "посмотришь?" (до этого момента исходники мне не показывали, так как "ноу хау", наш собственный закрытый алгоритм). "Иначе - закрываем проект и расходимся по домам." Подписал NDA, получил исходники и..... увидел всё это безобразие, где класс на классе да классом погоняет.  :biggrin:  Посмотрел во что это всё выливается компилится на DSP. А на DSP все эти чтения входных данных посредством вызовов методов классов, компилились в вызовы функций. Что приводило к невозможности глубокой оптимизации циклов обработки. Так как аппаратные циклы, в которых в конвеер команд в ядре грузится сразу всё тело цикла целиком, а потом там прокручивается нужное число раз, распараллеливаясь на 8 или более потоков исполнения и не обращаясь вообще к памяти команд для загрузки новых - они не позволяют из себя делать вызовы подпрограмм. Выполнение возможно только в пределах такого аппаратного цикла. Любой вызов функции наружу приводит к тому, что компилятор создаёт программный цикл, с кратным (в несколько десятков раз(!)) уменьшением скорости выполнения.

Вобщем - снёс я всё это модное и продвинутое плюсовое безобразие, реализовал всё то же самое, но на простых указателях на данные. На простом си. Добавил restrict-ов указателям. Перераспределил память и управление ею. И..... циклы взлетели! :dance4: Компилятор скомпоновал нормальные VLIW-пакеты инструкций для DSP (с максимальным распараллеливанием), завернул их в аппаратные циклы, задействовал все 64 регистра ядра для обработки. Уменьшение времени выполнения того кода получил почти 100-кратное!!! Руководство долго не верило в такой эффект, пока не получило работающий код. :biggrin: Проект наш продолжился. Надстроили все этажи которые и планировали. Потом ещё добавили опциональных (так как ресурсов хватало за глаза). И всё равно конечная загрузка CPU составила = максимум ~20...30%. Это даже при том, что работало ядро не на максимальной частоте, а что-то порядка 2/3 от максимума.

Правда потом руководство начало сетовать, что "Выбрали слишком мощный DSP и слишком много ОЗУ поставили. Надо бы как-то урезать осетра. Для удешевления изделия."....  :biggrin:

 

PS: Так что - пока не имеете дела с серьёзной обработкой данных, до тех пор скорей всего не увидите профита от оптимизации.

Share this post


Link to post
Share on other sites

50 minutes ago, jcxz said:

(использовали и перегруженные операторы и наследование и виртуальные методы и т.п. модные и "продвинутые" плюшки).

Если плюшки ради плюшек - это одно, это баловство, оно хоть и нужно, но с ним нужно аккуратно, а вот если плюшки для дела - и дают ощутимый профит, то это другое. Боятся этого не стОит!

Грань найти сложно, она только с опытом приходит. Но если не пробовать ничего нового, то как узнать что можно некоторые вещи делать быстрее и проще, ну и велИк риск безвозвратно "отстать от поезда"... Кого-то такой расклад страивает, а кого-то нет. Тут сам каждый решает.

 

50 minutes ago, jcxz said:

Подписал NDA, получил исходники и..... увидел всё это безобразие, где класс на классе да классом погоняет

Мне тоже довелось столкнуться с такими мракобесием: лет 12 назад некий молодой прогер в тщедушный 80166 проц на примерно 200МГц всунул плюсы во всей их красе с активнейшим использованием stl и соотв. кучи. Более того туда же другой, но тоже не менее отважный прогер запихнул SQL сервер ....

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

В итоге он сам же убирал оттуда все тяжеловесное, переписывая критичные куски. Плюсы остались, по итогах они как раза беды не делали, ибо код на удивление был спроектирован довольно грамотно, а вот от кучи и встроенной stl конечно отказались, переписав критичный по скорости работы куски ...

 

Сейчас этот прогер уже много лет работает на серьезную импортную фирму, где пишет низкоуровневый код под некие "биржевые сервера" с предельно жесткими требования к скорости разбора сетевых пакетов. Получает оч. хорошие деньги, не просто так, за бугром просто так ничего никому не платят )

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

 

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

По мне оптимально некое комромисное решение - не боятся ничего нового, но при этом быть готовым и более досконально проверять как это все новое работает.

 

 

 

50 minutes ago, jcxz said:

Так что - пока не имеете дела с серьёзной обработкой данных,

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

 

У нас в подъезде дома живет некий старик, который ВСЕГДА выключает свет в подъезде (выключатель на первом этаже), хотя на каждом этаже стоит датчик присутствия и светодиодная лампа. Типа "экономит электричество".

Даже простейший приблизительный подсчет показал, что его "выдающаяся экономия" дает на одну квартиру примерно несколько рублей экономии В ГОД. Но об этой "экономии" сразу забываешь, когда вечером заходишь в темный подъезд и на ощупь ищешь это чертов выключатель ...

Это старик своей "экономией" мне сильно кого-то напоминает ))

Share this post


Link to post
Share on other sites

4 часа назад, Forger сказал:

Так об и нужно было спрашивать )))
Например мои буквари были эти:

  • Роберт Мартин. ЧИСТЫЙ КОД
  • Ален И. Голуб. ВЕРЕВКА ДОСТАТОЧНОЙ ДЛИНЫ, ЧТОБЫ ВЫСТРЕЛИТЬ СЕБЕ В НОГУ
  • Christopher Michael Kormanyos. "Real-Time C++ Efficient Object-Oriented and Template Microcontroller Programming"
  • Скотт Мейерс  Наиболее эффективное использование C++

Пропустишь одно слово, так как думаешь что все всё понимают и получаешь.
Ну мы же ведем разговор о EMBEDDED разработке.
Embedded это еще hard realtime, часто ассемблер, прямая работа с железом и оригинальные решения,
платы, разводка, сигналы, схемки, электронные компоненты, алгоритмы, методика отладки и тестирования.
Методика построения проектов электроники, программных проектов.
Документация, в конце концов.   А Мейерсу и Голубу в обед двадцать лет. Примерно тогда я их и скурил.

Интересны гуры именно Embedded разработки, то бишь еще и электроника, а не очередное программирование.  
Теплится надежда что есть тот заветный фолиант, который прочтешь - и сразу станешь магом.
(шучу конечно, но это именно та причина, по которой я спросил что за книжка)

 

3 часа назад, jcxz сказал:

А мне вспоминается один проект, где "молодые и продвинутые" программеры, в алгоритме сигнальной обработки на DSP

Что за камень-то был, имя! 😃
В противовес задвину байку из примерно 2000 года и вышедшей тогда в 1998 свеженькой VS6.
По аналогии с микроконтроллерными циклами или даже с x86 асмом я писал DSP обработку в духе:
 

mov reg_address, address
mov reg_counter, count
loop:
      do with [reg_address] whatever...             ; Что-то делаем с данными по адресу..
      inc reg_address                               ; Инкремент адреса
      dec  reg_counter                              ; Декремент счетчика
      jnz loop
      ....

И удивился, когда циклы в C++  STL показали более быструю работу.
WTF?!? WTF?!

Фича оказалась в том, что STL использует для проверок циклов сравнение указателей,
т.е. обходится без счетчиков.

 

Edited by std

Share this post


Link to post
Share on other sites

1 hour ago, std said:

А Мейерсу и Голубу в обед двадцать лет. Примерно тогда я их и скурил.

Так с тех пор мало что изменилось в это сфере. Можно сказать что это - Буквари с большой буквы, может в чем то уже не так актуальны, но в целом по-прежнему ценны.

 

1 hour ago, std said:

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

Слишком общие хотелки ) Чтобы собрать все в одну чудо-книжку и чтобы она прям всех во всем устраивала - это конечно утопия )

Но книжки по т.н embedded разумеется есть. Если не забанены в гугле, то вот например список 

 

1 hour ago, std said:

часто ассемблер

Отнюдь. Вот у меня в проектах практически нет asm. А в последних вообще нет ни одного asm файла, это не хвастовство, просто он уже не нужен, как это было раньше. Нет нужды туда влезать.

Исключение - глянуть disasm для спорных кусков кода и конечно для отладки когда все пошло "по одному месту" ))

 

1 hour ago, std said:

Ну мы же ведем разговор о EMBEDDED разработке

Лет 15 назад в просторах интернетов это слово звучало  очень часто, а сейчас уже не те времена и такой существенной разницы уже пожалуй нет ))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...