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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> IAR Inline, Как заставить ?
scifi
сообщение Jul 20 2017, 08:31
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Jul 20 2017, 11:22) *
И когда избавитесь от float, увидите, что inline даёт сущие крохи по сравнению с float. И об inline надо думать уже в последнюю очередь (при оптимизации по скорости).

+1. Если там плавучка не аппаратная, то все эти инлайны будут как мёртвому припарка.
Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 20 2017, 09:48
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



float апаратный, а на инлайнах теряется около 500 тактов из всего 4700, хотя пока есть запас в 1700, но чем больше тем лучше.



Сообщение отредактировал pokk - Jul 20 2017, 09:53
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 20 2017, 09:53
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Кстати, gcc с опцией -flto инлайнит направо и налево без всяких подсказок, ЕМНИП. В дизассемблере такое месиво получается, что ничего не понятно. Видимо, яр работает несколько иначе. Во всяком случае, обычно считалось, что компилятор может инлайнить только то, что видит в пределах компилируемого файла, что логично. И не факт, что multifile compilation отменяет это ограничение.
Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 20 2017, 10:08
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата
Кстати, gcc с опцией -flto инлайнит направо и налево без всяких подсказок, ЕМНИП. В дизассемблере такое месиво получается, что ничего не понятно.

Да если все в одном модуле и объявлено как static то так же все получается. В дизассемблере сначала идет портянка сишного кода(ввиде коментарий) а потом голый ассемблер, что даже не понятно какая строчка СИ во что преобразовалась.

Цитата
Во всяком случае, обычно считалось, что компилятор может инлайнить только то, что видит в пределах компилируемого файла, что логично. И не факт, что multifile compilation отменяет это ограничение.

Ага увы, поспихал почти все обратно в один модуль, только что ещё раз отключил галку Function inlining ровно 500 тактов прибавилось.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 20 2017, 12:36
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(pokk @ Jul 20 2017, 12:48) *
float апаратный

Даже если аппаратный. Вы как бы совсем не задумывались, что используя float внутри ISR, необходимо сохранить/восстановить контекст FPU на входе/выходе ISR? А например на Cortex-M этот контекст в разы больше чем стандартный сохраняемый контекст. Время этого сохранения/восстановления будет много больше чем выигрыш от inline вашей функции.
Да надеюсь у Вас этот контекст вообще - сохраняется/восстанавливается? biggrin.gif

Цитата(pokk @ Jul 20 2017, 13:08) *
Ага увы, поспихал почти все обратно в один модуль, только что ещё раз отключил галку Function inlining ровно 500 тактов прибавилось.

Да ладно здесь байки рассказывать! rolleyes.gif
На вызов/возврат из функции (две команды CALL/BX LR) тратится +500 тактов???
Здесь всё-таки не форум кухарок.... laughing.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 20 2017, 13:42
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Jul 20 2017, 15:36) *
На вызов/возврат из функции (две команды CALL/BX LR) тратится +500 тактов???
Здесь всё-таки не форум кухарок.... laughing.gif

Рискуете прослыть кухаркой, уважаемый.
Если, скажем, вызовов штук 20, да ещё принять во внимание Wait States, то ничего невероятного тут нет.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 20 2017, 14:08
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jul 20 2017, 16:42) *
Если, скажем, вызовов штук 20, да ещё принять во внимание Wait States, то ничего невероятного тут нет.

См. сообщения #5 и #6.

PS: Не ну конечно можно предположить, что у ТС CPU выполняет код из внешней флешь, подключенной по SPI и работающей на низкой SCLK и без кеширования.
В случае такого изврата конечно - каждый такт на счету и может и всего один вход/выход в функцию потянуть на 500+ тактов biggrin.gif
Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 21 2017, 02:00
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата(jcxz @ Jul 20 2017, 15:36) *
Да надеюсь у Вас этот контекст вообще - сохраняется/восстанавливается? biggrin.gif

Неа не сохраняется так как прием,обработка и выдача, сразу в прерывании, а маин пустой.



Цитата
См. сообщения #5 и #6.

Это был частный случий. Самый простой.
А так да всего около 20 вызовов функции wink.gif
Структура обработчика примерна такая:
Код
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
}


Go to the top of the page
 
+Quote Post
x893
сообщение Jul 21 2017, 02:23
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



А что бы не взять профайлер и посмотреть ?
Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 21 2017, 04:31
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Я через St-link программирую а он его кажись не поддерживает =(
Пробовал в симуляторе запускать, функцию Handler_adc закинул в while(1) до инициализации АЦП, но там мне он что-то от начала выдавал количество тактов, и в упор не хотел показывать сколько тактов выполняется каждая функция
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 21 2017, 04:59
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(pokk @ Jul 21 2017, 07:31) *
Пробовал в симуляторе запускать, функцию Handler_adc закинул в while(1) до инициализации АЦП, но там мне он что-то от начала выдавал количество тактов, и в упор не хотел показывать сколько тактов выполняется каждая функция

У многих кортексов есть счётчик циклов. Поэтому можно тупо записать в массив засечки:
Код
timestamp[i++] = DWT->CYCCNT;
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 21 2017, 07:39
Сообщение #27


Знающий
****

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



Цитата(pokk @ Jul 21 2017, 06:00) *
Структура обработчика примерна такая:
Код

Вот прям нужно ЦОС на скорости получения данных от АЦП?
А "заполнение буфера-->ЦОС в буфере" не вариант, да?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 21 2017, 07:58
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(pokk @ Jul 21 2017, 05:00) *
Неа не сохраняется так как прием,обработка и выдача, сразу в прерывании, а маин пустой.

Ну ок. Конечно только если FPU используется только в одном ISR? Иначе - "Шеф, всё пропало!" biggrin.gif

Конечно странно - зачем запихивать фильтры (вроде оно там у Вас?) и прочее в ISR? У Вас есть уверенность, что данные успеют обработаться до следующего прерывания от АЦП? И обработаться при любом стечении обстоятельств (других обработчиков прерываний)?
Обычно в ISR просто кладут данные в кольцевой буфер, а обрабатывают их неспеша в менее приоритетном процессе (это может быть задача ОС или даже другое программно активизируемое прерывание с меньшим приоритетом (меньшим чем любое аппаратное прерывание)).
Я конечно делал так в одном проекте как-то давно, но там весь код обработчика (и ЦОС) был написан на ассемблере (а значит была уверенность в стабильности времени его работы). И там была острая нехватка ОЗУ в МК.
Go to the top of the page
 
+Quote Post

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

 


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


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