Inline это принудительный модификатор или необязательная рекомендация компилятору?

Normas
Offline
Зарегистрирован: 17.05.2017

Хочу для экономии времени заменить вызовы коротких функций на их встраивание и в связи с этим вопрос: модификатор inline принудительный по аналогии с  forcedinline или всего-лишь необязательная рекомендация компилятору ардуино ?

Зависит это от номера версии IDE Arduino или для всех единообразно?

Logik
Offline
Зарегистрирован: 05.08.2014

рекомендация. Не зависит от версии gcc.

Normas
Offline
Зарегистрирован: 17.05.2017

Logik пишет:
рекомендация. Не зависит от версии gcc.
Если функция void(void)   те в стеке ничего не передает и ее внутренние переменные static или глобальные  (для них не надо динамически выделять память) , то сколько команд и главное тактов тратится на вызов и возврат из функции ?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

По 5 тактов.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если у вас длиная функция (получаемый код а не запись на Си ) к примеру 100-200 тактов, то 5 тактов не помогут "отцу росийской демократии". Так что inline лучше применять для функций записаных в ассемблере, потому что команды на Си длиные в получаемом коде.

 Еще вариант ускорить ход программы, то использовать указатель на функции . Это "программые стрелки" по ходу движения программы. 

Normas
Offline
Зарегистрирован: 17.05.2017

Arhat109-2 пишет:
По 5 тактов.

1 такт при частоте 16Мгц =0,0625 мкс , тогда 5+5=10 тактов займут 0,625 мкс ?

Normas
Offline
Зарегистрирован: 17.05.2017

qwone пишет:
Если у вас длиная функция (получаемый код а не запись на Си ) к примеру 100-200 тактов, то 5 тактов не помогут "отцу росийской демократии". Так что inline лучше применять для функций записаных в ассемблере, потому что команды на Си длиные в получаемом коде.
Не длинные, это копирование из регистров в память. На ассемблере писать не хочу тк не владею им в должной степени.

qwone пишет:
Еще вариант ускорить ход программы, то использовать указатель на функции . Это "программые стрелки" по ходу движения программы.

А как это записать на Си  goto по адресу  стрелки (функции), можете показать на примере? И что делать с адресом возврата из функции - записать его в стек и потом возвращаться по нему. Это будет короче 105+5 тактов, о которых  написал Arhat109-2 ?

Arhat109-2 пишет:
По 5 тактов.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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


void short_func() {
  //код короткой функции
}
void long_func() {
  //код длиной функции
  short_func();
}
bool a = 0;
// ....
a = 1; //  0<->1 переключатель
// ....
if (a == 0)long_func();
else short_func();
// ....

А теперь альтернатива

void short_func() {
  //код короткой функции
}
void long_func() {
  //код длинной функции
  short_func();
}
void (*func)();
// ....
func = &short_func; //  &short_func<->&long_func переключатель
// ....
func();// запуск нужной функции.

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В аду есть отдельный котел для тех, кто говорит загадками ;)

"Разоблачайтесь перед партией" - что кипит в вашем мозгу, какую задачу решаете?

Или Вы из той секты, в которой считают, что "незашоренный" дилетант может лучше решить задачу?

Поверьте, если Вы обдумываете что-то интересное, то профессионал всегда подскажет правильное направление и убережет от глупостей.

Normas
Offline
Зарегистрирован: 17.05.2017

wdrakula пишет:
"Разоблачайтесь перед партией" - что кипит в вашем мозгу, какую задачу решаете
Делаю некоммерческий проект -  лабораторную работу по исследованию вибраций корпуса вала для моего бывшего институтсткого преподавателя.

Сначала оцифровка примерно с частотой 30 кГЦ,  буферизация в FIFO,  и передача данных. Обработка и анализ собранных данных будут  на втором этапе наверное на PC преобразованиями Фурье (методика анализа определится позже). Сейчас озабочен первым этапом.

