|
научить IAR AVR 5.5 оптимизировать сохранение регистров, при вызове между модулями |
|
|
|
Jul 13 2012, 12:10
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(megajohn @ Jul 12 2012, 12:22)  я уже и так inline static void app_init( void )
и так #pragma inline = forced void app_init( void )
но не работает. Как правильно ? Правильно вроде так Код #pragma inline = forced inline void app_init( void ) { } UDP: Такой вариант получается тоже правильный: Код #pragma inline = forced void InterruptFunction( void ) // вызывается в прерывании {} InterruptFunction надо располагать в h-файле и тогда не все 16 регистров сохраняются (у меня штук 6), в отличие от случая если InterruptFunction находится в с-файле.
|
|
|
|
|
Jul 13 2012, 18:44
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Ещё нашёл два варианта inline: 1. Код #define PRAGMA(x) _Pragma( #x ) #define INLINE PRAGMA( inline=forced ) static 2. Код #define INLINE _Pragma("inline=forced") inline Но какой из них правильней и предпочтительней?
|
|
|
|
|
Jul 13 2012, 19:38
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(_Артём_ @ Jul 13 2012, 22:44)  Но какой из них правильней и предпочтительней? С точки зрения переносимости кода правильнее применять макросы, так как в стандартном языке Си нет такой штуки, как inline. С точки зрения вредной преждевременной оптимизации вообще не надо применять ни inline, ни макросы. Применять их надо начинать только тогда, когда доказано, что от них будет реальная (а не воображаемая) польза.
|
|
|
|
|
Jul 13 2012, 20:47
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(scifi @ Jul 13 2012, 23:13)  Даже оставляя в стороне тот факт, что хороший компилятор (а Яр обычно такие и делает) в такой ситуации сам сделает inline без подсказки ИАР конечно хороший компилятор, но без подсказки inline не сделает (для АВР). Цитата(scifi @ Jul 13 2012, 23:13)  прежде чем экономить код и время исполнения, нужно убедиться, что эта экономия нужна. Далеко не каждая программа реально ограничена по размеру кода или времени исполнения. Преждевременная оптимизация вредна, так как отвлекает внимание и время на несущественные задачи (выгадать байт или микросекунду там, где это никому не нужно). Да, согласен - не врегда нужно ужимать программу и да, отвлекает. Но часто заранее известно что нужно ужимать.
|
|
|
|
|
Jul 14 2012, 10:48
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(scifi @ Jul 13 2012, 22:38)  в стандартном языке Си нет такой штуки, как inline. Цитата 6.7.4 Function specifiers Syntax 1 function-specifier: inline С момента принятия стандарта C99 прошла дюжина лет. С тех пор «стандартный» С мог бы и иметь inline. «старостандартный» может и не иметь. Но я давно с такими не работал. Цитата( @ Jul 13 2012, 23:13)  это по-прежнему преждевременная оптимизация Как правило, применение inline столь же очвидно, как и применение для конкретного контроллера 8 (16) - битного типа вместо 16 (32) - битного. Хотя можно не заниматься преждевременной оптимизацией и для всех переменных брать long. «а вот заработает — посмотрим, какой из переменных какой диапазон нужен на самом деле»
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 16 2012, 05:51
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(_Артём_ @ Jul 15 2012, 21:54)  Есть примеры компиляторов которые сами делают function inlining? К примеру, static функция, если вызывается только однажды, подставляется в месте вызова. Это яр для арм, а также coldfire. Если включить оптимизацию по скорости, я бы ожидал, что маленькую функцию будет подставлять, даже если она вызывается много раз. Но не проверял, скажу честно.
|
|
|
|
|
Jul 16 2012, 13:03
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(scifi @ Jul 16 2012, 08:51)  К примеру, static функция, если вызывается только однажды, подставляется в месте вызова. Это яр для арм, а также coldfire. Оказалось, что для АВР тоже работает. Но функция обязательно должна быть static. Цитата(scifi @ Jul 16 2012, 08:51)  Если включить оптимизацию по скорости, я бы ожидал, что маленькую функцию будет подставлять, даже если она вызывается много раз. Нет. Для АВР не подставляет.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|