|
Как отучить IAR использовать регистры FPU где не нужно? |
|
|
|
Aug 18 2018, 20:25
|
Гуру
     
Группа: Свой
Сообщений: 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 для всего, кроме операций с плавучкой? Что-то в мануале не найду ничего про такое....  (((((
|
|
|
|
|
 |
Ответов
|
Aug 23 2018, 08:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Aug 23 2018, 09:49)  В тех задачах, где используется FPU, регистры сохранятся и восстановятся при входе и выходе. А в других... а сколько тех других? Одна? Не одна, а большинство. У меня FPU используется не где попало, а только там где нужно. Цитата(Сергей Борщ @ Aug 23 2018, 10:39)  Если такие задачи имеют наивысший приоритет и не могут быть вытеснены задачами, которые не сохраняют, но иногда портят регистры сопроцессора - будет работать. Любая задача может быть вытеснена, вне зависимости от её приоритета, так как любая использует хотя-бы один объект синхронизации ядра (семафоры, мьютексы и т.п.). К тому же назначение приоритетов должно делаться не по багам компилятора, а по требованиям прикладной задачи. Как можно назначить наивысший приоритет задаче, которая массивно выполняет операции с плавучкой (обработка данных) и убить этим работу всех реалтаймовых задач, например: драйверов устройств, которые не требуют большого времени выполнения, но требуют быстрой реакции на события в периферии? Мои проекты насыщены разнообразной периферией и, соответственно, много драйверов устройств. Но при этом в паре-тройке мест нужно периодически обработать плотно данные на FPU (фильтрация).
|
|
|
|
|
Aug 23 2018, 09: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)
|
|
|
|
|
Aug 23 2018, 13:40
|
Частый гость
 
Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422

|
Цитата(jcxz @ Aug 23 2018, 12:34)  А какая разница?... Есть разница. У некоторых МК РОНы отображаются на память. И если в Вашем случае это так, то я хотел предложить создать по этому адресу volatile переменную, тогда компилятор не посягнул бы на эту область памяти - регистр.
|
|
|
|
|
Aug 23 2018, 20:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ih_ @ Aug 23 2018, 16:40)  Есть разница. У некоторых МК РОНы отображаются на память. И если в Вашем случае это так, то я хотел предложить создать по этому адресу volatile переменную, тогда компилятор не посягнул бы на эту область памяти - регистр. Я писал выше - у меня Cortex-M4. У него регистры никуда не отображаются. Цитата(AlexandrY @ Aug 23 2018, 16:41)  Т.е. если компилятор объявил макрос __ARMVFP__ , то все задачи без исключения сохраняют контекст fpu. Другое дело, что в startup файлах из bsp может случайно не взводится флаг FPCA в регистре CONTROL, допустим проигнорен вызов __iar_program_start, и прерывания по умолчанию не сохраняют контекст fpu. И FPCA и ASPEN и LSPEN (в FPCCR) у меня сброшены. И сброшены не случайно, поверьте про них я знаю. Сброшены потому что в ISR-ах в этом проекте плавучку не использую. Я не знаю как там дела обстоят в uCOS-III, у меня uCOS-II. И читать и понимать исходники я думаю что умею. Эта функция в uCOS-II вызывается при переключении активной задачи: CODE #if (OS_CPU_HOOKS_EN > 0u) && (OS_TASK_SW_HOOK_EN > 0u) void OSTaskSwHook (void) {
#if (OS_CPU_ARM_FP_EN > 0u) if ((OSTCBCur->OSTCBOpt & OS_TASK_OPT_SAVE_FP) != (INT16U)0) { OS_CPU_FP_Reg_Push(OSTCBCur->OSTCBStkPtr); }
if ((OSTCBHighRdy->OSTCBOpt & OS_TASK_OPT_SAVE_FP) != (INT16U)0) { OS_CPU_FP_Reg_Pop(OSTCBHighRdy->OSTCBStkPtr); } #endif
#if OS_APP_HOOKS_EN > 0u App_TaskSwHook(); #endif } #endif OS_CPU_HOOKS_EN, OS_TASK_SW_HOOK_EN, OS_CPU_ARM_FP_EN - все равны 1. OS_CPU_FP_Reg_Push и OS_CPU_FP_Reg_Pop - тоже не пустые и делают то, что и полагается. Обратите внимание на OS_TASK_OPT_SAVE_FP - именно этот флаг передаётся в аргументе prio (6-й бит) и говорит ОСи что задача юзает FPU и что нужно в сохраняемый/восстанавливаемый контекст для данной задачи включить регистры FPU. Более того - одна из задач (Idle-задача) у меня имеет размер стека == 64 байта, т.е. - только-только чтобы сохранить регистры CPU, и если-бы туда сохранялись ещё и регистры FPU, то данные выше этого стека были бы снесены, а там весьма важные данные и они не портятся. Да и отладчиком я пользоваться умею всё-таки...  Цитата(Genadi Zawidowski @ Aug 23 2018, 17:02)  А что, флажок который говорит что FPU поюзали и его надо сохранить - отменили? Когда FPU поюзала процедура копирования, то сохранять уже поздно. Цитата(Сергей Борщ @ Aug 23 2018, 17:49)  Пожалуй, вы правы. Тогда источником проблем остается только такой сценарий - задача, не сохраняющая регистры сопроцессора в момент копирования структуры через эти регистры прерывается другой задачей - либо законно использующей сопроцессор, либо такой же, которая в это время тоже решит скопировать структуру. Действительно, трудноотлавливаемый момент. Да, Вы правы, именно в таком случае. Когда задача копирует через FPU, то значит она в этот момент активная, а все остальные задачи выгружены в память (все их копии регистров FPU все находятся в памяти). И естественно в этом случае она не может эти данные попортить. Но вот её данные - попортить могут. PS: Кстати - Ваше замечание навело меня на мысль, что в качестве костыля можно на время копирования структур запрещать прерывания (критическая секция). Правда нет гарантии, что при копировании просто нескольких переменных, расположенных рядом, оптимизатор не захочет также прибегнуть к FPU. Или не копировании, а заполнении их константой.
|
|
|
|
|
Aug 24 2018, 14:39
|

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

|
Цитата(jcxz @ Aug 23 2018, 23:14)  А толку? как это поможет? IAR, узрев её исходники, сразу поостерегётся своевольничать?  Да нет, просто в IAR 8.30 появился неплохой плагин под mbed. Можно уже нормально юзать. А там самый короткий переключатель контекста. Кстати, в версии 8.30 у меня не получилось заставить использовать fpu при копировании структур. Так что тревога отменяется. Цитата(ViKo @ Aug 24 2018, 07:05)  А я сразу подумал о таком решении, но постеснялся предлагать очевидное. Если речь идет об ISR уровня ядра длительностью в 0.5 мкс и джитером 0.1 мкс , то такой путь неприемлем. Хотя кому в голову придет в таких ISR копировать структуры!?
|
|
|
|
Сообщений в этой теме
jcxz Как отучить IAR использовать регистры FPU где не нужно? Aug 18 2018, 20:25 Arlleex Цитата(jcxz @ Aug 18 2018, 23:25) Столкну... Aug 19 2018, 07:55 jcxz Цитата(Arlleex @ Aug 19 2018, 10:55) поче... Aug 19 2018, 13:05 AlexandrY Цитата(jcxz @ Aug 18 2018, 23:25) Как зап... Aug 19 2018, 11:44 AlexandrY Цитата(AlexandrY @ Aug 19 2018, 14:44) Ме... Aug 23 2018, 13:41 ih_ Цитата(jcxz @ Aug 18 2018, 23:25) Столкну... Aug 22 2018, 15:17 jcxz Цитата(ih_ @ Aug 22 2018, 18:17) Какой МК... Aug 22 2018, 20:04 DASM Гм.. перекатил проект на юкосе на Гцц компилер - п... Aug 22 2018, 16:37 Сергей Борщ QUOTE (ViKo @ Aug 23 2018, 09:49) В тех з... Aug 23 2018, 07:39  ViKo Цитата(jcxz @ Aug 23 2018, 11:01) Не одна... Aug 23 2018, 08:19   jcxz Цитата(ViKo @ Aug 23 2018, 11:19) Нет, ск... Aug 23 2018, 08:55      ViKo Цитата(jcxz @ Aug 23 2018, 23:01) PS: Кст... Aug 24 2018, 04:05      Arlleex Цитата(jcxz @ Aug 24 2018, 00:01) PS: Кст... Aug 24 2018, 09:40    Сергей Борщ QUOTE (jcxz @ Aug 23 2018, 12:34) А какая... Aug 23 2018, 14:49 scifi Раскидать задачи по разным файлам и компилировать ... Aug 23 2018, 08:45 Genadi Zawidowski А что, флажок который говорит что FPU поюзали и ег... Aug 23 2018, 14:02 AlexandrY Цитата(Genadi Zawidowski @ Aug 23 2018, 17... Aug 23 2018, 14:29 Genadi Zawidowski Цитатафлажок не говорит Баг в ядре процессора? Aug 23 2018, 16:31 ViKo И зачем их копировать? Для малых структур я копиру... Aug 25 2018, 05:08 Arlleex Цитата(ViKo @ Aug 25 2018, 08:08) И зачем... Aug 25 2018, 06:42  ViKo Цитата(Arlleex @ Aug 25 2018, 09:42) Это ... Aug 25 2018, 07:34   jcxz Цитата(ViKo @ Aug 25 2018, 10:34) У меня ... Aug 25 2018, 08:03   Arlleex Цитата(ViKo @ Aug 25 2018, 10:34) У меня ... Aug 25 2018, 08:31    jcxz Цитата(Arlleex @ Aug 25 2018, 11:31) На м... Aug 25 2018, 10:16     Arlleex Цитата(jcxz @ Aug 25 2018, 13:16) Тот слу... Aug 25 2018, 10:29 jcxz Цитата(ViKo @ Aug 25 2018, 08:08) И зачем... Aug 25 2018, 06:44  AlexandrY Цитата(jcxz @ Aug 25 2018, 09:44) Здесь к... Aug 25 2018, 07:01   jcxz Цитата(AlexandrY @ Aug 25 2018, 10:01) Ту... Aug 25 2018, 07:10 ViKo Да, не так поняли.
У меня есть одна структура, сос... Aug 25 2018, 10:31 jcxz Цитата(ViKo @ Aug 25 2018, 13:31) Я не пр... Aug 25 2018, 12:16  ViKo Цитата(jcxz @ Aug 25 2018, 15:16) А я ещё... Aug 25 2018, 12:37
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|