Russian Qt Forum

Qt => Qt Embedded => Тема начата: dd от Декабрь 07, 2010, 10:18



Название: Проблемы с памятью WinCE. 0x80000002
Отправлено: dd от Декабрь 07, 2010, 10:18
Два дня бьюсь, на ровном месте крашится программа.
WinCE SDK 5.0, MSVC 2005.

Если создать новый порект и  куда-нибудь в начало копирнуть кусок кода:

Код:
#include <QMap>
.......
{
QMap<QString, QString> map_hdr;
map_hdr["target"] = "test";

unsigned char *buf_out = new unsigned char[188];
memset(buf_out, 0, 188);

int counter_dd = 0;
for(QMap<QString, QString> ::const_iterator begin = map_hdr.constBegin(), end= map_hdr.constEnd(); begin != end; ++begin)
{
counter_dd += 1;
int a = 0x11223344;

//  *((unsigned int*)(buf_out + counter_dd)) = a;
((unsigned int*)(buf_out + counter_dd))[0] = a;

{ //// PRINT BUFFER IN HEX
QByteArray arr((const char*)buf_out, 188);
QString str_hex(arr.toHex());
QMessageBox::warning(this, "", str_hex);
}
}
delete [] buf_out;
}
то на девайсе будет краш с ошибкой 0x80000002.
MSDN говорит, что мол "Ran out of memory".
Сначала код был с использованием std::map.
Было также. Грешил на реализацию stl. Запустил с QMap.

Причем если вместо
Код:
counter_dd += 1;

Поставить:

Код:
counter_dd = 1;

Или другое число, ничего не падает.
Ума не приложу, в чем дело.
Если с stl я мог предположить, что std::map портит стек, то тут вообще идеи закончились.
(На других платформах - линукс, виндовс, фря - все порверено и работает).

Выручайте!


ДОБАВЛЕНО

Убрал QMap
Код:
	{
unsigned char *buf_out = new unsigned char[188];
memset(buf_out, 0, 188);

int counter_dd = 0;

for(int i = 0; i < 2; i++)
{
counter_dd += 1;
int a = 0x11223344;

//  *((unsigned int*)(buf_out + counter_dd)) = a;
((unsigned int*)(buf_out + counter_dd))[0] = a;


{ //// PRINT BUFFER IN HEX
QByteArray arr((const char*)buf_out, 188);
QString str_hex(arr.toHex());
QMessageBox::warning(this, "", str_hex);
}
}
delete [] buf_out;
}

Просто код на Си. Падает.


Название: Re: Проблемы с памятью WinCE. 0x80000002
Отправлено: BRE от Декабрь 07, 2010, 10:50
А что это за платформа (устройство)?
На некоторых платформах просто не возможно обратиться (R/W) по не выравненному адресу, процессор, обнаружив такую попытку просто генерирует исключение.


Название: Re: Проблемы с памятью WinCE. 0x80000002
Отправлено: dd от Декабрь 07, 2010, 11:18
А можно поподробнее, что это такое и что с этим делать?
Девайс - Link 300, на борту winCE 5.0. SDK 5.0 (ARMV4I).
QT работает норм.

Вот нашел: http://www.gamedev.ru/terms/MemoryAlignment
Оно?
Посмотрел ошибку - адрес заканчивается на 0x....1C, то есть по 16 не выровнен, исходя из статьи.


Название: Re: Проблемы с памятью WinCE. 0x80000002
Отправлено: BRE от Декабрь 07, 2010, 12:47
Поищи в гугле: ARMV4I+выравнивание

http://ru.osdev.wikia.com/wiki/Логическая_структура_памяти_(ARM)
http://ru.osdev.wikia.com/wiki/Исключения_(ARM)


Название: Re: Проблемы с памятью WinCE. 0x80000002
Отправлено: dd от Декабрь 07, 2010, 19:01
Спасибо за наводку.
Заюзал QByteArray, все работает.