реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Самопроизвольное изменение значения переменной
barabek
сообщение Sep 26 2011, 22:53
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(jdhfdg @ Sep 27 2011, 06:25) *
ходить по шагам пробовал, но толку мало.
в указанном месте просто выдает не то значение, которое записывал ранее.
да еще и неудобно жутко - когда идешь по шагам показывает не тот код, который сейчас выполняется, а тот в котором находится функция main. Но это отдельная история... Это в uvision. А в Silicon Laboratories дела с этим обстоят еще хуже...


Проходили такое. Это неправильно организован проект. Все сишные файлы должны билдиться (простите за сленг), а инклудиться только хедеры с объявлением функция, а не определением. Тогда отладка будет певеселее.


По существу. Во-первых, не возникает ли сброса по записи во флэш? Смотрим в RSTSRC или как он называется в данном камне?

Во-вторых, возможно все-таки, и скорее всего ошибка в проге. Попробуйте после однократной записи данных вообще запретить запись - либо залочить, либо в функции записи поставить проверку софтверного флага. Если залочите, а запись все-таки вызовется произойдет сброс по ошибке флэш.

А может сперва сделать как написал выше с файлом, содержащим функцию записи, или на крайний случай временно перенести функцию в файл с main и поставить брекпоинт в функции. Тем самым отловите непреднамеренный вызов функции.

UPD. Кстати, посмотрите в отладчике, что на самом деле записано в ячейке флэш когда она якобы испортилась, може не там ищем?
Go to the top of the page
 
+Quote Post
Shandy
сообщение Sep 27 2011, 05:23
Сообщение #17


Участник
*

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



В утилите "Silabs Flash Utility" есть закладка "Get Memory". Используя Debug Adapter можно прочитать содержимое любой части памяти
из микроконтроллера и записать в файл.
Правда, формат записи будет дурацкий - текст в колонку, но на сайте силабса есть программка ASCII2BIN, которая превращает его
в обычный бинарный код, далее - в HEX.
Я этим пользовался, когда надо было зашить в контроллер точную копию программы с другого такого же.
Go to the top of the page
 
+Quote Post
barabek
сообщение Sep 27 2011, 10:38
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Shandy @ Sep 27 2011, 16:23) *
В утилите "Silabs Flash Utility" есть закладка "Get Memory". Используя Debug Adapter можно прочитать содержимое


Это несколько не то, ТС хочет все делать во время отладки. И это разумно, тем более содержимое флэш можно проверять и даже изменять на лету. Для того чтобы изменить и обновить содержимое используется кнопочка "туда-сюда" wink.gif в silabs IDE


Go to the top of the page
 
+Quote Post
jdhfdg
сообщение Sep 27 2011, 20:23
Сообщение #19





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
barabek
сообщение Sep 27 2011, 22:33
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(jdhfdg @ Sep 28 2011, 07:23) *
Есть функция, которая пишет данные из ОЗУ во FLASH.
Если вызываю эту функцию в одном месте программы (в начале), то после этого во FLASH оказываются актуальные данные вперемешку с неправильными данными - чаще нулевые значения (или иногда старые данные, которые записывал туда неделю назад, т.е. те которые когда-то там были).

Если вызываю ЭТУ ЖЕ функцию в другом месте программы - работает, пишутся актуальные данные!
То есть одна и та же функция, если вызывать ее из разных частей программы, ведет себя по-разному - то работает абсолютно адекватно, то наоборот.

Может где-то какие-то регистры залочены и запись не срабатывает?

Чем дальше в лес, тем толще партизаны sm.gif. Вы флэш перед использованием стираете? Проверили причину сброса? Должна быть всегда последняя причина сброса по питанию. У Вас так? Можно в самом коде вначале определять причину сброса и зацикливаться , чтобы отловить. Может у Вас вотчдог или еще какая гадость...

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

А в общем-то можно вообще не заводить эту пустую переменную и сделать:
Код
data_float=*(float*)0x7c00;

Go to the top of the page
 
+Quote Post
редактор
сообщение Sep 28 2011, 07:46
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Уточнение - какая модель памяти используется, если с банками, то возможно не переключаете банк памяти при чтении (да и при записи тоже наверное). Поэтому из одного места читается правильно, а из другого нет. Если на кристалле флеши дох..., то все страницы кроме 1-й расположены по адресам выше 0x7FFF и переключаются в соотвествующем регистре.
Тогда (возможно) имется Ж старт программы выбран банк 1, чтение правильно.
Работа программы , смена банка памяти компилятором (для банковской модели нормальное явление), чтение паямти и ахинея полная.
Если не это, то косяк в программе.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 28 2011, 08:33
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 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 при перемещении процедуры записи - побочный результат "перезаливки" программы с предварительным стиранием памяти.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 22:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016