Easyelectronics.ru

Электроника для всех
Текущее время: 20 июн 2019, 14:24

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Keil и __INLINE
СообщениеДобавлено: 25 мар 2018, 20:24 
Только пришел

Зарегистрирован: 25 мар 2018, 20:00
Сообщения: 5
Доброго времени суток!

Использую uVision5, с бесплатной лицензией на stm32f0. Ну и как водится, первый проект весь в граблях, но с одними я никак совладать не могу.
Не понятное поведение с инлайн-функциями. В main.c определены с __INLINE три функции инициализации периферии, к двум из них у кайла вопросов нет, а третья не вызывает Error: L6218E: Undefined symbol ClockInit (referred from main.o) только если включить Optimize for Time и минимум -O1. Пробовал в отдельный хедер вынести, и функцию переименовать - результат тот же. Если убрать __INLINE ошибок не возникает.
Вроде и цена вопроса - 20 байт разницы, но как-то нехорошо это..

UPDATE: Небольшая подвижка - если в том же main.c убрать __INLINE от реализации функции и сделать её объявление с __INLINE проблема пропадает. Но всё же странно, почему с другими функциями такого делать не надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 26 мар 2018, 14:23 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2589
Откуда: Санкт-Петербург
Телепаты в отпуске (без исходника что-то понять), но рискну предположить, что разное поведение связано с тем, что в зависимости от уровня оптимизаций для некоторых функций inline срабатывает, а для некоторых нет (inline - не жёсткое предписание, а "рекомендация" компилятору).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 26 мар 2018, 15:40 
Только пришел

Зарегистрирован: 25 мар 2018, 20:00
Сообщения: 5
Что это рекомендация в курсе, везде об этом пишут, но не думаю, что отказ компилятора инлайнить может стать поводом для ошибок. И тем более менять своё поведение при использовании inline с объявлением функции, при этом функция инлайнится, это видно по размеру прошивки с inline и без.
Можно оставить и как есть, но не красиво как то будет, в одном файле с реализацией функции тут же делать её же объявление с inline. Исходник вечером покажу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 26 мар 2018, 17:45 
Старожил

Зарегистрирован: 10 апр 2013, 17:41
Сообщения: 287
Вроде как компилятор сам инлайнит что ему надо при включенной оптимизации.

_________________
Стиль: "G&P"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 26 мар 2018, 18:25 
Только пришел

Зарегистрирован: 25 мар 2018, 20:00
Сообщения: 5
Вроде как да, на о3 должно почти всё анализироваться на возможность заинлайнить, но именно с этой функцией есть разница в объёме используемой флеши с inline и без.

Исходник:
Show


Проблемная функция ClockInit, вызов родного SystemInit в стартапе отключен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 26 мар 2018, 20:42 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2589
Откуда: Санкт-Петербург
Напишите вместо "__INLINE" "static __INLINE" - поможет? Если да - поясню возможные приколы (хотя вроде при нынешних стандартах на язык их быть не должно)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 26 мар 2018, 21:39 
Только пришел

Зарегистрирован: 25 мар 2018, 20:00
Сообщения: 5
aamonster писал(а):
Напишите вместо "__INLINE" "static __INLINE"


Сие магия великая есть! Помогло!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 27 мар 2018, 13:33 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2589
Откуда: Санкт-Петербург
Обещаные пояснения.
Много писать мне лень, поэтому для начала - https://gist.github.com/htfy96/50308afc ... 6aa60d5f75 (особенно раздел "Conclusion").
А теперь немного по русски:
1. Если написано inline - компилятор _может_ заинлайнить функцию (а может и не заинлайнить); однако он не знает, не используется ли эта функция за пределами модуля, поэтому "на всякий случай" делает и не-инлайновую версию функции, которую линкер может задействовать для других модулей и для тех мест в этом модуле, которые не заинлайнились (а при соответствующих опциях линкера - выкинуть, если "не пригодилась").
Особенно шикарно это смотрится, когда функция объявлена в h-файле - если он включён в несколько c-файлов, то у нас получается несколько экземпляров такой функции. Поэтому, чтобы не выдавать в этом случае сообщение об ошибке, они помечаются как "WEAK", и линкер выберет из них бог весть какой (а если в нескольких местах у вас разное тело функции - это вообще Undefined Behavior)
В вашем случае на первый взгляд кажется, что компилятор решил, что функция везде инлайнится, поэтому тело ей не нужно, а потом передумал её инлайнить (как бы не проблема при нормальном поведении: ведь не-инлайн версию функции он тоже должен был собрать). Но я могу ошибаться.
2. Если написано static inline - компилятор знает, что эта функция используется только в рамках данного модуля. Так что тут всё гораздо проще: если она инлайнится - тело точно не нужно, если не инлайнится - нужно. Нет никаких непоняток. Не надо смотреть - а не определена ли функция где-то в другом месте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Keil и __INLINE
СообщениеДобавлено: 28 мар 2018, 08:36 
Только пришел

Зарегистрирован: 25 мар 2018, 20:00
Сообщения: 5
Благодарю за пояснения и ссылку!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Alexrusneft


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB