Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Возникающее "Can't access memory at ... " LPC23XX приводит к зависанию
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
le-greem
Добрый день. У меня при работе со строками в контроллере 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;
}


Но действие эффекта не возымело. Может кто-нибудь сталкивался с этой проблемой. В чем может быть дело?
aaarrr
Цитата(le-greem @ Jul 4 2011, 15:22) *
В чем может быть дело?

На 90% в параметрах, которые получают функции из библиотеки "string.h".
le-greem
Цитата(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));

Все сравнивается нормально первые раз-два(смотрел дебаггером), но, как правило, на третий происходит ошибка и возникает зависание. Не могли бы Вы пояснить каких параметрах может быть ошибка?
zltigo
QUOTE (le-greem @ Jul 4 2011, 14:51) *
каких параметрах может быть ошибка?

1. Зря Вы занялись замусориванием форума кросспостами.
2. RcvSipSettings.RequestType не является указателем на существующую область памяти или не является указателем на строку в результате чего при поиске вылетает за пределы существующей памяти.
le-greem
Цитата(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. На первый взгляд, все должно работать, но этого почему то не происходит.



toweroff
То есть Вы возвращаете указатель на локальный массив?
le-greem
в данном случае да.
aaarrr
Цитата(le-greem @ Jul 5 2011, 15:41) *
в данном случае да.

Этот массив перестанет существовать сразу после выхода из RequestIdentify, так что возвращать указатель на него смысла не имеет.
Но проблема возникает еще раньше: бесконтрольным копированием в RsvStr может быть уничтожен стек.
ar__systems
Цитата(toweroff @ Jul 5 2011, 07:40) *
То есть Вы возвращаете указатель на локальный массив?

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

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

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



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

Просто ПО ЛЮБОМУ надо думать, прежде чем засовывать башку куда-то. И одетая на голову панамка ввиде ctrncpy()/strlcpy() поможет только там, где ее правильно используют. Подчеркиваю, поможет реализовать идею, а не защитить от бездумного копирования строк. Какую из функций использовать надо решать по поставленной задаче, а не по тому, что какая-то из них "лучше" а другая так-же безусловно "хуже".
ar__systems
Цитата(sergeeff @ Jul 5 2011, 14:29) *
Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux.

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

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

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

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

sergeeff
Цитата(zltigo @ Jul 5 2011, 23:58) *
Просто ПО ЛЮБОМУ надо думать, прежде чем засовывать башку куда-то.


Представлается, что для "юных" пользователей ценность веток, наподобии этой, состоит в том, что "старшие" товарищи не просто сообщают молодежи об их "безмозглости", но и показывают на их ошибки, разъясняя (или хотя бы заостряя внимание) почему так делать нельзя и как делать лучше. Ни коим образом не ратую за то, чтобы начать программировать за них.
le-greem
Цитата(sergeeff @ Jul 6 2011, 10:16) *
Представлается, что для "юных" пользователей ценность веток, наподобии этой, состоит в том, что "старшие" товарищи не просто сообщают молодежи об их "безмозглости", но и показывают на их ошибки, разъясняя (или хотя бы заостряя внимание) почему так делать нельзя и как делать лучше. Ни коим образом не ратую за то, чтобы начать программировать за них.



А как Вы представляли себе ветку "В помощь начинающему" если никто здесь не будет задавать, порою, глупых вопросов, чтобы получить на них ответы ? Я что то не нашел нигде у себя просьбы за меня программировать. В таком случае, непонятным остается причина столь резкого Вашего высказывания.
Dog Pawlowa
Цитата(le-greem @ Aug 11 2011, 08:39) *
В таком случае, непонятным остается причина столь резкого Вашего высказывания.

bb-offtopic.gif Дык http://lurkmore.ru/Уже_не_тот
Но замечания учтите wink.gif
le-greem
Уже учел. sm.gif Не думаю, что повторю эту ошибку впредь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.