Цитата(jdhfdg @ Sep 28 2011, 07:23)

Есть функция, которая пишет данные из ОЗУ во FLASH.
Если вызываю эту функцию в одном месте программы (в начале), то после этого во FLASH оказываются актуальные данные вперемешку с неправильными данными - чаще нулевые значения (или иногда старые данные, которые записывал туда неделю назад, т.е. те которые когда-то там были).
Если вызываю ЭТУ ЖЕ функцию в другом месте программы - работает, пишутся актуальные данные!
То есть одна и та же функция, если вызывать ее из разных частей программы, ведет себя по-разному - то работает абсолютно адекватно, то наоборот.
Может где-то какие-то регистры залочены и запись не срабатывает?
Чем дальше в лес, тем толще партизаны

. Вы флэш перед использованием стираете? Проверили причину сброса? Должна быть всегда последняя причина сброса по питанию. У Вас так? Можно в самом коде вначале определять причину сброса и зацикливаться , чтобы отловить. Может у Вас вотчдог или еще какая гадость...
UPD. А для чего у Вас такая сложная функция чтения из флэш? Читать же можно гораэдо проще. Это равносильно, что вы при компиляции объявили переменную с модификатором "code". Соответсвенно просто заведите указатель на код типа:
Код
char code* val_ptr;
//далее, например, понадобилось нам достать флоат в объявленную ранее data_float из адреса 0x7c00
val_ptr=0x7c00;
data_float=*(float*)val_ptr;
А в общем-то можно вообще не заводить эту пустую переменную и сделать:
Код
data_float=*(float*)0x7c00;