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

 
 
> Странная проблема с переменными, или как пользоваться 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
XVR
сообщение Aug 7 2008, 08:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Alexey Belyaev @ Aug 7 2008, 08:21) *
К примеру есть переменная uint8_t *InitString;
В практически самом начале программы, на неё аллочится память примерно так:
Код
uint8_t *InitString;
....
len=strlen(TempBuffer+Offset);
InitString=(uint8_t *)malloc(len);
strcpy(InitString,TempBuffer+Offset);
...
И всё ровно, пока не произойдёт нечто.
Уже произошло sad.gif

Код
InitString=(uint8_t *)malloc(len+1);
strlen возвращает длинну строки не считая завершающего нуля, strcpy копирует включая завершающий нуль, затирая при этом байт за пределами выделенной через malloc памяти
Go to the top of the page
 
+Quote Post
Spider
сообщение Aug 7 2008, 08:40
Сообщение #5


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

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



Цитата(XVR @ Aug 7 2008, 15:23) *
Уже произошло sad.gif

Код
InitString=(uint8_t *)malloc(len+1);
strlen возвращает длинну строки не считая завершающего нуля, strcpy копирует включая завершающий нуль, затирая при этом байт за пределами выделенной через malloc памяти

на самом деле это так, для примера, там ещё есть такое:
Код
len = strlen(TempBuffer+Offset)+3;
...
InitString[len-3]='\r';
InitString[len-2]='\n';
InitString[len-1]=0;
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
|- - defunct   Цитата(Alexey Belyaev @ Aug 7 2008, 07:21...   Aug 7 2008, 10:52
|- - Alexey Belyaev   Цитата(defunct @ Aug 7 2008, 17:52) Это п...   Aug 7 2008, 11:45
|- - defunct   Цитата(Alexey Belyaev @ Aug 7 2008, 14:45...   Aug 7 2008, 12:53
|- - 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 Текстовая версия Сейчас: 22nd July 2025 - 02:37
Рейтинг@Mail.ru


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