Arm-Embedded-GCC Toolchain - разница версий 7 и 9
Мы используем ARM Embedded Toolchain на основе GCC для наших проектов Cortex-M3 (arm-none-eabi поддерживается ARM).
Недавно мы обновили 7.2.1 до 9.3.1 в проекте, который использует GNU11 и GNU++14 и newlib-nano (nano.specs), а уровень оптимизации установлен на Og.
Мы сталкиваемся с каким-то странным поведением, что внезапно просто случайно один GPIO больше не включается / выключается, этого не происходит, если мы используем 7.2.1. При переходе через программу, чтобы проверить, почему она больше не будет переключаться, все команды выполняются правильно: инициализация, а затем запись значения в GPIO. Также примечательно, что если мы изменим уровень оптимизации на любой другой (O0, 01, 02, 0s), он снова заработает, кажется, что Og с 9.3.1 что-то ломает.
Затем мы пошли дальше и начали поиск, какой участок кода мы должны исключить из оптимизации (какую функцию или какую инструкцию), чтобы он снова стал работоспособным. Там мы не нашли решения, так как это не одна функция вызова. Произвольно сужая область, просто отключив оптимизацию для случайной функции, которая не имеет ничего общего с доступом к GPIO, она снова работает.
В настоящее время мы не знаем, как действовать дальше в этом вопросе, чтобы найти основную причину такого поведения.
Вопросов:
- Что изменилось между 7.2.1 и 9.3.1, когда дело доходит до Gnu11/Gnu++14, newlib-nano и Optimization for Debug (Og)?
- Как это можно объяснить, что старая версия, похоже, создает работоспособный двоичный файл, а более новая вызывает проблемы?
- Как вы можете объяснить, почему только Og вызывает проблемы, а все остальные уровни оптимизации работают нормально?
Любой намек / ввод приветствуется.