|
Самопроизвольное изменение значения переменной |
|
|
|
Sep 26 2011, 22:53
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(jdhfdg @ Sep 27 2011, 06:25)  ходить по шагам пробовал, но толку мало. в указанном месте просто выдает не то значение, которое записывал ранее. да еще и неудобно жутко - когда идешь по шагам показывает не тот код, который сейчас выполняется, а тот в котором находится функция main. Но это отдельная история... Это в uvision. А в Silicon Laboratories дела с этим обстоят еще хуже... Проходили такое. Это неправильно организован проект. Все сишные файлы должны билдиться (простите за сленг), а инклудиться только хедеры с объявлением функция, а не определением. Тогда отладка будет певеселее. По существу. Во-первых, не возникает ли сброса по записи во флэш? Смотрим в RSTSRC или как он называется в данном камне? Во-вторых, возможно все-таки, и скорее всего ошибка в проге. Попробуйте после однократной записи данных вообще запретить запись - либо залочить, либо в функции записи поставить проверку софтверного флага. Если залочите, а запись все-таки вызовется произойдет сброс по ошибке флэш. А может сперва сделать как написал выше с файлом, содержащим функцию записи, или на крайний случай временно перенести функцию в файл с main и поставить брекпоинт в функции. Тем самым отловите непреднамеренный вызов функции. UPD. Кстати, посмотрите в отладчике, что на самом деле записано в ячейке флэш когда она якобы испортилась, може не там ищем?
|
|
|
|
|
Sep 27 2011, 05:23
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-03-06
Пользователь №: 14 931

|
В утилите "Silabs Flash Utility" есть закладка "Get Memory". Используя Debug Adapter можно прочитать содержимое любой части памяти из микроконтроллера и записать в файл. Правда, формат записи будет дурацкий - текст в колонку, но на сайте силабса есть программка ASCII2BIN, которая превращает его в обычный бинарный код, далее - в HEX. Я этим пользовался, когда надо было зашить в контроллер точную копию программы с другого такого же.
|
|
|
|
|
Sep 27 2011, 20:23
|
Группа: Новичок
Сообщений: 8
Регистрация: 25-09-11
Пользователь №: 67 366

|
Есть функция, которая пишет данные из ОЗУ во FLASH. Если вызываю эту функцию в одном месте программы (в начале), то после этого во FLASH оказываются актуальные данные вперемешку с неправильными данными - чаще нулевые значения (или иногда старые данные, которые записывал туда неделю назад, т.е. те которые когда-то там были). Если вызываю ЭТУ ЖЕ функцию в другом месте программы - работает, пишутся актуальные данные! То есть одна и та же функция, если вызывать ее из разных частей программы, ведет себя по-разному - то работает абсолютно адекватно, то наоборот. Может где-то какие-то регистры залочены и запись не срабатывает? Может в какие-то моменты времени нельзя писать во флэш? Если вы знаете, объясните этот момент. И еще, обязательно ли записывать данные побайтно? Можно ли целиком float или int значение сразу писать, как в коде, который я показывал? Или надо обязательно разбивать на отдельные байты? Вот тут только пример для записи побайтно, а мне нужно отдельными переменными сохранять. http://www.efo.ru/doc/Silabs/Silabs.pl?2050
Сообщение отредактировал jdhfdg - Sep 27 2011, 20:27
|
|
|
|
|
Sep 27 2011, 22:33
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(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;
|
|
|
|
|
Sep 28 2011, 08:33
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(jdhfdg @ Sep 28 2011, 00:23)  вперемешку с неправильными данными - чаще нулевые значения Цитата(barabek @ Sep 28 2011, 02:33)  Вы флэш перед использованием стираете? А, действительно: стираете ли flash? Читаем DS: Цитата A byte location to be programmed must be erased before a new value can be written. Правильная запись во flash при перемещении процедуры записи - побочный результат "перезаливки" программы с предварительным стиранием памяти.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|