реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Много мелких функций или одна большая?
dxp
сообщение Feb 16 2011, 06:42
Сообщение #31


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Само указание ключевого слова inline в декларации функции является подсказкой/предложением компилятору встроить тело функции в точке вызова. Но компилятор имеет полное право сделать по своему усмотрению. Это стандартное поведение.

Некоторые компиляторы вводят расширения (само собой нестандартные) для управления поведением компилятора. Про GCC уже сказали выше, у IAR в документации недвусмысленно сказано:
Цитата
#pragma inline[=forced]

Specifying #pragma inline=forced disables the compiler’s heuristics and forces
inlining
. If the inlining fails for some reason, for example if it cannot be used with the
function type in question (like printf), an error message is emitted.

Т.е. при использовании этой прагмы компилятор обязан встроить функцию. Если он не может по техническим причинам этого реализовать, он должен выдать сообщение об ошибке. Это весьма полезное свойство для embedded области применения.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 16 2011, 06:54
Сообщение #32


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Что характерно - чем вопрос элементарнее, тем дискуссия более оживленная sm.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 16 2011, 08:55
Сообщение #33


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



bb-offtopic.gif
Цитата(_Pasha @ Feb 16 2011, 12:54) *
Что характерно - чем вопрос элементарнее, тем дискуссия более оживленная sm.gif

А это всё в точности по Паркинсону ("Законы Паркинсона", занятная книжка). Там был на эту тему пример про обсуждение на совете директоров трех вопросов: 1. про приобретение какого-то очень дорогостоящего оборудования (на миллионы); 2. строительство навеса для стоянки велосипедов сотрудников; 3. сколько стаканчиков для кофе класть в кофейный автомат. По первому вопросу затраты времени 10 минут, по второму - минут 40, и по третьему - три часа. Объяснение логичное: чем проще вопрос, тем больше народу в нём разбирается. И у каждого есть мнение. sm.gif

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 17 2011, 14:44
Сообщение #34


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(GYUR22 @ Feb 14 2011, 22:22) *
имхо:
Результат в моем случае проверить сложно т.к. размер кода - будет один и тотже -функции используются по разу
а скорость отклика - уарта мне точно померять пока не представляется возможным - точность +/- 1 ms уже не устроит

Ну так забейте на inline если оно настолько некритично для вашего проекта.
Кстати inline'нинье функций далеко не гарантия наиболее высокой скорости исполнения. Например, в процессорах с кеш памятью команд - бездумное инлайнинье там и сям приведет только к замедлению за счет раздувания кода при константном объеме кеш памяти.

Цитата(demiurg_spb @ Feb 15 2011, 19:43) *
Если разить вашу теорию, то и данные предназначенные для помещения в секции EEPROM (это при помощи атрибутов в gcc происходит) ИНОГДА могут оказаться в другой секции.
Это абсурд!

обилие прагм и атрибутов в проекте - это говнокод, а не абсурд, и - кстати таки да данные могут оказаться совсем не в той секции где ожидаешь, при переносе такого проекта на другой проц.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 17 2011, 19:18
Сообщение #35


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(defunct @ Feb 17 2011, 17:44) *
Ну так забейте на inline если оно настолько некритично для вашего проекта.
Кстати inline'нинье функций далеко не гарантия наиболее высокой скорости исполнения. Например, в процессорах с кеш памятью команд - бездумное инлайнинье там и сям приведет только к замедлению за счет раздувания кода при константном объеме кеш памяти.
обилие прагм и атрибутов в проекте - это говнокод, а не абсурд,
Идеологически согласен.
Кстати, Вы видели в моём примере много прагм и атрибутов?
Человек спросил как это сделать - я дал однозначный рецепт.
Потом сюда приплели даже микрософтовский компилятор и кеш инструкций, хотя тема находится в подфоруме микроконтроллеры/AVR
и вопрос касался avr-gcc...

Цитата
и - кстати таки да данные могут оказаться совсем не в той секции где ожидаешь, при переносе такого проекта на другой проц.
Какие Ваши предложения на сей счёт? Отказаться от использования PROGMEM, EEMEM, ISR и вообще не включать компьютер?
Атрибуты в gcc - это почти что основополагающий механизм в случае кросс-компиляции для avr.
Если Вы внимательно читали мои посты, то могли бы подметить, что я рекомендовал оставить лишь квалификатор static, ибо это и необходимо и достаточно для локальных функций.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 17 2011, 20:31
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(demiurg_spb @ Feb 17 2011, 22:18) *
... я рекомендовал оставить лишь квалификатор static, ибо это и необходимо и достаточно для локальных функций.