Оцифровку уже написал  по прерыванию таймера. Для увеличения скорости, чтобы не ждать внутри прерывания окончания цикла работы ADC,   сделал  "наоборот" - при входе в прерывание считываю показания предыдущего цикла ADC, а перед окончанием прерывания запускаю новый цикл. Частоту подобрал так, чтобы к следующему прерыванию ADC гарантированно завершил предыдущий цикл преобразования. 

Для анализа частот вибраций и биений  очень важна точная дискретизация по времени, а на точность преобразования пока  решено не обращать внимания и будем довольствоваться  8 бит.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Шикарно и все првильно.

Набирайте буфер, 1024-2048 байта - нормально. Потом останавливайте сбор и отправляйте на комп. 

делайте сбор с разными частотами, вот почему:

30 КГц 1000 семплов - даст спектр от 30 Гц до 30 КГц. Реально от 300, Для более низких частот - соберите 1000 семплов на 3КГц, на 300Гц. Получите и низкочастотные составляющие тоже.

-----------------------

Но работая на АЦП АтМеги, Вы не выйдете за пределы звуковых частот, а чем тогда звуковая карта не устраивает? ;) там даже до 40 КГц.

Если хотите частоту выборки выше - придется брать другой камень, не хочу произносить запрещенные слова, но придется брать СТМ32 ;).

Normas
Offline
Зарегистрирован: 17.05.2017

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

wdrakula пишет:
30 КГц 1000 семплов - даст спектр от 30 Гц до 30 КГц. Реально от 300, Для более низких частот - соберите 1000 семплов на 3КГц, на 300Гц. Получите и низкочастотные составляющие тоже.

Семпл= измерение  ? 1000 измерений для анализа длинного переходного процесса  маловато будет  :-)

wdrakula пишет:
Но работая на АЦП АтМеги, Вы не выйдете за пределы звуковых частот, а чем тогда звуковая карта не устраивает? ;) там даже до 40 КГц.
Не хочется заниматься сопряжением измерительного элемента с картой, когда есть готовый ИЭ с хорошим выходом (сам сделал).

wdrakula пишет:
Если хотите частоту выборки выше - придется брать другой камень, не хочу произносить запрещенные слова, но придется брать СТМ32 ;).
Чем он лучше ARM кроме цены ?  Библиотек для него наверное в разы меньше, а если с ним случится какой затык - у кого проконсультироваться ?  

Normas
Offline
Зарегистрирован: 17.05.2017

wdrakula пишет:
делайте сбор с разными частотами
так и хочу - брать  одновременно на несколько контроллеров с разными частотами дискретизации АЦП

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

использовать указатель на функции .

И эти люди что-то имеют против безобидного goto? Куда катится этот мир? :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Normas пишет:

а если с ним (STM) случится какой затык - у кого проконсультироваться ?  

Как???? Вы не знаете у кого???? Охххх ..... есть тут у нас специалист :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1. сопряжение со звуковой картой??? амплитуда 1-2В и отсеечь постоянную составляющую конденсатором? Сложно, не спорю. Программировать Ардуино на пределе ее возможностей конечно проще.

Скажиту уж честно, никто ведь не осуждает - Вам просто интересно освоить новый предмет.

Это и есть, для большинства из нас - главная и определяющая цель. Нечего этого стесняться.

2. СТМ32 это и есть АРМ - просто самый доступный из них. АЦП у него на 1 МГц. Доступных библиотек - не меньше чем для Ардуино. Немного сложнее "вникнуть". ну... если ардуино - велосипед, то СТМ32 даже не скутер, а так... велик-с-моторчиком, аналогия понятна?

НО!!! Это предмет вечного и непрекращающегося холивара на этом форуме. Поэтому дальше не стану.

Большинство тут (завсегдатаи форума) программирует на обоих контроллерах, под задачу, но есть уникумы на обоих концах. Вот когда они сходятся - начинают сверкать молнии! Очень забавно бывает. ;) Вы - новенький, еще увидите....

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Normas пишет:

а если с ним (STM) случится какой затык - у кого проконсультироваться ?  

Как???? Вы не знаете у кого???? Охххх ..... есть тут у нас специалист :)

