LINUX.ORG.RU

траблы с памятью (ARM, gcc2.96)


0

0

Вобщем вопрос к всезнающему такой: 1) Как ПРАВИЛЬНО для данного компиллятора указать упаковку структур ( пробовали pragma pack, __attribute__((__packed__)) на каждое поле ) 2) Какие приемы кто может посоветовать отладки чтобы узнать какой объект "пилит по памяти" другие объекты, gdb можно не советовать (приклада рил-тайм под vxworks)

★★

Re: траблы с памятью (ARM, gcc2.96)

>на каждое поле

что значит на каждое поле?
можно всю структру упаковать, а чтобы поле отдельно какой в этом смысл?

> 2) Какие приемы кто может посоветовать отладки чтобы узнать какой >объект "пилит по памяти"

а какая версия arm? возможно ваша проблема в другом,
в ARM меньше 9 версии, все указатели должны быть выравнены по 4 байтовой границе, соотвественно, что-нибудь типа
uint32_t a;
uint16_t *p = &a;
*(p + 1) = 1;
может приводить к падению.

fghj ★★★★★ ()
Ответ на: Re: траблы с памятью (ARM, gcc2.96) от klalafuda

Re: траблы с памятью (ARM, gcc2.96)

помогает, НО пробовали вот что - пишем структуры в лист. Лист лежит в объектнике, структуры ноды и листа в хидерах без аттрибутов упаковки. Наши данные должны быть упакованы ( приклада реализует сетевой протокол ). Если сделать pragma pack - числа не ложатся в поля. Решили атрибут упаковки ставить на каждое поле, проблема решилась в рамках теста, правда еще на пробовали ставить аттрибут упаковки на всю структуру. А в проекте, например, если не упаковывать поле одной из структур - рассыпается одна из статических переменных, если упаковать, то расыпается в другом месте. Подозрение что компилер дурит, а как бороться - хз :)

PETER ★★ ()
Ответ на: Re: траблы с памятью (ARM, gcc2.96) от PETER

Re: траблы с памятью (ARM, gcc2.96)

В кросплатформенных приложениях обычно специально и явно преобразуют структуры в массив байтов и обратно. Little/big-endian по-моему никакими аттрибутами не исправить.

Dr_ZLO ()

Re: траблы с памятью (ARM, gcc2.96)

Я в таких случаях просто делаю массив типа char. Далее по нужному мне смещению при помощи простых функций (избавляет от головной боли при работе big/little-endian) получаю нужные значения в переменную (можно и структуру заполнять, для удобства).

Что то вроде такого:

int GetInt(char *p) {
   return (int)(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24));
}

andreyu ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.