Easyelectronics.ru

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

Часовой пояс: 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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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