Женя!!!!! Не будите лихо!!!!!!!!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Normas пишет:

а если с ним случится какой затык - у кого проконсультироваться ?  

На радиокоте и изиэлектрониксе есть разделы по ARM и STM32:

http://radiokot.ru/forum/viewforum.php?f=59&sid=306ba8d5152712a6c9f686f4272d5c41

http://forum.easyelectronics.ru/viewforum.php?f=35

Правда большинство программирует их не в Arduino IDE, а в более серьёзных IAR, KEIL.

 

ssss
Offline
Зарегистрирован: 01.07.2016

ЕвгенийП пишет:

Как???? Вы не знаете у кого????

У а5021 или у Архата... они всем про всё расскажут... ))))))))

ssss
Offline
Зарегистрирован: 01.07.2016

Normas пишет:

wdrakula пишет:
делайте сбор с разными частотами
так и хочу - брать  одновременно на несколько контроллеров с разными частотами дискретизации АЦП

И сколько их вам нужно, для полного счастья?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

wdrakula пишет:

ЕвгенийП пишет:

Normas пишет:

а если с ним (STM) случится какой затык - у кого проконсультироваться ?  

Как???? Вы не знаете у кого???? Охххх ..... есть тут у нас специалист :)

Женя!!!!! Не будите лихо!!!!!!!!

поздно... Ну... поехали! Попкорн?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ахах, у ssss походу парсер форума настроен :-) Как только в новой теме встречается словосочетание "STM32" - на мыло сразу отправляется письмо, что кто-то на форуме упомянул STM32 :-)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Jeka_M пишет:

Ахах, у ssss походу парсер форума настроен :-) Как только в новой теме встречается словосочетание "STM32" - на мыло сразу отправляется письмо, что кто-то на форуме упомянул STM32 :-)

ssss анально проклят Arduino до седьмого колена - его внуки и праправнуки будут ходить сюда бессмертным полком с портретом дохлого дедавоеала ssss.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

поздно... Ну... поехали! Попкорн?

Ну, а чё? Щас нам расскажут как всё делать правильно и кошерно, а мы послушаем :)

Logik
Offline
Зарегистрирован: 05.08.2014

Почитал. Тема - хороший пример того как кривую архитектуру пытаются спасти чудесами оптимизации. А хрен оно выйдет.

Скажите, Normas, зачем Вам буфер? Чтоб было чем заморочится и форум баламутить?

И прерывания в топку, это слишком медлено для задачи.

Делаете так, открываете даташит и смотрите максимально достижимую скорость на uart и с АЦП. Кто из них медленей, тот и будет определять скорость работы. Скорость каравана определяется скоростю самого медленого верблюда ;) В коде запрещаете прерывания, вобще все. Пишите коротюсенький вечный (или почти вечный) цикл в котором::

1. проверяете что медленейшее из  uart и АЦП завершило работу, если не завершило, то перейти на п.1

2. выгребаете свой байт с АЦП и пихаете его в uart, стартуете новое преобразование АЦП и переходите к п.1

ПС. Полезно еще посмотреть, сможет ли ПК принимать на той скорости, на которую uart настроите.

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

Почитал. Тема - хороший пример того как кривую архитектуру пытаются спасти чудесами оптимизации. А хрен оно выйдет.

Ну кривая, ну убогая, ну и хрен с ней! Это уже ТСа проблемы.

Цитата:

Делаете так, открываете даташит и смотрите максимально достижимую скорость на uart и с АЦП. Кто из них медленей, тот и будет определять скорость работы. Скорость каравана определяется скоростю самого медленого верблюда ;) В коде запрещаете прерывания, вобще все. Пишите коротюсенький вечный (или почти вечный) цикл в котором::

1. проверяете что медленейшее из  uart и АЦП завершило работу, если не завершило, то перейти на п.1

2. выгребаете свой байт с АЦП и пихаете его в uart, стартуете новое преобразование АЦП и переходите к п.1

ПС. Полезно еще посмотреть, сможет ли ПК принимать на той скорости, на которую uart настроите.

