|
Выравнивание в gcc, Обращение по нечётным адресам |
|
|
|
Sep 7 2007, 06:21
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Есть задача перенести код с avr на arm (компилятор gcc). Люди, которые писали программу на avr активно использовали атрибут packed для структур, затем передавали данные структуры по сериальному интерфейсу. При переходе на arm вот с чем столкнулся. Компилятор с дериктивой packed честно пакует данные без выравнивания, а далее при попытки записать и прочитать 16, 32 - разрядные переменные, запакованные по нечётным адресам вызывает переходя ядра arm в abort mode. Есть ли какая возможность обойти данную особенность архитектуры с помощью компилятора. Например деректива какая-нибудь. Что бы он например при обращении по нечётным адресам, делал вычитывание побайтно, а затем собирал из них short или long. Вообще кто-нибудь сталкивался с такой проблемой? И как решал её?
|
|
|
|
|
 |
Ответов
|
Sep 10 2007, 07:09
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(scifi @ Sep 7 2007, 12:47)  Если при попытке сделать чтение или запись по неровному адресу процессор генерирует исключение, то можно в обработчике исключения реализовать чтение и запись по неровному адресу. К примеру, Linux так и делает, см. linux/arch/arm/mm/alignement.c. Посмотрел я исходник линукса...  Видимо я ещё не осознал суть матрицы, так как конвертация thumb инструкций на лету из arm инструкций не поддалась моему разуму. В джедаи не годен А если серьёзно, то такой вопрос возник: в регистрах контроллера памяти я могу посмотреть адрес памяти при доступе к которому возникла ошибка, разрядность и тип этого доступа. Для того чтобы самому завершить запись или чтение в побайтном режиме не хватает для полноты информации адреса куда записать считываемые данные (при ошибки чтения) или адреса откуда записывались данные (при ошибки записи). Где взять недостающие данные? Есть ли простое решение этой задачки?
Сообщение отредактировал xelax - Sep 10 2007, 07:10
|
|
|
|
|
Sep 10 2007, 07:34
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(xelax @ Sep 10 2007, 13:09)  А если серьёзно, то такой вопрос возник: в регистрах контроллера памяти я могу посмотреть адрес памяти при доступе к которому возникла ошибка, разрядность и тип этого доступа. Эт кто такие данные предоставляет? Цитата Для того чтобы самому завершить запись или чтение в побайтном режиме не хватает для полноты информации адреса куда записать считываемые данные (при ошибки чтения) или адреса откуда записывались данные (при ошибки записи). А это видимо в любом случае регистр. Какой? Кроме как из кода операции видимо никак не узнать. Цитата Где взять недостающие данные? Есть ли простое решение этой задачки? ИМХО простого решения тут видимо нет. Если есть возможность, т.е. не устаканен этот бинарный протокол связи с внешним миром, то можно попереупорядочивать элементы в структурах. Но в ряде случаев это не возможно... А вообще когдато был топик примерно на эту тему, точно не помню, но по моему вывод был такой: Ядро ARM - это одно, а контроллер памяти это другое. Простой контроллер памяти генерит исключение, более продвинутый разбивает одно обращение к памяти на несколько. Вплоть до того что один и тотже пример на чипах разных производителей на ARM7 ядре давал разные результаты.
|
|
|
|
|
Sep 10 2007, 07:39
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(Alex03 @ Sep 10 2007, 11:34)  Эт кто такие данные предоставляет?
А это видимо в любом случае регистр. Какой? Кроме как из кода операции видимо никак не узнать. Регистр статуса контроллера памяти Название регистра: MC_ASR Регистр адреса аварийной ситуации Название регистра: MC_AASR для at91sam7 см. либо user manual, либо http://www.gaw.ru/html.cgi/txt/doc/micros/..._sam7s/19_3.htmОчень хотелось бы избежать анализа кода инструкций, очень уж это по-линуксовски сложно.
Сообщение отредактировал xelax - Sep 10 2007, 07:42
|
|
|
|
|
Sep 11 2007, 10:39
|

Участник

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283

|
Подскажите, пожалуйста, как делать выравненные структуры в IAR? Например, хочу, чтобы следующая структура была длиной 12 байт, чтоб два первых shorta лежали с интервалом в 4 байта. Пробовал использовать #pragma pack(4) - не помогает.... Код struct { unsigned short A; unsigned short B; unsigned long C; } s_abc;
|
|
|
|
|
Sep 12 2007, 07:50
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Gemm @ Sep 11 2007, 14:39)  Подскажите, пожалуйста, как делать выравненные структуры в IAR? Например, хочу, чтобы следующая структура была длиной 12 байт, чтоб два первых shorta лежали с интервалом в 4 байта. Пробовал использовать #pragma pack(4) - не помогает.... Код struct { unsigned short A; unsigned short B; unsigned long C; } s_abc; Для этого делается заполнение: Код struct { unsigned short A; unsigned short padding1; unsigned short B; unsigned short padding2; unsigned long C; } s_abc; Или при помощи безымянных битовых полей (совсем красиво): Код struct { unsigned short A; unsigned short : 16; unsigned short B; unsigned short : 16; unsigned long C; } s_abc;
|
|
|
|
Сообщений в этой теме
xelax Выравнивание в gcc Sep 7 2007, 06:21 Puzan Директивами не исправить.
Попробуй сделать битовым... Sep 7 2007, 06:36 xelax Цитата(Puzan @ Sep 7 2007, 10:36) Директи... Sep 7 2007, 07:13 abcdefg Цитата(Puzan @ Sep 7 2007, 10:36) Директи... Sep 7 2007, 08:16 amw Цитата(xelax @ Sep 7 2007, 09:21) Есть за... Sep 7 2007, 07:44 xelax Код#define PACK __attribute__ ((__packed__... Sep 7 2007, 07:53 amw ЦитатаА ваш пример действительно работает, так как... Sep 7 2007, 08:18  xelax Цитата(amw @ Sep 7 2007, 12:18) Нет. Стру... Sep 7 2007, 08:24   amw Цитата(xelax @ Sep 7 2007, 11:24) видимо ... Sep 7 2007, 08:32 Puzan С указателями на поля по-любому не получится. С ук... Sep 7 2007, 08:42 xelax Цитата(scifi @ Sep 7 2007, 12:47) Если пр... Sep 7 2007, 09:08  scifi Цитата(xelax @ Sep 7 2007, 13:08) Это г... Sep 7 2007, 09:19     Alex03 Цитата(Gemm @ Sep 11 2007, 16:39) Подскаж... Sep 12 2007, 05:40
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|