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

В поисках истины
  
Группа: Свой
Сообщений: 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; Какова будет разница? есть ли тут смысл?
|
|
|
|
|
 |
Ответов
|
Aug 7 2008, 04:21
|

В поисках истины
  
Группа: Свой
Сообщений: 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 внутри структуры сменила своё значение. Я сейчас занимаюсь выводом в дебаг инфы при обращении к указателям, дабы исключить обращения "не туда". Но на глаз по коду тут всё ровно.
|
|
|
|
|
Aug 7 2008, 11:45
|

В поисках истины
  
Группа: Свой
Сообщений: 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ми было именно так. ЗЫ.  какие должны быть задержки для 70n памяти и 8MHz проца? Перепробовал все задержки шины, эффект остался. Пока пробовал урезал функционал, пока не перестанет проявляться баг. Нашёл эдакую середину. Как все могли заметить, то работаю я с GSM модемом. Так вот, если убрать совсем дозвон куда либо, а оставить только инициализацию модема и прочий функционал программы, то всё работает. Достаточно заставить модем звонить куда-либо, то после 2ого (!!!) звонка, строка инициализации карёжится. За первый раз как-будто не добирается указатель до неё
|
|
|
|
|
Aug 7 2008, 12:53
|

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

|
Цитата(Alexey Belyaev @ Aug 7 2008, 14:45)  Перепробовал все задержки шины, эффект остался. Что-то не так с разводкой или с МС памяти. Основываясь на Вашем последнем посте определенно точно можно сказать, что с адресными линиями все Ок (с защелкой в т.ч. все Ок - защелка работает). Проблема с данными, кстати, если читать одну и ту же строку несколько раз подряд проблема исчезает? или после изменения ячейки, постоянно читается неверное значение? Теоретически для тактирования 8Mhz и 70ns памяти, задержки могуть быть нулевые, но тут может влиять разводка (паразитные емкости растягивают фронты). Поэтому для теста установить макс задержку и посмотреть осциллографом форму сигналов на линиях данных. Еще, если сигнальные линии подключены к шине через резисторы - последние убрать, вместо них поставить перемычки или нулевки. Цитата Достаточно заставить модем звонить куда-либо, то после 2ого (!!!) звонка, строка инициализации карёжится. Что за модем? Может быть модем фонит на шину данных? Отключите модем от тел. линии и попробуйте звонить, испортятся ли данные в этом случае также? Цитата Так вот, если убрать совсем дозвон куда либо, а оставить только инициализацию модема и прочий функционал программы, то всё работает. Пардон пропустил мимо ушей что модем GSM, тогда он фонит еще серьезнее. Однозначно ШД забивается помехами - попробуйте разместить модем как можно дальше от устройства. Поставить экраны (напр для теста обмотать девайс паралоном, а сверху фольгой). Если подтвердится, боюсь придется переделывать разводку полностью. Также проверьте не затягивается ли фронт сигнала "R" (хотя если бы дело было в нем, тогда характер искажений был бы другим).
|
|
|
|
|
Aug 7 2008, 13:14
|

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

|
Цитата(defunct @ Aug 7 2008, 19:53)  Проблема с данными, кстати, если читать одну и ту же строку несколько раз подряд проблема исчезает? или после изменения ячейки, постоянно читается неверное значение? Ничего подобного. Я писал тест памяти, который пишет в память 0xFF 0xAA 0x00 0x55 и потом это от туда читает 10 раз. Так же ещё ряд тестов, и всё ровно. Только что пробовал это на разных задержках. Цитата(defunct @ Aug 7 2008, 19:53)  Теоретически для тактирования 8Mhz и 70ns памяти, задержки могуть быть нулевые, но тут может влиять разводка (паразитные емкости растягивают фронты). Поэтому для теста установить макс задержку и посмотреть осциилографом форму сигналов на линиях данных. Еще, если сигнальные линии подключены к шине через резисторы - последние убрать или заменить на нулевки. Память чтоит максимально близко к процу, никаких резисторов на шинах нет. Цитата(defunct @ Aug 7 2008, 19:53)  Пардон пропустил мимо ушей что модем GSM, тогда он фонит еще серьезнее. Однозначно ШД забивается помехами - попробуйте разместить модем как можно дальше от устройства. Поставить экраны (напр для теста обмотать девайс паралоном, а сверху фольгой). Если подтвердится, боюсь придется переделывать разводку полностью. Также проверьте не затягивается ли фронт сигнала "R" (хотя если бы дело было в нем, тогда характер искажений был бы другим). Тяжко, но попробую. Кстати такое не наблюдалось ранее, прошивку пишу не первый день
|
|
|
|
Сообщений в этой теме
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      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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|