реклама на сайте
подробности

 
 
> Снова о gcc и невыровненном доступе к памяти
vinni-puch
сообщение Jun 28 2011, 07:29
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 6-05-09
Пользователь №: 48 742



Знаю что такие темы уже были, тем не менее я так и не разобрался как сделать лучше и проще всего
Есть Atmel AT91RM9200, на котором крутится Linux, и на который надо портировать софтинку, в которой есть необходимость обращаться к элементам структуры типа:

struct blabla {
char ch;
int that;
} blabla_t


При обращении к that и происходит, собсно, невыровненный доступ к памяти.
При этом объявить структуру с параметром __attribute__ ((__aligned__(4))), или дополнить паддингом я не могу, ибо по сети приходит пакет, на который собсно и накладывается структура.
Да и отловить все подобные обращения в сотне исходный файлов не представляется оптимальным путём.

Собственно, вопрос, как быть? Неужели нет простой возможности обойти проблему в банальнейшей операции обращения к полю структуры?

И еще одна непонятка. Вроде бы бит A в CP15 включен, однако никаких исключений при таких обращения не происходит. Поэтому я даже не могу узнать о таком обращении. ЧЯДНТ? Может, надо еще что то где то включить? Или в линухе реализована обработка подобного исключения но у меня она почему то не работает?

Всем спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Petka
сообщение Jun 28 2011, 08:58
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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 */
}


как-то так =)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - KRS   Цитата(Petka @ Jun 28 2011, 12:58) Кодcha...   Jun 28 2011, 10:01
|- - Petka   Цитата(KRS @ Jun 28 2011, 14:01) Зато мож...   Jun 28 2011, 10:45
|- - KRS   Цитата(Petka @ Jun 28 2011, 14:45) 2) Вся...   Jun 28 2011, 13:42
- - VladislavS   Если компилятор сам расположил структуру в памяти,...   Jun 28 2011, 17:43


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016