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

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


Местный
***

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



Есть задача перенести код с avr на arm (компилятор gcc). Люди, которые писали программу на avr активно использовали атрибут packed для структур, затем передавали данные структуры по сериальному интерфейсу.

При переходе на arm вот с чем столкнулся. Компилятор с дериктивой packed честно пакует данные без выравнивания, а далее при попытки записать и прочитать 16, 32 - разрядные переменные, запакованные по нечётным адресам вызывает переходя ядра arm в abort mode.

Есть ли какая возможность обойти данную особенность архитектуры с помощью компилятора. Например деректива какая-нибудь. Что бы он например при обращении по нечётным адресам, делал вычитывание побайтно, а затем собирал из них short или long.

Вообще кто-нибудь сталкивался с такой проблемой? И как решал её? help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Sep 7 2007, 08:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Если при попытке сделать чтение или запись по неровному адресу процессор генерирует исключение, то можно в обработчике исключения реализовать чтение и запись по неровному адресу. К примеру, Linux так и делает, см. linux/arch/arm/mm/alignement.c.
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 10 2007, 07:09
Сообщение #3


Местный
***

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



Цитата(scifi @ Sep 7 2007, 12:47) *
Если при попытке сделать чтение или запись по неровному адресу процессор генерирует исключение, то можно в обработчике исключения реализовать чтение и запись по неровному адресу. К примеру, Linux так и делает, см. linux/arch/arm/mm/alignement.c.


Посмотрел я исходник линукса... wacko.gif Видимо я ещё не осознал суть матрицы, так как конвертация thumb инструкций на лету из arm инструкций не поддалась моему разуму. В джедаи не годен smile.gif

А если серьёзно, то такой вопрос возник: в регистрах контроллера памяти я могу посмотреть адрес памяти при доступе к которому возникла ошибка, разрядность и тип этого доступа. Для того чтобы самому завершить запись или чтение в побайтном режиме не хватает для полноты информации адреса куда записать считываемые данные (при ошибки чтения) или адреса откуда записывались данные (при ошибки записи).

Где взять недостающие данные? Есть ли простое решение этой задачки?

Сообщение отредактировал xelax - Sep 10 2007, 07:10
Go to the top of the page
 
+Quote Post
Alex03
сообщение Sep 10 2007, 07:34
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(xelax @ Sep 10 2007, 13:09) *
А если серьёзно, то такой вопрос возник: в регистрах контроллера памяти я могу посмотреть адрес памяти при доступе к которому возникла ошибка, разрядность и тип этого доступа.

Эт кто такие данные предоставляет?
Цитата
Для того чтобы самому завершить запись или чтение в побайтном режиме не хватает для полноты информации адреса куда записать считываемые данные (при ошибки чтения) или адреса откуда записывались данные (при ошибки записи).

А это видимо в любом случае регистр. Какой? Кроме как из кода операции видимо никак не узнать.
Цитата
Где взять недостающие данные? Есть ли простое решение этой задачки?

ИМХО простого решения тут видимо нет. Если есть возможность, т.е. не устаканен этот бинарный протокол связи с внешним миром, то можно попереупорядочивать элементы в структурах. Но в ряде случаев это не возможно...


А вообще когдато был топик примерно на эту тему, точно не помню, но по моему вывод был такой:
Ядро ARM - это одно, а контроллер памяти это другое. Простой контроллер памяти генерит исключение, более продвинутый разбивает одно обращение к памяти на несколько.
Вплоть до того что один и тотже пример на чипах разных производителей на ARM7 ядре давал разные результаты.
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 10 2007, 07:39
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Gemm
сообщение Sep 11 2007, 10:39
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - scifi   Цитата(Gemm @ Sep 11 2007, 14:39) Подскаж...   Sep 12 2007, 07:50


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

 


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


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