Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: исключительные ситуации
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
dimka76
в арме есть исключительная ситуация - ошибка данных.
Объясните пожалуйста, что это такое?
shahr
Цитата(dimka76 @ Dec 19 2007, 09:52) *
в арме есть исключительная ситуация - ошибка данных.
Объясните пожалуйста, что это такое?


In case of accessing an unspecified memory address, the CPU jumps to the so called data abort vector.
Вобщем эта штука возникает при обращении к несуществующему адресу.
типа:

addr_outa_space = (u_long *)0x09000000
*addr_outa_space = 0x11111111
xelax
Цитата(shahr @ Dec 19 2007, 11:07) *
In case of accessing an unspecified memory address, the CPU jumps to the so called data abort vector.
Вобщем эта штука возникает при обращении к несуществующему адресу.
типа:

addr_outa_space = (u_long *)0x09000000
*addr_outa_space = 0x11111111


Не только к несуществующим, но ещё и к невыровненным. Например при двубайтном обращении, адрес к которому обращаешься должен быть кратен двум. А вообще лучше почитать об этом самому например здесь http://www.gaw.ru/html.cgi/txt/doc/micros/...tmi/exclude.htm
GetSmart
В 7-ом АРМе можно без проблем читать невыровненные адреса. Делал так в LPC21xx.
aaarrr
Цитата(shahr @ Dec 19 2007, 11:07) *
Вобщем эта штука возникает при обращении к несуществующему адресу.

Цитата(xelax @ Dec 19 2007, 11:19) *
Не только к несуществующим, но ещё и к невыровненным.

Сигнал ABORT приходит от контроллера памяти, так что причины возникновения Data Abort могут быть разными у разных производителей.
dimka76
А тогда какие действия следует производить в обработчике этой исключительной ситуации?
aaarrr
Обычно никаких, кроме вывода диагностики. Просто не нужно допускать его вызова.
Dron_Gus
ОФФ: А что делает линух в этой ситуации? Убивает поток, вызвавший ошибку, или останавливается полностью?
xelax
Цитата(GetSmart @ Dec 19 2007, 13:03) *
В 7-ом АРМе можно без проблем читать невыровненные адреса. Делал так в LPC21xx.


Я бы не стал так утверждать. Например SAM7 генерирует исключения.

К стати Вы ассемблерной код смотрели такого чтения. Может просто компилятор за Вас побайтовое чтение организовал smile.gif

Цитата(Dron_Gus @ Dec 19 2007, 13:51) *
ОФФ: А что делает линух в этой ситуации? Убивает поток, вызвавший ошибку, или останавливается полностью?


Линукс по коду команды определяет что надо было сделать.

вот исходник
http://www.gelato.unsw.edu.au/lxr/source/a.../mm/alignment.c
Alex03
Цитата(xelax @ Dec 19 2007, 13:19) *
Не только к несуществующим, но ещё и к невыровненным. Например при двубайтном обращении, адрес к которому обращаешься должен быть кратен двум.

Цитата(GetSmart @ Dec 19 2007, 15:03) *
В 7-ом АРМе можно без проблем читать невыровненные адреса. Делал так в LPC21xx.

Цитата(xelax @ Dec 19 2007, 17:09) *
Я бы не стал так утверждать. Например SAM7 генерирует исключения.
К стати Вы ассемблерной код смотрели такого чтения. Может просто компилятор за Вас побайтовое чтение организовал smile.gif


Помнится уже был топик по этому поводу.
ИМХО ядро ARM выдаёт внешнему контроллеру памяти чего хочет (читать/писать, по какому адресу....), а уже этот контроллер памяти генерит в случае необходимости исключения, или не генерит если обладает более продвинутой логикой, умеет разбивать одно обращение на несколько (не только в случае невыровненности, но и, например, при чтении 32-х разрядного слова из 8-ми байтовой битовой (вот это я очепятался) внешней памяти) и т.д.
У NXP этот контроллер один, у Atmel другой....

Ну и компиляторы в ряде случаев умеют разбивать обращения к памяти (если знают что это надо делать). Например обращение к невыровненной глобальной переменной прокатывает я надеюсь везде, только зачастую разбивается на байтовые обращения.
GetSmart
Цитата(xelax @ Dec 19 2007, 17:09) *
К стати Вы ассемблерной код смотрели такого чтения. Может просто компилятор за Вас побайтовое чтение организовал smile.gif

Смотрел. Компилятор понятия не имел откуда я буду читать и читал 4 байта в одной команде. При этом он читал LONG с адреса (addr & ~3) и сдвигал его вправо на ((addr & 3) << 3) бит.

Точнее сдвигал вправо по кругу. Можно сказать на (addr & 3) байт.
xelax
Цитата(GetSmart @ Dec 20 2007, 12:53) *
Смотрел. Компилятор понятия не имел откуда я буду читать и читал 4 байта в одной команде. При этом он читал LONG с адреса (addr & ~3) и сдвигал его вправо на ((addr & 3) << 3) бит.

Точнее сдвигал вправо по кругу. Можно сказать на (addr & 3) байт.


Почитал я мануал на 21хх, действительно про обращение по невыровненным адресам ни слова.
можно сделать вывод, что контроллер памяти разруливает такие ситуации.

Но это всё таки частный случай.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.