|
Возникающее "Can't access memory at ... " LPC23XX приводит к зависанию |
|
|
|
Jul 4 2011, 11:22
|
Участник

Группа: Участник
Сообщений: 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; }
Но действие эффекта не возымело. Может кто-нибудь сталкивался с этой проблемой. В чем может быть дело?
|
|
|
|
|
Jul 4 2011, 11:51
|
Участник

Группа: Участник
Сообщений: 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)); Все сравнивается нормально первые раз-два(смотрел дебаггером), но, как правило, на третий происходит ошибка и возникает зависание. Не могли бы Вы пояснить каких параметрах может быть ошибка?
|
|
|
|
|
Jul 5 2011, 11:37
|
Участник

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

|
Цитата(zltigo @ Jul 4 2011, 16:19)  1. Зря Вы занялись замусориванием форума кросспостами. Честно говоря мыслей "замусоривать" не было, но раз уж так получилось то примите мои извинения.  Цитата(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. На первый взгляд, все должно работать, но этого почему то не происходит.
|
|
|
|
|
Jul 5 2011, 11:41
|
Участник

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

|
в данном случае да.
|
|
|
|
|
Jul 5 2011, 18:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(ar__systems @ Jul 5 2011, 16:57)  ха, это классика. Один раз в студенчестве неделю протрахавшись над таким багом, усвоил урок на всю жизнь ОП, я вам рекомендую прикладной код на PC отлаживать - это и быстрее, и легче. Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux.
|
|
|
|
|
Jul 5 2011, 19:58
|

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

|
QUOTE (sergeeff @ Jul 5 2011, 21:29)  Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Просто ПО ЛЮБОМУ надо думать, прежде чем засовывать башку куда-то. И одетая на голову панамка ввиде ctr ncpy()/str lcpy() поможет только там, где ее правильно используют. Подчеркиваю, поможет реализовать идею, а не защитить от бездумного копирования строк. Какую из функций использовать надо решать по поставленной задаче, а не по тому, что какая-то из них "лучше" а другая так-же безусловно "хуже".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|