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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Как отучить IAR использовать регистры FPU где не нужно?
jcxz
сообщение Aug 18 2018, 20:25
Сообщение #1


Гуру
******

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



Столкнулся с очень неприятным моментом в работе IAR:
В какой-то момент заглянул в листинг и увидел, что копируя структуру, IAR использует регистры FPU!
Хотя и рядом нет никаких операций с плавучкой. Просто есть структура, есть две переменных типа этой структуры и есть операция копирования одной переменной в другую (присваиванием, без memcpy()). И я вижу что IAR 7.80.4 лепит такой код (с оптимизацией и без):
Код
ADD      R2,SP,#+8
VLDM     R2,{D0-D3}
VSTM     R1,{D0-D3}

Что очень неприятно, ведь работа идёт под РТОС, в одной из задач ОС. В этой задаче нет никаких операций с плавучкой. Соответственно данная задача создаётся с указанием ОС что она не использует FPU. Соответственно ОС при переключении контекста с/в данную задачу не сохраняет/восстанавливает регистры FPU. Соответственно - будут разрушены регистры FPU в тех задачах, которые используют FPU (а также в тех, в коих IAR так же впихнул такое копирование через FPU).
Некоторые задачи в программе используют плавучку, значит полностью запретить FPU нельзя. Можно конечно сделать сохранение контекста FPU для всех задач вне зависимости от использования ими FPU, но не хотелось бы, так как все стеки задач придётся увеличить, увеличится время переключений контекста задач. Да и вообще - зачем? ОЗУ ведь не резиновая?

