|
Снова о gcc и невыровненном доступе к памяти |
|
|
|
Jun 28 2011, 07:29
|
Группа: Новичок
Сообщений: 4
Регистрация: 6-05-09
Пользователь №: 48 742

|
Знаю что такие темы уже были, тем не менее я так и не разобрался как сделать лучше и проще всего Есть Atmel AT91RM9200, на котором крутится Linux, и на который надо портировать софтинку, в которой есть необходимость обращаться к элементам структуры типа:
struct blabla { char ch; int that; } blabla_t
При обращении к that и происходит, собсно, невыровненный доступ к памяти. При этом объявить структуру с параметром __attribute__ ((__aligned__(4))), или дополнить паддингом я не могу, ибо по сети приходит пакет, на который собсно и накладывается структура. Да и отловить все подобные обращения в сотне исходный файлов не представляется оптимальным путём.
Собственно, вопрос, как быть? Неужели нет простой возможности обойти проблему в банальнейшей операции обращения к полю структуры?
И еще одна непонятка. Вроде бы бит A в CP15 включен, однако никаких исключений при таких обращения не происходит. Поэтому я даже не могу узнать о таком обращении. ЧЯДНТ? Может, надо еще что то где то включить? Или в линухе реализована обработка подобного исключения но у меня она почему то не работает?
Всем спасибо!
|
|
|
|
|
 |
Ответов
|
Jun 28 2011, 08:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(vinni-puch @ Jun 28 2011, 11:29)  Код struct blabla { char ch; int that; } blabla_t При обращении к that и происходит, собсно, невыровненный доступ к памяти. Не верю! либо вы делаете примерно так: Код char *incomming_message; ..... struct blabla *b; b = (struct blabla *) incomming_message; /* Так делать нельзя, т.к. компилятор не может ничего узнать будет ли то, куда указывает incomming_message выровнено в памяти! */
b->that = 100500; /* Если incomming_message не было выровнено, то и на доступ внутри структуры тоже будет ошибка выравнивания */ Один из вариантов решения (ИМХО не лучший): Код char *incomming_message; ..... struct blabla b;
memcpy(&b, incomming_message); /* Таким образом мы создаём копию данных, которые гарантированно выровнены в памяти */
b.that = 100500; /* В этом месте компилятор обязан сгенерировать код без невыровненных обращений */ ИМХО более надёжный путь декодировать данные, приходящие с внешних каналов, не наступая на грабли (aligned/BigEndian): Код int read_u8(uint8_t **message, size_t *len, uint8_t *retval){ if (*len >= sizeof(uint8_t) ){ *retval = **message; *message += sizeof(uint8_t); *len -= sizeof(uint8_t); return 0; /* Ok */ } return (-1); /* Fail */ }
int read_u16_LE(uint8_t **message, size_t *len, uint16_t *retval){ uint8_t msb; uint8_t lsb; if(read_u8(message, len, &lsb) < 0){ return (-1); /* Fail */ }
if(read_u8(message, len, &msb) < 0){ return (-1); /* Fail */ }
*retval = (msb << 8) | lsb;
return (0); /* Ok */ }
int read_u16_BE(uint8_t **message, size_t *len, uint16_t *retval){ uint8_t msb; uint8_t lsb; if(read_u8(message, len, &msb) < 0){ return (-1); /* Fail */ }
if(read_u8(message, len, &lsb) < 0){ return (-1); /* Fail */ }
*retval = (msb << 8) | lsb;
return (0); /* Ok */ } как-то так =)
|
|
|
|
Сообщений в этой теме
vinni-puch Снова о gcc и невыровненном доступе к памяти Jun 28 2011, 07:29 KRS Цитата(vinni-puch @ Jun 28 2011, 11... Jun 28 2011, 07:36 zltigo QUOTE (vinni-puch @ Jun 28 2011, 09... Jun 28 2011, 07:38 scifi Цитата(vinni-puch @ Jun 28 2011, 11... Jun 28 2011, 07:40 vinni-puch Ребят, по факту у меня ЕСТЬ невыровненное обращени... Jun 28 2011, 08:04  scifi Цитата(vinni-puch @ Jun 28 2011, 12... Jun 28 2011, 08:11   vinni-puch Цитата(scifi @ Jun 28 2011, 11:11) Неприл... Jun 28 2011, 09:04    scifi Цитата(vinni-puch @ Jun 28 2011, 13... Jun 28 2011, 09:27    zltigo QUOTE (vinni-puch @ Jun 28 2011, 11... Jun 28 2011, 12:01     Petka Цитата(zltigo @ Jun 28 2011, 16:01) Совер... Jun 28 2011, 13:46      KRS Цитата(Petka @ Jun 28 2011, 17:46) Так по... Jun 28 2011, 13:51       Petka Цитата(KRS @ Jun 28 2011, 17:51) Да все б... Jun 28 2011, 14:46        KRS Цитата(Petka @ Jun 28 2011, 18:46) Итог: ... Jun 28 2011, 15:22         Petka Цитата(KRS @ Jun 28 2011, 19:22) Ну вам н... Jun 28 2011, 16:00          KRS Цитата(Petka @ Jun 28 2011, 20:00) Давайт... Jun 28 2011, 16:05           Petka Цитата(KRS @ Jun 28 2011, 20:05) И при че... Jun 28 2011, 16:18            zltigo QUOTE (Petka @ Jun 28 2011, 18:18) P.S. В... Jun 28 2011, 16:54            KRS Цитата(Petka @ Jun 28 2011, 20:18) Да, пр... Jun 28 2011, 17:36      zltigo QUOTE (Petka @ Jun 28 2011, 15:46) Так по... Jun 28 2011, 14:05  zltigo QUOTE (vinni-puch @ Jun 28 2011, 10... Jun 28 2011, 08:21 VladislavS Если компилятор сам расположил структуру в памяти,... Jun 28 2011, 17:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|