Да static для локальных функций это просто "хороший тон", чтобы не "заси...ть" пространство имен большого проекта, а вовсе не какая-то необходимость. С одной стороны - хорошо, с другой, их не найдешь в map файле, если понадобится найти точку зависания программы. То, что static - помощь компилятору в деле инлайнинга, вопрос спорный. В одном компиляторе может так, в другом этак.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 18 2011, 09:21
Сообщение #37


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Повторюсь, я говорю о avr-gcc и о контроллерах в которых флеша всегда маловато и рассуждать о удобстве поиска "зависшей программы" мне лично и в голову не приходит. Отладка через консоль на 99 процентов решает любые непонятки, а остальное решается просмотром asm листинга если терзают сомнения в качестве компилятора или в качестве собственной черепушки - что тоже надо признать бывает:-) Это моё ИМХО.

Что-то мы уже по второму кругу пошли...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 18 2011, 13:29
Сообщение #38


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(demiurg_spb @ Feb 18 2011, 12:21) *
Повторюсь, я говорю о avr-gcc и о контроллерах в которых флеша всегда маловато ...


Это очень хорошо, что вы знаток avr-gcc. Но я все равно не понимаю, какое отношение имеет объявление локальной функции как static к объему flash памяти на борту. Что это дает на практике? Расскажите, поделитесь сокровенным.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 18 2011, 20:10
Сообщение #39


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



В gcc, да и думаю во всех современных компиляторах, идёт однозначное встраивание статической функции если она вызывается лишь один раз и отсутствует её вызов по указателю. Также статическая функция, которая при встраивании сопоставима по сложности с загрузкой аргументов, выполнении инструкций call+ret и выгрузкой её результата, может быть встроена даже при неоднократном её вызове. Естественно баланс оптимизации сильно зависит от грамотности настроек компилятора. Вся эта оптимизация на круг даёт существенный выигрыш как по объёму так и по скорости, за что собственно и ратую.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 18 2011, 22:50
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Про все современные компиляторы, как выше упоминалось, это вовсе не факт. А раз это так устроено для AVR - намотаем на ус.

Вообще многие гуру программирования отмечают, что хорошим стилем является написание коротких функций. Компилятор сам может потом решить встраивать их или нет. Да и их тело оптимизировать проще.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 19 2011, 05:01
Сообщение #41


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(sergeeff @ Feb 19 2011, 02:50) *
хорошим стилем является написание коротких функций.

+1
В любом случае, чем меньше повторений кода - тем меньше ошибок, ибо исправления вносятся только один раз. А вложенность статиков пугать не должна, вот с количеством передаваемых параметров - это да, надо с ним воевать.
Go to the top of the page
 
+Quote Post
andron86
сообщение Feb 19 2011, 06:09
Сообщение #42


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821



Цитата(GYUR22 @ Feb 11 2011, 13:39) *
Есть одна большая функция в программе - которую можно поделить на много мелких ...
Вопрос как выгоднее по скорости исполнения - разделить ее на 18 мелких (по смыслу) или оставить как есть?

ИМХО
Разделяется по функциональности. Например функция:
check_port_a() {
i2c_byte_read();
uart2_send_data();
}
на мой взгляд выглядит не плохо.
Что плохо бы смотрелось, это пример:
check_port_a() {
start_i2c_bit();
set_i2c_address();
set_i2c_cmd_byte();
get_i2c_byte();
stop_i2c_bit();
uart2_send_data();
}

По скорости будет примерно одинаково.

Сообщение отредактировал andron86 - Feb 19 2011, 06:13
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 19 2011, 09:02
Сообщение #43


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(sergeeff @ Feb 19 2011, 01:50) *
А раз это так устроено для AVR - намотаем на ус.

Небольшая поправочка:
Это устроено в gcc вообще и в avr-gcc в частности.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 19 2011, 10:11
Сообщение #44


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(demiurg_spb @ Feb 19 2011, 12:02) *
Небольшая поправочка:
Это устроено в gcc вообще и в avr-gcc в частности.


Свет клином на gcc не сошелся. Он, конечно, не стоит на месте, но заморочек с ним все равно хватает.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 19 2011, 13:33
Сообщение #45


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(sergeeff @ Feb 19 2011, 14:11) *
Он, конечно, не стоит на месте, но заморочек с ним все равно хватает.

Каких? biggrin.gif
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 13:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016