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

 
 
 
Reply to this topicStart new topic
> исключительные ситуации
dimka76
сообщение Dec 19 2007, 06:52
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



в арме есть исключительная ситуация - ошибка данных.
Объясните пожалуйста, что это такое?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
shahr
сообщение Dec 19 2007, 08:07
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 6-06-06
Из: Москва
Пользователь №: 17 793



Цитата(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


--------------------
wbw
shahr
Go to the top of the page
 
+Quote Post
xelax
сообщение Dec 19 2007, 08:19
Сообщение #3


Местный
***

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



Цитата(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
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Dec 19 2007, 10:03
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



В 7-ом АРМе можно без проблем читать невыровненные адреса. Делал так в LPC21xx.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 19 2007, 10:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shahr @ Dec 19 2007, 11:07) *
Вобщем эта штука возникает при обращении к несуществующему адресу.

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

Сигнал ABORT приходит от контроллера памяти, так что причины возникновения Data Abort могут быть разными у разных производителей.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Dec 19 2007, 10:20
Сообщение #6


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



А тогда какие действия следует производить в обработчике этой исключительной ситуации?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 19 2007, 10:36
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Обычно никаких, кроме вывода диагностики. Просто не нужно допускать его вызова.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Dec 19 2007, 10:51
Сообщение #8


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



ОФФ: А что делает линух в этой ситуации? Убивает поток, вызвавший ошибку, или останавливается полностью?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
xelax
сообщение Dec 19 2007, 12:09
Сообщение #9


Местный
***

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



Цитата(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

Сообщение отредактировал xelax - Dec 19 2007, 12:00
Go to the top of the page
 
+Quote Post
Alex03
сообщение Dec 20 2007, 05:14
Сообщение #10


Местный
***

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



Цитата(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 другой....

Ну и компиляторы в ряде случаев умеют разбивать обращения к памяти (если знают что это надо делать). Например обращение к невыровненной глобальной переменной прокатывает я надеюсь везде, только зачастую разбивается на байтовые обращения.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Dec 20 2007, 09:53
Сообщение #11


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
xelax
сообщение Dec 20 2007, 15:37
Сообщение #12


Местный
***

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



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

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


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

Но это всё таки частный случай.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:59
Рейтинг@Mail.ru


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