jdhfdg 0 25 сентября, 2011 Опубликовано 25 сентября, 2011 · Жалоба Я объявил глобальную переменную в области xdata и инициализировал ее значением 2. После инициализации проверил - все в порядке, там записано число 2. Через некоторое время снова проверил ее значение - оно оказалось -1. В коде присвоения к этой переменной нигде больше нет. Тогда как такое возможно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 25 сентября, 2011 Опубликовано 25 сентября, 2011 · Жалоба Тогда как такое возможно? А, Вы - что? Считаете этот форум - форумом телепатов? Какой МК? Область xdata как физически реализована? Где и как смотрите? "Через некоторое время" - это сколько? Что в это время МК делал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jdhfdg 0 25 сентября, 2011 Опубликовано 25 сентября, 2011 · Жалоба Микроконтроллер Silicon Laboratories C8051F126 xdata - flash Смотрю через вот так: printf("%d",v5); // выводится на экран устройства Через некоторое время - не замерял, всегда оно разное, в зависимости от того, как пользователь будет пользоваться устройством - пока дойдет до этого кода, выводящего значение на экран - может пройти секунд 5-10, а может и несколько минут. В это время МК: крутится в цикле, ждет пока юзер нажмет одну из кнопок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 25 сентября, 2011 Опубликовано 25 сентября, 2011 · Жалоба xdata - flash Значение переменной изменилось на минус 1. Это значение соответствует "чистой" flash. Ваш вопрос можно перефразировать: почему стирается flash типа ..., подключенная... и т.д.? Как вариант: Ваше устройство подключено к плохому источнику питания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба Значение переменной изменилось на минус 1. Это значение соответствует "чистой" flash. Ваш вопрос можно перефразировать: почему стирается flash типа ..., подключенная... и т.д.? Плюс к этим словам, все-таки словом xdata будет лучше называть соответствующую область RAM. А flash это память программ. Тогда уж слово "code" более подходит. Это, конечно, офтоп. По существу. Очень странно, что содержимое ячейки флэш вроде как слетает, а сама прога нет. Или поведение программы тоже меняется? или начинает сбоить? Если нет - значит собака порылась все-таки в проге и Вы что-то не договариваете. Типа v5 у Вас объявлена как char, а printf ждет int, или еще что-нибудь в этом роде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба Очень странно, что содержимое ячейки флэш вроде как слетает, а сама прога нет. Вероятнее всего, что МК и flash (на которой xdata) - это две разные м/с, возможно даже - разных производителей и выполнены по разным производственным процессам. Поэтому - ничего странного нет. P.S. Поскольку в этой flash, вероятно, ничего кроме данных не содержится, то и "обзывать" её словом "code" как-то некрасиво... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба P.S. Поскольку в этой flash, вероятно, ничего кроме данных не содержится, то и "обзывать" её словом "code" как-то некрасиво... Ах вот оно что. Если так, то да, Вы правы.А у меня почему-то сложилось мнение, что речь идет о внутренней памяти. Про отдельные м/с не подумал. Пусть ТС внесет больше ясности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба Про отдельные м/с не подумал. Пусть ТС внесет больше ясности. Ещё не понятно: каким образом во flash (xdata) попало "начальное" значение 2 ? ТС эту память программирует во время "заливки" программы в МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jdhfdg 0 26 сентября, 2011 Опубликовано 26 сентября, 2011 (изменено) · Жалоба Извините, бес попутал. xdata - это конечно же оперативная память. // адрес, куда сохранить значение во флэше #define a_v5 0xf3a8 // во флэш-памяти code int c_v5 _at_ a_v5; // в оперативке xdata int v5 = 2; void WriteFlash(void) { char xdata EA_save=EA; EA=0; SFRPAGE = 0x00; FLSCL=0x21; PSCTL=1; *((int xdata*)a_v5)=(int)v5; // тут дальше аналогичный код для других переменных... PSCTL=0; FLSCL=0x20; EA=EA_save; } void ReadFlash(void) { char xdata EA_save=EA; EA=0; SFRPAGE = 0x00; FLSCL=0x21; v5 = (int)c_v5; // <- вот в этом месте портится значение переменной v5 FLSCL=0x20; EA=EA_save; } Когда пользователь решил изменить эту переменную, он вводит значение в v5, после этого вызывается WriteFlash, пишущий это значение по определенному адресу во флэш-память. При включении прибора вызывается функция ReadFlash, копирующая из флэш в оперативку все переменные. Изменено 26 сентября, 2011 пользователем jdhfdg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба если я не ошибаюсь, то xdata - это "дополнительное" пространство ОЗУ для MCS51-семейства, ни о каком flash речь идти не может. flash - это code Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба Функция записи во флеш не работает из флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба Из Ваших путанных объяснений непонятно: в какой момент и при каких условиях портятся данные. Судя по посту выше: при чтении переменной из flash - читается не то значение, которое туда ранее было записано. Видется 2 варианта почему так может происходить: 1. Процедура записи - не верна (тут я ничего подсказать не могу, т.к. с этим МК не работал). Но это можно проверить: записать программно во flash заранее известные данные, а затем проверить память (flash), считав её программатором и сравнить с тем, что туда писалось... 2. Обнуление переменной происходит при "заливке" программы в МК, т.к., обычно, перед программированием памяти программ производится её (памяти) очистка, а значит - стирается и область flash в которую Вы сохранили переменные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jdhfdg 0 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба Дело в том, что остальные переменные пишутся и считываются таким же образом и проблем не возникает. записать программно во flash заранее известные данные, а затем проверить память (flash), считав её программатором и сравнить с тем, что туда писалось... Имеется программатор USB Debug Adapter (Silicon Laboratories). Подскажите, где в IDE Silicon Laboratories (или в Keil uVision) найти такую функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 26 сентября, 2011 Опубликовано 26 сентября, 2011 · Жалоба Дело в том, что остальные переменные пишутся и считываются таким же образом и проблем не возникает. Что же Вы это скрывали от общественности? :rolleyes: Тогда следующая версия - ошибка (описка) с адресами: например, у другой переменной такой же адрес во flash, или "не разнесли" достаточно адреса переменных и другая переменная "наезжает" на эту... Можно временно закомментировать запись других переменных и посмотреть - не испортится ли переменная v5 ? Попутно вопросы: типы остальных переменных (с которыми "проблем не возникает") тоже int ? Есть ли массивы? В какие адреса пишутся? Имеется программатор USB Debug Adapter (Silicon Laboratories). Подскажите, где в IDE Silicon Laboratories (или в Keil uVision) найти такую функцию?Раз у Вас Debug Adapter, то, наверное, в отладчике можно "ходить" "по шагам", посмотреть состояние памяти в момент выполнения некоего кода? Можно порекомендовать воспользоваться окном Keil'а "Мемоry" (может быть, нечто подобное есть и в IDE Silicon Laboratories ?) после программной записи во flash переменных и посмотреть: что записалось? Однако, боюсь, что Keil во время отладки не отслеживает изменение памяти программ... Ну, а вдруг? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jdhfdg 0 26 сентября, 2011 Опубликовано 26 сентября, 2011 (изменено) · Жалоба чтобы переменные не наезжали друг на друга - я это первым делом проверил - все в порядке там. тут что-то по чище... рядом стоят одни int-ы. Чуть дальше есть и float-ы, и массивы. Под них считаю - количество элементов умножить на размер типа. Размещаю всё впритык. ходить по шагам пробовал, но толку мало. в указанном месте просто выдает не то значение, которое записывал ранее. да еще и неудобно жутко - когда идешь по шагам показывает не тот код, который сейчас выполняется, а тот в котором находится функция main. Но это отдельная история... Это в uvision. А в Silicon Laboratories дела с этим обстоят еще хуже... Изменено 26 сентября, 2011 пользователем jdhfdg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться