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

 
 
> Странная проблема с переменными, или как пользоваться volatile
Spider
сообщение Aug 6 2008, 13:46
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Чудесным образом портится память. Стал выяснять что же не так и не пойму.
Возник вопрос каксающийся volatile.
Есть ли разница в следующем и какая?
Код
typedef struct TSTRUCT
{
  volatile u8 *DATABuff;
  volatile u8 *CMDBuff;
} T_STRUCT;

volatile T_STRUCT STRUCT;
и вариант
Код
typedef struct TSTRUCT
{
  u8 *DATABuff;
  u8 *CMDBuff;
} T_STRUCT;

volatile T_STRUCT STRUCT;
Какова будет разница? есть ли тут смысл?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SysRq
сообщение Aug 7 2008, 02:33
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(defunct @ Aug 6 2008, 18:17) *
Расскажите больше о характере повреждений.

+1

А sizeof() используете? Внимательно проверьте где и как.
Go to the top of the page
 
+Quote Post
Spider
сообщение Aug 7 2008, 04:21
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Цитата(SysRq @ Aug 7 2008, 09:33) *
Цитата(defunct @ Aug 6 2008, 18:17) *

Расскажите больше о характере повреждений

+1
А sizeof() используете? Внимательно проверьте где и как.

К примеру есть переменная uint8_t *InitString;
В практически самом начале программы, на неё аллочится память примерно так:
Код
uint8_t *InitString;
....
len=strlen(TempBuffer+Offset);
InitString=(uint8_t *)malloc(len);
strcpy(InitString,TempBuffer+Offset);
...
И всё ровно, пока не произойдёт нечто. К примеру содержимое строки было "AT+IFC=2,2\r\n" и первое и второе и даже третее обращение к ней именно это и получало, но после чего-то содержимое строки может стать "подбитым" к примеру таким "AT+I@C*2,2\r\n". И это только частный пример. Бывает что просто переменная uint8_t внутри структуры сменила своё значение.

Я сейчас занимаюсь выводом в дебаг инфы при обращении к указателям, дабы исключить обращения "не туда". Но на глаз по коду тут всё ровно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 7 2008, 10:52
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Alexey Belyaev @ Aug 7 2008, 07:21) *
может стать "подбитым" к примеру таким "AT+I@C*2,2\r\n".

Это похоже на сбои железа (в обоих случаях поврежден 1 бит).
Если используется вняшняя память - увеличте задержки шины.
Go to the top of the page
 
+Quote Post
Spider
сообщение Aug 7 2008, 11:45
Сообщение #5


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Цитата(defunct @ Aug 7 2008, 17:52) *
Это похоже на сбои железа (в обоих случаях поврежден 1 бит).
Если используется вняшняя память - увеличте задержки шины.

ну да... странно конечно, почему тогда всегда одно и то же место в всегда одно и то же значение?
сейчас так:
Было: AT +IFC=2,2 +IPR=115200
Стало: AT +IFC=2,2 «IPR=115200
0x2B изменилось на 0xAB, по сути старший бит стал 1. И уже раз 8 из 8ми было именно так.

ЗЫ. bb-offtopic.gif какие должны быть задержки для 70n памяти и 8MHz проца?

Перепробовал все задержки шины, эффект остался.
Пока пробовал урезал функционал, пока не перестанет проявляться баг.
Нашёл эдакую середину. Как все могли заметить, то работаю я с GSM модемом. Так вот, если убрать совсем дозвон куда либо, а оставить только инициализацию модема и прочий функционал программы, то всё работает. Достаточно заставить модем звонить куда-либо, то после 2ого (!!!) звонка, строка инициализации карёжится.
За первый раз как-будто не добирается указатель до неёsmile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 7 2008, 12:53
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Alexey Belyaev @ Aug 7 2008, 14:45) *
Перепробовал все задержки шины, эффект остался.

Что-то не так с разводкой или с МС памяти.
Основываясь на Вашем последнем посте определенно точно можно сказать, что с адресными линиями все Ок (с защелкой в т.ч. все Ок - защелка работает).

Проблема с данными, кстати, если читать одну и ту же строку несколько раз подряд проблема исчезает? или после изменения ячейки, постоянно читается неверное значение?

Теоретически для тактирования 8Mhz и 70ns памяти, задержки могуть быть нулевые, но тут может влиять разводка (паразитные емкости растягивают фронты). Поэтому для теста установить макс задержку и посмотреть осциллографом форму сигналов на линиях данных. Еще, если сигнальные линии подключены к шине через резисторы - последние убрать, вместо них поставить перемычки или нулевки.

Цитата
Достаточно заставить модем звонить куда-либо, то после 2ого (!!!) звонка, строка инициализации карёжится.

Что за модем? Может быть модем фонит на шину данных?
Отключите модем от тел. линии и попробуйте звонить, испортятся ли данные в этом случае также?

Цитата
Так вот, если убрать совсем дозвон куда либо, а оставить только инициализацию модема и прочий функционал программы, то всё работает.

Пардон пропустил мимо ушей что модем GSM, тогда он фонит еще серьезнее. Однозначно ШД забивается помехами - попробуйте разместить модем как можно дальше от устройства. Поставить экраны (напр для теста обмотать девайс паралоном, а сверху фольгой). Если подтвердится, боюсь придется переделывать разводку полностью. Также проверьте не затягивается ли фронт сигнала "R" (хотя если бы дело было в нем, тогда характер искажений был бы другим).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alexey Belyaev   Странная проблема с переменными   Aug 6 2008, 13:46
- - rezident   Разница есть, только смысла в ней нету А память ...   Aug 6 2008, 13:55
- - Сергей Борщ   В первом случае у вас может (неизвестным для компи...   Aug 6 2008, 13:58
|- - defunct   Цитата(Сергей Борщ @ Aug 6 2008, 16:58) P...   Aug 6 2008, 14:17
|- - Alexey Belyaev   Цитата(defunct @ Aug 6 2008, 21:17) Автор...   Aug 6 2008, 14:25
|- - defunct   Цитата(Alexey Belyaev @ Aug 6 2008, 17:25...   Aug 6 2008, 14:31
|- - Alexey Belyaev   Цитата(defunct @ Aug 6 2008, 21:31) Потом...   Aug 7 2008, 02:06
- - MrYuran   данные могут портиться при нарушении выравнивания ...   Aug 6 2008, 14:23
|- - XVR   Цитата(Alexey Belyaev @ Aug 7 2008, 08:21...   Aug 7 2008, 08:23
||- - Alexey Belyaev   Цитата(XVR @ Aug 7 2008, 15:23) Уже произ...   Aug 7 2008, 08:40
|- - Alexey Belyaev   Цитата(defunct @ Aug 7 2008, 19:53) Пробл...   Aug 7 2008, 13:14
|- - rezident   Цитата(Alexey Belyaev @ Aug 7 2008, 19:14...   Aug 7 2008, 13:39
- - Непомнящий Евгений   размер кучи достаточен? Куча часом не до стека иде...   Aug 7 2008, 05:32
|- - Alexey Belyaev   Цитата(Непомнящий Евгений @ Aug 7 2008, 12...   Aug 7 2008, 06:03
- - sigmaN   Я не пользовался WinAVR, но называется это обычно ...   Aug 7 2008, 06:20
|- - Alexey Belyaev   Цитата(sigmaN @ Aug 7 2008, 13:20) Я не п...   Aug 7 2008, 06:29
|- - Сергей Борщ   Цитата(Alexey Belyaev @ Aug 7 2008, 09:29...   Aug 7 2008, 07:46
|- - Alexey Belyaev   Цитата(Сергей Борщ @ Aug 7 2008, 14:46) А...   Aug 7 2008, 08:16
- - Alexey Belyaev   Ну вот. Не знаю что сделал, но глюк стал стабилен....   Aug 7 2008, 10:36
- - Alexey Belyaev   Ну в общем ситуация такая. Была просадка напряжени...   Aug 8 2008, 05:41


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:50
Рейтинг@Mail.ru


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