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

 
 
 
Reply to this topicStart new topic
> Не инлайнится функция
Dog Pawlowa
сообщение Sep 5 2009, 18:19
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



IAR MSP430 4.10
Функция вот такая (сорри за синтаксис - выдернуто после препроцессора)

Код
#pragma inline
unsigned int Sensor(unsigned char sensor_num)
{ switch (sensor_num) {
case HighInputPressure: return (sensors & bHighInputPressure);
case CanFull: return (sensors & bCanFull);
case CanShorted: return (sensors & bCanShorted);
case WaterCounter: return (sensors & bWaterCounter);
case LeakageOn: return (sensors & bLeakageOn);
case LowPower: return (sensors & bLowPower);
case ConcCounter: return (sensors & bConcCounter);
case LowOutputPressure: return (sensors & bLowOutputPressure);
case HighOutputPressure: return (sensors & bHighOutputPressure);
case MaxOutputPressure: return (sensors & bMaxOutputPressure);
case ExtraOutputPressure: return (sensors & bExtraOutputPressure);
} return 0;}


В качестве параметра функции параметр enum - то есть известен на этапе компиляции.

В похожей ситуации ситуации IAR AVR 5.11 все разруливал.
Оптимизация максимальная по скорости со всеми галками.
Есть шанс как-то подтолкнуть компилятор, или ?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 5 2009, 18:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата
Есть шанс как-то подтолкнуть компилятор, или ?

#pragmа inline=forced
unsigned int Sensor(unsigned char sensor_num);

..........
..........


unsigned int Sensor(unsigned char sensor_num)
{
.......
}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 5 2009, 18:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(zltigo @ Sep 5 2009, 21:27) *
#pragmа inline=forced

Спасибо. Переклинило в субботний вечер sad.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 5 2009, 19:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Причем,полагаю, без =forced тоже теперь работает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 5 2009, 19:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(zltigo @ Sep 5 2009, 22:03) *
Причем,полагаю, без =forced тоже теперь работает.


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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 5 2009, 20:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dog Pawlowa @ Sep 5 2009, 21:52) *
Нет, дело именно в этом. А вот прототип функции не нужен.
.....на неполную (ну раз не работало) прагму.

Правила игры описаны в CompilerRefrence
Цитата
Use this pragma directive to advise the compiler that the function whose declaration
follows immediately after the directive should be inlined—that is, expanded into the
body of the calling function. Whether the inlining actually takes place is subject to the
compiler’s heuristics.

И вообще,работать без прототипов по любому моветон.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 6 2009, 05:15
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(zltigo @ Sep 5 2009, 23:43) *
И вообще,работать без прототипов по любому моветон.

Наверное, но с учетом поведения компилятора все как-то неоднозначно и непонятно.
Например, при размещении тела функции с модуле и при указании inline=forced для прототипа в хэдере я ожидал, что компилятор молча (или не молча) проглотит, естественно, не инлайня (поскольку тела функции в месте компиляции нет), а директива инлайн не является безусловной.
Оказалось нечто странное:
Error[e46]: Undefined external "Sensor" referred in k_calibr ( D:\Work\TypeKmerged\Debug\Obj\TypeK\k_calibr.r43 )

Ну да ладно, все работает.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th June 2025 - 09:59
Рейтинг@Mail.ru


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