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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Возникающее "Can't access memory at ... " LPC23XX приводит к зависанию
le-greem
сообщение Jul 4 2011, 11:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 22-04-11
Пользователь №: 64 545



Добрый день. У меня при работе со строками в контроллере LPC2378 время от времени возникает ошибка "Can't access memory at <адрес строки> " и контроллер зависает. Работа осуществляется, в основном, с помощью библиотечных функций "string.h". Изначально грешил на watchdog, пробовал отключать его следующим образом:

#define WATCHDOG_BASE 0x40000000 // Watchdog`s define base address
#define WDT_O_LOCK 0x00000C00 // Lock register
#define HWREG(x) (*((volatile unsigned long *)(x)))

void WatchdogLock(void)
{

HWREG(WATCHDOG_BASE + WDT_O_LOCK) = WDT_LOCK_LOCKED;
}


Но действие эффекта не возымело. Может кто-нибудь сталкивался с этой проблемой. В чем может быть дело?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 4 2011, 11:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(le-greem @ Jul 4 2011, 15:22) *
В чем может быть дело?

На 90% в параметрах, которые получают функции из библиотеки "string.h".
Go to the top of the page
 
+Quote Post
le-greem
сообщение Jul 4 2011, 11:51
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 22-04-11
Пользователь №: 64 545



Цитата(aaarrr @ Jul 4 2011, 15:30) *
На 90% в параметрах, которые получают функции из библиотеки "string.h".


Библиотека стандартная, компилятор Кейла, все параметры тоже соответствуют описанным в библиотеке. Вызов осуществляется:

strcmp(RcvSipSettings.RequestType, cOK) , где const char cOK[] = "200"; и

struct //параметры принятые из порта
{
...
char RequestType[20];
...
}

strcpy(RcvSipSettings.RequestType, RequestIdentify(FindStr));

Все сравнивается нормально первые раз-два(смотрел дебаггером), но, как правило, на третий происходит ошибка и возникает зависание. Не могли бы Вы пояснить каких параметрах может быть ошибка?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 4 2011, 12:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (le-greem @ Jul 4 2011, 14:51) *
каких параметрах может быть ошибка?

1. Зря Вы занялись замусориванием форума кросспостами.
2. RcvSipSettings.RequestType не является указателем на существующую область памяти или не является указателем на строку в результате чего при поиске вылетает за пределы существующей памяти.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
le-greem
сообщение Jul 5 2011, 11:37
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 22-04-11
Пользователь №: 64 545



Цитата(zltigo @ Jul 4 2011, 16:19) *
1. Зря Вы занялись замусориванием форума кросспостами.


Честно говоря мыслей "замусоривать" не было, но раз уж так получилось то примите мои извинения. sm.gif

Цитата(zltigo @ Jul 4 2011, 16:19) *
2. RcvSipSettings.RequestType не является указателем на существующую область памяти или не является указателем на строку в результате чего при поиске вылетает за пределы существующей памяти.

Не могли бы Вы поподробнее объяснить ситуацию, ибо способа как побороть ее я не нашел... Дело в том, что ошибка возникает при выходе из функции вида:

char *RequestIdentify(char *Request)
{
char RsvStr[150];
char *RsvdStr = RsvStr;

strcpy(RsvStr, Request);
.......
return RsvdStr;

}

При этом отладчиком выдается следующее: ***JLink Error: Failed to read current instruction. На первый взгляд, все должно работать, но этого почему то не происходит.



Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 5 2011, 11:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



То есть Вы возвращаете указатель на локальный массив?
Go to the top of the page
 
+Quote Post
le-greem
сообщение Jul 5 2011, 11:41
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 22-04-11
Пользователь №: 64 545



в данном случае да.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 5 2011, 11:47
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(le-greem @ Jul 5 2011, 15:41) *
в данном случае да.

Этот массив перестанет существовать сразу после выхода из RequestIdentify, так что возвращать указатель на него смысла не имеет.
Но проблема возникает еще раньше: бесконтрольным копированием в RsvStr может быть уничтожен стек.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 5 2011, 12:57
Сообщение #9


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(toweroff @ Jul 5 2011, 07:40) *
То есть Вы возвращаете указатель на локальный массив?

ха, это классика. Один раз в студенчестве неделю протрахавшись над таким багом, усвоил урок на всю жизнь sm.gif

ОП, я вам рекомендую прикладной код на PC отлаживать - это и быстрее, и легче.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 5 2011, 18:29
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(ar__systems @ Jul 5 2011, 16:57) *
ха, это классика. Один раз в студенчестве неделю протрахавшись над таким багом, усвоил урок на всю жизнь sm.gif

ОП, я вам рекомендую прикладной код на PC отлаживать - это и быстрее, и легче.



Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 5 2011, 19:58
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sergeeff @ Jul 5 2011, 21:29) *
Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy.

Просто ПО ЛЮБОМУ надо думать, прежде чем засовывать башку куда-то. И одетая на голову панамка ввиде ctrncpy()/strlcpy() поможет только там, где ее правильно используют. Подчеркиваю, поможет реализовать идею, а не защитить от бездумного копирования строк. Какую из функций использовать надо решать по поставленной задаче, а не по тому, что какая-то из них "лучше" а другая так-же безусловно "хуже".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 5 2011, 23:12
Сообщение #12


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(sergeeff @ Jul 5 2011, 14:29) *
Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux.

Вообще-то с тех пор компиляторы поумнели и выдают ошибку на возврат указателя на локальную переменную.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 5 2011, 23:29
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ar__systems @ Jul 6 2011, 02:12) *
Вообще-то с тех пор компиляторы поумнели и выдают ошибку на возврат указателя на локальную переменную.

Вообще-то давноооо не приходилось так писать sm.gif - рука уже не поднимается sm.gif,но помнится,что даже в середине 80x борландячий компилер ругался скорее всего warning-ом.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 5 2011, 23:31
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zltigo @ Jul 6 2011, 03:29) *
даже в середине 80x борландячий компилер ругался скорее всего warning-ом.

Варнингом - оно правильно, нельзя лишать человека права на ошибку sm.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 5 2011, 23:40
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (aaarrr @ Jul 6 2011, 02:31) *
Варнингом - оно правильно, нельзя лишать человека права на ошибку sm.gif

Скорее всего на извращения sad.gif. Я почему про warning помню - вроде когда-то зачем-то извращался в сишно-ассемблерной связке с и использовал содержимое стека.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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