Всем привет!
Использую 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