|
IAR Inline, Как заставить ? |
|
|
|
Jul 20 2017, 09:53
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Кстати, gcc с опцией -flto инлайнит направо и налево без всяких подсказок, ЕМНИП. В дизассемблере такое месиво получается, что ничего не понятно. Видимо, яр работает несколько иначе. Во всяком случае, обычно считалось, что компилятор может инлайнить только то, что видит в пределах компилируемого файла, что логично. И не факт, что multifile compilation отменяет это ограничение.
|
|
|
|
|
Jul 20 2017, 10:08
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Цитата Кстати, gcc с опцией -flto инлайнит направо и налево без всяких подсказок, ЕМНИП. В дизассемблере такое месиво получается, что ничего не понятно. Да если все в одном модуле и объявлено как static то так же все получается. В дизассемблере сначала идет портянка сишного кода(ввиде коментарий) а потом голый ассемблер, что даже не понятно какая строчка СИ во что преобразовалась. Цитата Во всяком случае, обычно считалось, что компилятор может инлайнить только то, что видит в пределах компилируемого файла, что логично. И не факт, что multifile compilation отменяет это ограничение. Ага увы, поспихал почти все обратно в один модуль, только что ещё раз отключил галку Function inlining ровно 500 тактов прибавилось.
|
|
|
|
|
Jul 20 2017, 12:36
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(pokk @ Jul 20 2017, 12:48)  float апаратный Даже если аппаратный. Вы как бы совсем не задумывались, что используя float внутри ISR, необходимо сохранить/восстановить контекст FPU на входе/выходе ISR? А например на Cortex-M этот контекст в разы больше чем стандартный сохраняемый контекст. Время этого сохранения/восстановления будет много больше чем выигрыш от inline вашей функции. Да надеюсь у Вас этот контекст вообще - сохраняется/восстанавливается?  Цитата(pokk @ Jul 20 2017, 13:08)  Ага увы, поспихал почти все обратно в один модуль, только что ещё раз отключил галку Function inlining ровно 500 тактов прибавилось. Да ладно здесь байки рассказывать! На вызов/возврат из функции (две команды CALL/BX LR) тратится +500 тактов??? Здесь всё-таки не форум кухарок....
|
|
|
|
|
Jul 21 2017, 02:00
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Цитата(jcxz @ Jul 20 2017, 15:36)  Да надеюсь у Вас этот контекст вообще - сохраняется/восстанавливается?  Неа не сохраняется так как прием,обработка и выдача, сразу в прерывании, а маин пустой. Цитата См. сообщения #5 и #6. Это был частный случий. Самый простой. А так да всего около 20 вызовов функции  Структура обработчика примерна такая: Код void Handler_adc(void){ uint8_t i; uint32_t sample; float32_t Result; sample=ADC; // Считали значение АЦП filtr1(sample); filtr3(sample); for(i=0;i<15;i++){ Result=filtr4(sample); Result=calc(Result); Result=convert(Result); } SendResult(); // Установка DMA }
|
|
|
|
|
Jul 21 2017, 07:39
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(pokk @ Jul 21 2017, 06:00)  Структура обработчика примерна такая: Код … Вот прям нужно ЦОС на скорости получения данных от АЦП? А "заполнение буфера-->ЦОС в буфере" не вариант, да?
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jul 21 2017, 07:58
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(pokk @ Jul 21 2017, 05:00)  Неа не сохраняется так как прием,обработка и выдача, сразу в прерывании, а маин пустой. Ну ок. Конечно только если FPU используется только в одном ISR? Иначе - "Шеф, всё пропало!"  Конечно странно - зачем запихивать фильтры (вроде оно там у Вас?) и прочее в ISR? У Вас есть уверенность, что данные успеют обработаться до следующего прерывания от АЦП? И обработаться при любом стечении обстоятельств (других обработчиков прерываний)? Обычно в ISR просто кладут данные в кольцевой буфер, а обрабатывают их неспеша в менее приоритетном процессе (это может быть задача ОС или даже другое программно активизируемое прерывание с меньшим приоритетом (меньшим чем любое аппаратное прерывание)). Я конечно делал так в одном проекте как-то давно, но там весь код обработчика (и ЦОС) был написан на ассемблере (а значит была уверенность в стабильности времени его работы). И там была острая нехватка ОЗУ в МК.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|