Перейти к содержанию
    

Возникающее "Can't access memory at ... " LPC23XX приводит к зависанию

Добрый день. У меня при работе со строками в контроллере 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;

}

 

 

Но действие эффекта не возымело. Может кто-нибудь сталкивался с этой проблемой. В чем может быть дело?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чем может быть дело?

На 90% в параметрах, которые получают функции из библиотеки "string.h".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На 90% в параметрах, которые получают функции из библиотеки "string.h".

 

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

 

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

 

struct //параметры принятые из порта

{

...

char RequestType[20];

...

}

 

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

 

Все сравнивается нормально первые раз-два(смотрел дебаггером), но, как правило, на третий происходит ошибка и возникает зависание. Не могли бы Вы пояснить каких параметрах может быть ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

каких параметрах может быть ошибка?

1. Зря Вы занялись замусориванием форума кросспостами.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Зря Вы занялись замусориванием форума кросспостами.

 

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

 

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. На первый взгляд, все должно работать, но этого почему то не происходит.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в данном случае да.

Этот массив перестанет существовать сразу после выхода из RequestIdentify, так что возвращать указатель на него смысла не имеет.

Но проблема возникает еще раньше: бесконтрольным копированием в RsvStr может быть уничтожен стек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть Вы возвращаете указатель на локальный массив?

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux.

Вообще-то с тех пор компиляторы поумнели и выдают ошибку на возврат указателя на локальную переменную.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то с тех пор компиляторы поумнели и выдают ошибку на возврат указателя на локальную переменную.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

даже в середине 80x борландячий компилер ругался скорее всего warning-ом.

Варнингом - оно правильно, нельзя лишать человека права на ошибку :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Варнингом - оно правильно, нельзя лишать человека права на ошибку :)

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...