Ну и чем ваша хрень лучше ТСовской?

Цитата:

Оцифровку уже написал  по прерыванию таймера. Для увеличения скорости, чтобы не ждать внутри прерывания окончания цикла работы ADC,   сделал  "наоборот" - при входе в прерывание считываю показания предыдущего цикла ADC, а перед окончанием прерывания запускаю новый цикл. Частоту подобрал так, чтобы к следующему прерыванию ADC гарантированно завершил предыдущий цикл преобразования.

По таймеру в принципе кошернее будет. А то что майн пустой будет - ну и хрен с ним.

Тем более ТС этим озабочен.

Цитата:

Для анализа частот вибраций и биений  очень важна точная дискретизация по времени, а на точность преобразования пока  решено не обращать внимания и будем довольствоваться  8 бит.

В случае СТМ32 это будет всё ещё проще, без прерываний - ТИМ-АЦП-ДМА-ЮАРТ.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ssss пишет:

В случае СТМ32 это будет всё ещё проще, без прерываний - ТИМ-АЦП-ДМА-ЮАРТ.

А ведь он прав! (голосом губернатора из "Тот самый Мюнхгаузен") ;) Мало того, это еще можно спокойно на 100КГц сделать, в теории и на 1МГц, то тут есть сложности.

(.... эт я маслица в костер подливаю...)

ssss
Offline
Зарегистрирован: 01.07.2016

wdrakula пишет:

еще можно спокойно на 100КГц сделать, в теории и на 1МГц

На 1МГц АЦП уже ЮАРТ узким горлышком станет. Копеечного STM32F0 (6 Mbit/s) может не хватить. Тогда уже или STM32F303K6 нужно будет брать (9 Mbit/s), или типа STM32F446 (11.25 Mbit/s).

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ssss пишет:

На 1МГц АЦП уже ЮАРТ узким горлышком станет. Копеечного STM32F0 (6 Mbit/s) может не хватить. Тогда уже или STM32F303K6 нужно будет брать (9 Mbit/s), или типа STM32F446 (11.25 Mbit/s).

Ты эт... давай про Ф4 не говорить пока?  В ценовой и экологической нише Ардуино останемся. Это значит не голый камень, а хоть на какой-то девборде и в цену до 500р, ОК?

Штоп под него и Куб был и СТ-Линк и так далее. То есть уровень Ардуино сохраним.

ssss
Offline
Зарегистрирован: 01.07.2016

Ну тогда взять тривиальный шилд с STM32F103С8 (4.5 Mbit/s), их как грязи, и попробовать поднять ему ЮАРТ до 9 Mbit/s.

Logik
Offline
Зарегистрирован: 05.08.2014

ssss пишет:

Цитата:

Делаете так, открываете даташит и смотрите максимально достижимую скорость на uart и с АЦП. Кто из них медленей, тот и будет определять скорость работы. Скорость каравана определяется скоростю самого медленого верблюда ;) В коде запрещаете прерывания, вобще все. Пишите коротюсенький вечный (или почти вечный) цикл в котором::

1. проверяете что медленейшее из  uart и АЦП завершило работу, если не завершило, то перейти на п.1

2. выгребаете свой байт с АЦП и пихаете его в uart, стартуете новое преобразование АЦП и переходите к п.1

ПС. Полезно еще посмотреть, сможет ли ПК принимать на той скорости, на которую uart настроите.

Ну и чем ваша хрень лучше ТСовской?

Если дебилам это осталось непонятно - то знач я все правильно изложил.

ssss пишет:

Цитата:

Для анализа частот вибраций и биений  очень важна точная дискретизация по времени, а на точность преобразования пока  решено не обращать внимания и будем довольствоваться  8 бит.

В случае СТМ32 это будет всё ещё проще, без прерываний - ТИМ-АЦП-ДМА-ЮАРТ.