Как запретить IAR-у использовать регистры FPU для всего, кроме операций с плавучкой? Что-то в мануале не найду ничего про такое.... sad.gif(((((
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 19 2018, 07:55
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Aug 18 2018, 23:25) *
Столкнулся с очень неприятным моментом в работе IAR...

Дык известное ж дело (вроде), что не только в IAR, оно везде так, думается мне. Keil также поступает в некоторых случаях, под Eclipse для Cortex-A тоже самое. Я не стал разбираться пока что досконально, почему код с применением регистров FPU будет работать быстрее. Но чую, что оно действительно так.

Цитата(jcxz @ Aug 18 2018, 23:25) *
Что очень неприятно, ведь работа идёт под РТОС, в одной из задач ОС. В этой задаче нет никаких операций с плавучкой. Соответственно данная задача создаётся с указанием ОС что она не использует FPU.

Ух ты! А что у Вас за ОС? Почему во FreeRTOS такой возможности нет crying.gif

Цитата(jcxz @ Aug 18 2018, 23:25) *
Как запретить IAR-у использовать регистры FPU для всего, кроме операций с плавучкой? Что-то в мануале не найду ничего про такое.... sad.gif(((((

Ну не знаю насчет IAR, просто с сайта ARM Вам пищу для размышлений хочу указать. Оно как раз Вам подходит. Запрещает использовать FPU везде, где не пахнет операциями плавучки.
--no_allow_fpreg_for_nonfpdata
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 19 2018, 11:44
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 18 2018, 23:25) *
Как запретить IAR-у использовать регистры FPU для всего, кроме операций с плавучкой? Что-то в мануале не найду ничего про такое.... sad.gif(((((

Вот это поворот!
Действительно при копировании 32-х и 64-х байтных структур IAR использует регистры FP сопроцессора.
И не лечится ничем.
Отключение оптимизации не помогает.
Просто запретить --fpu=none для отдельного файла компилятор не дает. Других опций и прагм нет.
Между тем в uCOS для портов на ARM под IAR повсеместно используется запрет на сохранение контекста FP.
В других осях тоже.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 19 2018, 13:05
Сообщение #4


Гуру
******

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



Цитата(Arlleex @ Aug 19 2018, 10:55) *
почему код с применением регистров FPU будет работать быстрее. Но чую, что оно действительно так.

Скорость копирования в данном случае меня не интересует.
Тем более что - копирование всего 32 байт, и редкое. А заплатить за это придётся значительным увеличением стеков всех задач и соответственно - увеличением времени переключения контекстов всех задач. Только проигрыш в результате. sad.gif

Цитата(Arlleex @ Aug 19 2018, 10:55) *
Ух ты! А что у Вас за ОС? Почему во FreeRTOS такой возможности нет crying.gif

Дык - поэтому и не использую FreeRTOS, потому что там многого полезного нет laughing.gif
У меня uCOS-II.

Цитата(Arlleex @ Aug 19 2018, 10:55) *
Ну не знаю насчет IAR, просто с сайта ARM Вам пищу для размышлений хочу указать. Оно как раз Вам подходит. Запрещает использовать FPU везде, где не пахнет операциями плавучки.
--no_allow_fpreg_for_nonfpdata

К сожалению IAR не понимает эту опцию. sad.gif sad.gif sad.gif

Цитата(AlexandrY @ Aug 19 2018, 14:44) *
Между тем в uCOS для портов на ARM под IAR повсеместно используется запрет на сохранение контекста FP.
В других осях тоже.

Вот именно!
Заметил только вчера эту пакость со стороны IAR-а. Сейчас думаю, что возможно какие-то случайные, редко-проявляющиеся баги, которые иногда возникают, могли быть вызваны этим.
Пока перевёл копирование структур на memcpy(). Но нет уверенности что IAR, при включённой оптимизации не станет шалить с регистрами FPU и в других местах, а не только при копировании структур. sad.gif
Go to the top of the page
 
+Quote Post
ih_
сообщение Aug 22 2018, 15:17
Сообщение #5


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

Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422



Цитата(jcxz @ Aug 18 2018, 23:25) *
Столкнулся с очень неприятным моментом в работе IAR:
...
Какой МК?
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 22 2018, 16:37
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Гм.. перекатил проект на юкосе на Гцц компилер - проблем не получил. Ну кроме выравнивания стека на 8, но там и для ИАР стояли директивы, сам виноват, не поставил аналогичные. Но чтобы с фпу засады.. гцц вроде не пакостил пока

Цитата(ih_ @ Aug 22 2018, 18:17) *
Какой МК?

Неужели много вариантов с фпу стало , кроме кортексов 4ф и выше (ну и А серия)?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 22 2018, 20:04
Сообщение #7


Гуру
******

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



Цитата(ih_ @ Aug 22 2018, 18:17) *
Какой МК?

Cortex-M4F

Цитата(DASM @ Aug 22 2018, 19:37) *
Гм.. перекатил проект на юкосе на Гцц компилер - проблем не получил. Ну кроме выравнивания стека на 8, но там и для ИАР стояли директивы, сам виноват, не поставил аналогичные. Но чтобы с фпу засады.. гцц вроде не пакостил пока

Да, как-то печально. До сих пор уважал IAR..... 05.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 23 2018, 06:49
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В тех задачах, где используется FPU, регистры сохранятся и восстановятся при входе и выходе. А в других... а сколько тех других? Одна?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 23 2018, 07:39
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ViKo @ Aug 23 2018, 09:49) *
В тех задачах, где используется FPU, регистры сохранятся и восстановятся при входе и выходе.
Если такие задачи имеют наивысший приоритет и не могут быть вытеснены задачами, которые не сохраняют, но иногда портят регистры сопроцессора - будет работать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 23 2018, 08:01
Сообщение #10


Гуру
******

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



Цитата(ViKo @ Aug 23 2018, 09:49) *
В тех задачах, где используется FPU, регистры сохранятся и восстановятся при входе и выходе. А в других... а сколько тех других? Одна?

Не одна, а большинство. У меня FPU используется не где попало, а только там где нужно.

Цитата(Сергей Борщ @ Aug 23 2018, 10:39) *
Если такие задачи имеют наивысший приоритет и не могут быть вытеснены задачами, которые не сохраняют, но иногда портят регистры сопроцессора - будет работать.

Любая задача может быть вытеснена, вне зависимости от её приоритета, так как любая использует хотя-бы один объект синхронизации ядра (семафоры, мьютексы и т.п.).
К тому же назначение приоритетов должно делаться не по багам компилятора, а по требованиям прикладной задачи. Как можно назначить наивысший приоритет задаче, которая массивно выполняет операции с плавучкой (обработка данных) и убить этим работу всех реалтаймовых задач, например: драйверов устройств, которые не требуют большого времени выполнения, но требуют быстрой реакции на события в периферии?
Мои проекты насыщены разнообразной периферией и, соответственно, много драйверов устройств. Но при этом в паре-тройке мест нужно периодически обработать плотно данные на FPU (фильтрация).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 23 2018, 08:19
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ Aug 23 2018, 11:01) *
Не одна, а большинство. У меня FPU используется не где попало, а только там где нужно.

Нет, сколько задач с присвоением одной структуры другой? Может, компилятор неким образом держит под контролем такую ситуацию?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 23 2018, 08:45
Сообщение #12


Гуру
******

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



Раскидать задачи по разным файлам и компилировать с разными ключиками: одни для CM3, другие - CM4F. Вероятно, линкер будет отказываться их скрестить, надо как-то побороть.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 23 2018, 08:55
Сообщение #13


Гуру
******

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



Цитата(ViKo @ Aug 23 2018, 11:19) *
Нет, сколько задач с присвоением одной структуры другой? Может, компилятор неким образом держит под контролем такую ситуацию?

Теперь уже ни одной. Прошерстил исходники и все такие места заменил на memcpy().

Цитата(scifi @ Aug 23 2018, 11:45) *
Раскидать задачи по разным файлам и компилировать с разными ключиками: одни для CM3, другие - CM4F. Вероятно, линкер будет отказываться их скрестить, надо как-то побороть.

Да, вариант. В крайнем случае видимо можно так и поступить.
Пока обошёлся memcpy() как менее травмирующим решением. И надеюсь что IAR-овцы не додумаются и внутренности memcpy() оптимизировать с помощью FPU... 05.gif
А то придётся библиотечный memcpy() заменять на свою ассемблерную реализацию.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 23 2018, 09:14
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (jcxz @ Aug 23 2018, 11:01) *
Любая задача может быть вытеснена, вне зависимости от её приоритета, так как любая использует хотя-бы один объект синхронизации ядра (семафоры, мьютексы и т.п.).
При работе с объектом синхронизации задача не вытесняется в произвольном месте, а отдает управление с сохранением своего контекста (включая регистры сопроцессора).

QUOTE (jcxz @ Aug 23 2018, 11:01) *
К тому же назначение приоритетов должно делаться не по багам компилятора, а по требованиям прикладной задачи.
Естественно. Я отвечал на сообщение ViKo, где он утверждал, что достаточно сохранять регистры сопроцессора в "нужных" задачах, а остальные могут их портить.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 23 2018, 09:34
Сообщение #15


Гуру
******

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



Цитата(Сергей Борщ @ Aug 23 2018, 12:14) *
При работе с объектом синхронизации задача не вытесняется в произвольном месте, а отдает управление с сохранением своего контекста (включая регистры сопроцессора).

А какая разница? Контекст то ведь будет сохранять та же функция ОС, которая сохраняет и при вытеснении в тот же формат.
Или задача сама отдаёт управление, передавая свои регистры переключателю контекста, или она вытесняется ISR-ом, который кладёт часть её регистров в стек и потом если нужно передаёт переключателю контекста - разницы нет.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th April 2024 - 02:39
Рейтинг@Mail.ru


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