|
Как отучить 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 25 2018, 06:42
|

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

|
Цитата(ViKo @ Aug 25 2018, 08:08)  И зачем их копировать? Для малых структур я копирую поэлементно. А большие копирую через указатели на int, приведя к ним адреса структур исходной и назначения. Это еще зачем? Ведь структурные типы можно присваивать друг другу. Например Код typedef struct {...}TMyStruct;
TMyStruct s1, s2; ... s1 = s2; Наглядно, читабельно и понятно. Без всяких приведений на int и поэлементных копирований...
|
|
|
|
|
Aug 25 2018, 08:31
|

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

|
Цитата(ViKo @ Aug 25 2018, 10:34)  У меня одна структура является копией части другой. Вот для этого использую указатели. А целиком структуры одну в другую мне и копировать нет нужды. Вот у меня, например, кусок хедера Код // структура калибровочных параметров аналогового окружения АЦП typedef struct { #define EEPROM_ADC_DEFAULT_ZERO 1.250000000 double Zero; #define EEPROM_ADC_DEFAULT_REFERENCE 2.500000000 double Reference; #define EEPROM_ADC_DEFAULT_SCALE 10.00000000 double Scale; }TADCTrueConstant;
// структура загрузочных параметров в EEPROM typedef struct { TADCTrueConstant ADC220V; TADCTrueConstant ADC220C1; TADCTrueConstant ADC220C2; TADCTrueConstant ADC220C3; TADCTrueConstant ADC220C4; TADCTrueConstant ADC220C5; TADCTrueConstant ADC200VA; TADCTrueConstant ADC200VB; TADCTrueConstant ADC200VC; TADCTrueConstant ADC200CA; TADCTrueConstant ADC200CB; TADCTrueConstant ADC200CC; TOneWireROM OneWireROM[ONE_WIRE_MAX_DEVICES_ON_BUS]; unsigned int DeviceSignature[HW_MCU_SIGNATURE_SIZE]; unsigned int CRC32; }TEEPROM; Согласно Вашей логике, Вы элементы TEEPROM писали бы как подобие элементов TADCTrueConstant, после чего копировали поэлементно Код // структура калибровочных параметров аналогового окружения АЦП typedef struct { #define EEPROM_ADC_DEFAULT_ZERO 1.250000000 double Zero; #define EEPROM_ADC_DEFAULT_REFERENCE 2.500000000 double Reference; #define EEPROM_ADC_DEFAULT_SCALE 10.00000000 double Scale; }TADCTrueConstant;
// структура загрузочных параметров в EEPROM typedef struct { double Zero_ADC220V; double Reference_ADC220V; double Scale_ADC220V; ... double Zero_ADC200CC; double Reference_ADC200CC; double Scale_ADC200CC; // эту тоже заменить на содержимое TOneWireROM, чтобы получить копию TOneWireROM OneWireROM[ONE_WIRE_MAX_DEVICES_ON_BUS]; unsigned int DeviceSignature[HW_MCU_SIGNATURE_SIZE]; unsigned int CRC32; }TEEPROM; или я что-то не так понял? На мой взгляд способ, когда одни структуры содержат в себе другие структуры куда удобнее. И не надо поэлементно копировать. Я присваиваю структуры структурам, если нужно что-то частично копирнуть, а если все нужно (например, в буфер отправки положить) - использую memcpy().
|
|
|
|
Сообщений в этой теме
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 ViKo В тех задачах, где используется FPU, регистры сохр... Aug 23 2018, 06:49 Сергей Борщ QUOTE (ViKo @ Aug 23 2018, 09:49) В тех з... Aug 23 2018, 07:39 jcxz Цитата(ViKo @ Aug 23 2018, 09:49) В тех з... Aug 23 2018, 08:01  ViKo Цитата(jcxz @ Aug 23 2018, 11:01) Не одна... Aug 23 2018, 08:19   jcxz Цитата(ViKo @ Aug 23 2018, 11:19) Нет, ск... Aug 23 2018, 08:55  Сергей Борщ QUOTE (jcxz @ Aug 23 2018, 11:01) Любая з... Aug 23 2018, 09:14   jcxz Цитата(Сергей Борщ @ Aug 23 2018, 12:14) ... Aug 23 2018, 09:34    ih_ Цитата(jcxz @ Aug 23 2018, 12:34) А какая... Aug 23 2018, 13:40     jcxz Цитата(ih_ @ Aug 23 2018, 16:40) Есть раз... Aug 23 2018, 20:01      AlexandrY Цитата(jcxz @ Aug 23 2018, 22:41) Я не зн... Aug 23 2018, 20:05       jcxz Цитата(AlexandrY @ Aug 23 2018, 23:05) Вс... Aug 23 2018, 20:14        AlexandrY Цитата(jcxz @ Aug 23 2018, 23:14) А толку... Aug 24 2018, 14:39      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   jcxz Цитата(ViKo @ Aug 25 2018, 10:34) У меня ... Aug 25 2018, 08:03    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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|