Цитата(Сергей Борщ @ Nov 11 2011, 10:57)

Нет, это не так. Исходите из того, что компилятор вас не обманывает. Сколько ОЗУ у вас занято под переменные? Сколько памяти выделено под стеки? Эти переменные глобальные или локальные? Симптомы указывают на нехватку стека - стек налезает на переменные. И надо смотреть- если есть куда, то увеличивать стек. Если некуда - урезать осетра, т.е. оптимизировать программу, избавляясь от лишних переменных.
Если считать с массивами - до 1кБ занято переменными.
Под стеки было выделенно 1кБ, я увеличил это значение до 3кБ - ничего не изменилось все те же лишние значения в переменных и HardFault. Кучу на всякий тоже до 3 кБ увеличил - никакого эффекта.
Все переменные глобальные. По тексту программы есть и локальные, но уже до их обьявления и инициализации уже появляются какие-то проблемы.
Цитата
До входа в главную функцию (main) выполняется загрузчик, который и заполняет инициализировнные в коде переменные их значениями, а остальные нулями.
Вообще похоже на неверный скрипт линкера и/или загрузчик.
Один раз был похожий косяк, правда с gcc: в зависимости от размеров переменных или даже перетаскивания их по коду программа работал или валилась в Hard Fault, уже грешил на компилятор. В итоге оказалось что вектора прерывания сремапленные в оперативку были выровнены по неверному значению (0x100, а надо было по 0x400) Старый код работал на stmf100, где прерываний меньше и выравнивания 0x100 было достаточно, при переносе на stm32f2 используемых прерываний оказалось больше и некоторые не срабатывали.
Симптомы очень похожи.
Могли бы вы немного подробнее описать, как это проверить, как узнать что должно быть и какие значения сейчас у меня? А то я раньше в таких дебрях еще не копался.)
Открыл новую зависимость :
Если обьявляется 2 массива :
Код
uint16_t b[50];
uint16_t b1[50];
То начинаются такие проблемы.
Если же обьявлять только один массив - все ок:
Код
uint16_t b[1000];
//uint16_t b1[50];
Можно что угодно местами переставлять и не будет проблем.
Причем величину этого массива можно установить хоть 1000 элементов, все отлично работает.
Вообще не понятно, какая разница в обьявлении двух массивов по 50 или одного на 100 элементов? Почему так коряво работает?