|
Оптимизация в Keil |
|
|
|
Jul 21 2015, 18:24
|

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

|
Всем привет! Использую Keil 5 для программирования STM32. Заметил интересную особенность. Выключаю оптимизацию (Level 0), запускаю код, в нем все прозрачно и безобидно - выделяется в функции локальная структура, и я ее заполняю. Выхожу из функции в main, захожу в другую функцию и отладчик отваливается с сообщением  Путем проб и ошибок выявил, что, закомментировав одно из заполнений полей структуры, Код struct.a = 0; struct.b = 100; struct.c = 45; // struct.d = 50; struct.e = 150; все работает. Т.е. поймал багу прямо на строчке заполнения структуры. Если перед объявлением структуры объявить еще что-нибудь, баг тоже исчезает... Подобного никогда не видел. При оптимизации Level 3 все работает, даже при заполнении всех полей структуры. Что там натворил оптимизатор такого? P.S. И еще вопрос. Почему при оптимизации Level 0 Код volatile const unsigned int a = 100; разместится в SRAM, а если она объявлена но не используется по коду - выкидывается вовсе из map-файла (ведь Level 0 предполагает ничего не оптимизировать)? Если просто Код const unsigned int a = 100; то все хорошо - константа будет во Flash. Для Level 3 вроде как оба случая разместят константу во Flash. Объясните, пожалуйста, или направьте на нужную информацию.
Сообщение отредактировал Arlleex - Jul 21 2015, 18:25
|
|
|
|
|
 |
Ответов
|
Feb 7 2016, 06:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ViKo @ Feb 7 2016, 07:58)  Я считаю, что работоспособность программы при любых уровнях оптимизации и есть тот тест, который отличает хороший код от сами_знаете_какого. Именно так. Более того, абсолютно всегда следует с самого начала использовать максимальные уровни оптимизации И НИКОГДА НЕ ОТКЛЮЧАТЬ, единственно, что в процессе работы можно, при жесткой необходимости сдвигать оптимизацию по скорости больше к оптимизации по размеру. Да и то, делать это не глобально, а для отдельных обьектов компиляции - каждому свое. Даже если при работе со сразу реальной оптимизацией наступить, вдруг (уже много много лет для свежих компиляторов не наступал) на непонимание Вами написанного компилятором, то это легче локализовать и скоректировать в процессе написания в момент проявления проблемы и не постфактум.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 7 2016, 08:38
|

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

|
Цитата(zltigo @ Feb 7 2016, 09:42)  Именно так. Более того, абсолютно всегда следует с самого начала использовать максимальные уровни оптимизации И НИКОГДА НЕ ОТКЛЮЧАТЬ, единственно, что в процессе работы можно, при жесткой необходимости сдвигать оптимизацию по скорости больше к оптимизации по размеру. Да и то, делать это не глобально, а для отдельных обьектов компиляции - каждому свое. Даже если при работе со сразу реальной оптимизацией наступить, вдруг (уже много много лет для свежих компиляторов не наступал) на непонимание Вами написанного компилятором, то это легче локализовать и скоректировать в процессе написания в момент проявления проблемы и не постфактум. Иногда включаю -O0, чтобы определить, правильно ли понял меня компилятор.  При этом уровне гораздо легче разбираться по ассемблерным командам. В Кейле задал 2 Target - Debug и Release - с уровнями -O0 и -O3, и когда не работает, легким движением мыши переключаюсь на Debug.
|
|
|
|
Сообщений в этой теме
Arlleex Оптимизация в Keil Jul 21 2015, 18:24 Fedor Больше похоже на то что в камень заливается не то ... Jul 21 2015, 18:42 Arlleex Пересобирал, чего-только не пересобирал.
Думал, фл... Jul 21 2015, 18:49 diwil вне зависимости от volatile или нет, если символ н... Jul 21 2015, 18:54 scifi Цитата(diwil @ Jul 21 2015, 21:54) не сов... Jul 21 2015, 19:16 aaarrr Цитата(Arlleex @ Jul 21 2015, 21:24) отла... Jul 21 2015, 19:02 Arlleex aaarrr, пардон. Отладчик отваливается с сообщением... Jul 21 2015, 19:11 Arlleex Покажу на псевдокоде.
Кодint main(void)
{... Jul 21 2015, 19:32 Fedor Если структуру
struct s;
объявить глобальной или ... Jul 21 2015, 19:42  Arlleex Fedor, глобальной - не отваливается. Статической -... Jul 21 2015, 19:46 scifi Цитата(Arlleex @ Jul 21 2015, 22:32) Само... Jul 21 2015, 19:54 Arlleex К сожалению, я шагал не по ассемблеровским инструк... Jul 21 2015, 19:56 Golikov A. у меня глупый, возможно, вопрос.
А у вас какой ко... Jul 22 2015, 06:24 kolobok0 Цитата(Arlleex @ Jul 21 2015, 21:24) ...И... Jul 22 2015, 07:21 Arlleex Golikov A., вопросы не бывают глупыми, вопросы быв... Jul 22 2015, 18:56 kolobok0 Цитата(Arlleex @ Jul 22 2015, 21:56) ...в... Jul 23 2015, 09:45 Golikov A. А никаких модулей защиты памяти и прочей байды слу... Jul 23 2015, 05:26 Booger Добрый день!
Не стал создавать новую тему.
Воп... Feb 5 2016, 12:44 scifi Цитата(Booger @ Feb 5 2016, 15:44) Может ... Feb 5 2016, 13:15 vlad_new Я не раз нарывался на проблеммы с оптимизатором в ... Feb 7 2016, 00:24 scifi Цитата(vlad_new @ Feb 7 2016, 03:24) Я не... Feb 7 2016, 06:45   scifi Цитата(ViKo @ Feb 7 2016, 11:38) Иногда в... Feb 7 2016, 09:11   zltigo QUOTE (ViKo @ Feb 7 2016, 10:38) Иногда в... Feb 7 2016, 09:37 RabidRabbit На выравнивание pdwVal смотрите. Возможно при O0 к... Feb 8 2016, 03:51 Booger В том то и дело, товарищи!
Работает на всех ур... Feb 8 2016, 04:14 Сергей Борщ Смею предположить, что с включенной оптимизацией к... Feb 8 2016, 05:44 Booger Спасибо всем за помощь!
Действительно, если и... Feb 9 2016, 05:30 GetSmart В 4-ом Кейле (точнее не скажу) для ARM7 таргета ви... Feb 9 2016, 22:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|