Точность дискретизации по описаному алгоритму составит +-несколько тактов, можна и точней сказать, не охота даташит открывать. Все предсказуемо и пргнозируемо. А проявив некоторую сообразительность (бля, кому я про это пишу?!) легко доводится до теоретически возможного +-0,5 такта. А на кривом STM, с непредсказуемым временем выполнения кода, действительно единственный шанс хоть чето получит - завязыватся на таймер. Но зачем же проблемы убогих тянуть на ардуину. 

ssss
Offline
Зарегистрирован: 01.07.2016

Дебилам можешь изЛАЖАть как хочешь, только в этом смысла никакого нет, даже если они тебе в ладоши будут хлопать.

Нафиг что-то проверять? Это тупоупоротые АВРовские привычки уже давно за гранью дебилизма, но тебе уже назад дороги нет.

Logik
Offline
Зарегистрирован: 05.08.2014

ssss пишет:

Дебилам можешь изЛАЖАть как хочешь, только в этом смысла никакого нет..

Именно так. Нет смысла. Потому я и не стал тебе обяснять чем описаный алгоритм лучше чем тот с циклическим буфером и прерываниями ;) Спокойной ночи.

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

до теоретически возможного +-0,5 такта.

Песши ысчо! Это какая команда у АВР выполняется за 0,5 такта? Не годится! Для дебилов нужно 0,0005 такта, ты сможешь! Дерзай! ))))))))))))))))))

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Эх, Евгений, евгений .. ну и как, послушали? :)

Читаем вдумчиво тему Пультоскоп в проектах, смотрим скетч и внезапно обнаруживаем что предельная частота тактирования АЦП у Мег лежит .. внезапно в районе 7Мгц. Делим эту чиселку на 13 тактов оцифровки и получаем частоту снятия данных с АЦП Ардуино .. около 540 килогерц. Это всем тем у кого"только звуковые частоты". Да, ещё обнаруживаем что младшие меги оверклокаются аж до 32Мгц ..

ssss
Offline
Зарегистрирован: 01.07.2016

И что там от АЦП остаётся? 6 разрядов? Да и ЮАРТ укакается. "Доктор сказал в морг, значит в морг!"(с).

Logik
Offline
Зарегистрирован: 05.08.2014

Arhat109-2 пишет:

 обнаруживаем что предельная частота тактирования АЦП у Мег лежит .. внезапно в районе 7Мгц. Делим эту чиселку на 13 тактов оцифровки и получаем частоту снятия данных с АЦП Ардуино .. около 540 килогерц. 

А нафига оно здесь надо. Напомню - меряем вибрации. А это не такие уж высокие частоты - сотни герц, максимум единицы килогерц. Там частота дискретизации, преславутые 76КГц, и так с большим запасом. А если без запаса - uart на 115200,  получаем дискретизацию 11КГц и отсутствие проблем по приему на ПК как впрочем и по всему остальному тракту передачи. Простая скучнющая задача. А вы (не вы лично Arhat109-2, разумеется) устроили литургию с вакханалией ;) А уж зачем этого тупого демона было в тему вызывать? Срача захотелось шоле..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Так и USART на мегах вполне способен пахать на 2Мгц .. иное дело кто его принять сможет .. :)

Logik
Offline
Зарегистрирован: 05.08.2014

отож. Не, ну в принципе есть платы расширения. Но опять,  зачем? Зачем выбират сложный путь, если все решается и простым.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну почему не показать ТС-у, что inline его В ПРИНЦИПЕ беспокоить не должен .. не тот уровень знаний, как-бэ :)

Logik
Offline
Зарегистрирован: 05.08.2014

Arhat109-2 пишет:

Ну почему не показать ТС-у, что inline его В ПРИНЦИПЕ беспокоить не должен .. 

Это точно )))

Кстати, а где он?

Испужался наверно.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ну вот! Я так старался, а холивар загнулся.... аппидыно, да?

А по делу - там вообще контроллер не нужен - звуковой карты достаточно. У нее и разрядность выше и АЦП лучше. Если синхронизировать с чем-то (например с оборотами вала), то запустить синхру во второй канал, Благо все карты - стерео. И хоть обанализируйся.