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

 
 
> Sam7x256 и EMAC data abort ...., может кто сталкивался, как обрабатывать?
serwz
сообщение Feb 11 2009, 13:48
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 17-11-05
Пользователь №: 10 989



Устройство на Sam7x256 в большой сетке периодически уходит в EMAC data abort.
Устанавливается бит SVMST_EMAC: Saved EMAC Abort Source, почему это случается
и как бороться, может кто сталкивался?
Как обрабатывать эту ситуацию ?
Если работать с устройством p2p, то работает днями без проблем.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
aaarrr
сообщение Feb 11 2009, 14:03
Сообщение #2


Гуру
******

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



Цитата(serwz @ Feb 11 2009, 16:48) *
почему это случается и как бороться, может кто сталкивался?

Потому что DMA EMAC'а из-за ошибки в драйвере неправильно обращается к памяти. В реальной сети это проявляется из-за большей загрузки.
Go to the top of the page
 
+Quote Post
serwz
сообщение Feb 11 2009, 14:18
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 17-11-05
Пользователь №: 10 989



Цитата(aaarrr @ Feb 11 2009, 18:03) *
Потому что DMA EMAC'а из-за ошибки в драйвере неправильно обращается к памяти. В реальной сети это проявляется из-за большей загрузки.

Под прием распределенно 200 блоков по 128 байт, битик в статусе приема BNA: Buffer Not Available не устанавливается, т.е. и драйвер и DMA работает.
Иногда устанавливается OVR: Receive Overrun, но как с этим бороться не знаю. Потому и прошу помощи - как эту ошибку обрабатывать?
Как сбрасывать этот data abort ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 14:26
Сообщение #4


Гуру
******

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



Цитата(serwz @ Feb 11 2009, 17:18) *
Под прием распределенно 200 блоков по 128 байт, битик в статусе приема BNA: Buffer Not Available не устанавливается, т.е. и драйвер и DMA работает.

Что у Вас в MC_ASR (помимо SVMST_EMAC) и MC_AASR после аборта?

Цитата(serwz @ Feb 11 2009, 17:18) *
Иногда устанавливается OVR: Receive Overrun, но как с этим бороться не знаю. Потому и прошу помощи - как эту ошибку обрабатывать?

Никак не обрабатывать, просто принять к сведению - все сделает железка.

Цитата(serwz @ Feb 11 2009, 17:18) *
Как сбрасывать этот data abort ?

Теоретически из DataAbort'а можно вернуться так же, как из прерывания (в данном случае не нужно повторять инструкцию, так как abort вызвало не ядро), но сам факт его возникновения указывает на ошибку в программе.
Go to the top of the page
 
+Quote Post
serwz
сообщение Feb 11 2009, 14:41
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 17-11-05
Пользователь №: 10 989



Цитата(aaarrr @ Feb 11 2009, 18:26) *
Что у Вас в MC_ASR (помимо SVMST_EMAC) и MC_AASR после аборта?


Никак не обрабатывать, просто принять к сведению - все сделает железка.


Теоретически из DataAbort'а можно вернуться так же, как из прерывания (в данном случае не нужно повторять инструкцию, так как abort вызвало не ядро), но сам факт его возникновения указывает на ошибку в программе.


MC_ASR = 0х05010А01

MC_AASR - непонятный адрес, каждый раз меняется

Я понимаю что OVR: Receive Overrun все делает железка.
По поводу DataAbort
Написал простейший хандлер, сразу вернуться из прерывания, но прерывание продолжает висеть и зацикливается на самом себе, то есть вызывается снова.
Как сбросить эту ситуацию - не знаю? Как сбросить DataAbort?
Go to the top of the page
 
+Quote Post
xelax
сообщение Feb 11 2009, 14:45
Сообщение #6


Местный
***

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



Цитата(serwz @ Feb 11 2009, 17:41) *
По поводу DataAbort
Написал простейший хандлер, сразу вернуться из прерывания, но прерывание продолжает висеть и зацикливается на самом себе, то есть вызывается снова.
Как сбросить эту ситуацию - не знаю? Как сбросить DataAbort?


Наверное потомучто EMAC продолжает пытаться записать что-то по ошибочному адресу.
Дата аборт сбрасывается просто корректным выходом из обработчика
Код
SUBS PC,R14_abt,#8
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 14:49
Сообщение #7


Гуру
******

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



Цитата(serwz @ Feb 11 2009, 17:41) *
Написал простейший хандлер, сразу вернуться из прерывания, но прерывание продолжает висеть и зацикливается на самом себе, то есть вызывается снова.
Как сбросить эту ситуацию - не знаю? Как сбросить DataAbort?

Естественно зацикливается - EMAC же продолжает ходить по левым адресам. Можно сбросить сам EMAC, но это не выход, так как нужно установить настоящую проблему.

Цитата(xelax @ Feb 11 2009, 17:45) *
Дата аборт сбрасывается просто корректным выходом из обработчика
Код
SUBS PC,R14_abt,#8

Это если ядро вызвало исключение. Если виноват EMAC, то возвращаться нужно так:
Код
SUBS PC, R14_abt, #4

О чем я, собственно, уже писал.

UPD: Хотя вопрос спорный - не понятно, что произойдет, если ядро не работало с памятью и получило abort или работало, но не являлось источником abort'а. Не стоит из него возвращаться, короче говоря.
Go to the top of the page
 
+Quote Post
serwz
сообщение Feb 11 2009, 14:52
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 17-11-05
Пользователь №: 10 989



Цитата(xelax @ Feb 11 2009, 18:45) *
Наверное потомучто EMAC продолжает пытаться записать что-то по ошибочному адресу.
Дата аборт сбрасывается просто корректным выходом из обработчика
Код
SUBS PC,R14_abt,#8


Может вопрос в обработчике, примеров обработки этого исключения не нашел, ниже привожу текст
может в чем ошибка?

Data_Abort_Handler_Entry:

;-------------------------
;- Manage Exception Entry
;-------------------------
;- Adjust and save LR_irq in IRQ stack
sub lr, lr, #8
stmfd sp!, {lr}

;- Save r0 and SPSR (need to be saved for nested interrupt)
mrs r14, SPSR
stmfd sp!, {r0,r14}

;- Enable Interrupt and Switch in Supervisor Mode
msr CPSR_c, #SVC_MODE

;- Save scratch/used registers and LR in User Stack
stmfd sp!, { r1-r3, r12, r14}

;----------------------------------------------
;- Branch to the routine pointed by the AIC_IVR
;----------------------------------------------
b Data_handler
;----------------------------------------------
;- Manage Exception Exit
;----------------------------------------------
;- Restore scratch/used registers and LR from User Stack
ldmia sp!, { r1-r3, r12, r14}

;- Disable Interrupt and switch back in IRQ mode
msr CPSR_c, #I_BIT | IRQ_MODE

;- Mark the End of Interrupt on the AIC
ldr r14, =AT91C_BASE_AIC
str r14, [r14, #AIC_EOICR]

;- Restore SPSR_irq and r0 from IRQ stack
ldmia sp!, {r0,r14}
msr SPSR_cxsf, r14

;- Restore adjusted LR_irq from IRQ stack directly in the PC
ldmia sp!, {pc}^


Data_handler определяется в си файле

__arm void Data_handler(void)
{
EMAC_Init();
}


Все компилится в режиме генерации ARM кода
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 15:02
Сообщение #9


Гуру
******

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



Цитата(serwz @ Feb 11 2009, 17:52) *
sub lr, lr, #8
stmfd sp!, {lr}

См. выше.

Цитата(serwz @ Feb 11 2009, 17:52) *
;- Mark the End of Interrupt on the AIC
ldr r14, =AT91C_BASE_AIC
str r14, [r14, #AIC_EOICR]

Это здесь зачем?

Не заморачивайтесь особо обработчиком - в нормальной ситуации Data Abort не должен возникать никогда.
Go to the top of the page
 
+Quote Post
serwz
сообщение Feb 11 2009, 15:52
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 17-11-05
Пользователь №: 10 989



Цитата(aaarrr @ Feb 11 2009, 19:02) *
См. выше.


Это здесь зачем?

Не заморачивайтесь особо обработчиком - в нормальной ситуации Data Abort не должен возникать никогда.


Спасибо за совет, но я пока не понимаю как я могу разрулить ситуацию с этим
Я DMA не управляю и шиной тоже и если возникает ошибка

• OVR: Receive Overrun
The DMA block was unable to store the receive frame to memory, either because the bus was not granted in time or
because a not OK hresp(bus error) was returned. The buffer is recovered if this happens.

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

По поводу обработчика исключений, читал разные мануалы и т.д. все пишут обрабатывается как стандартное прерывание.
Но могу ошибаться, с ядром АРМа знаком не досконально.
Если приведете пример обработчика - большое спасибо.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 15:57
Сообщение #11


Гуру
******

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



Ошибка OVR не связана с возникающим Data Abort.

Цитата(serwz @ Feb 11 2009, 18:52) *
По поводу обработчика исключений, читал разные мануалы и т.д. все пишут обрабатывается как стандартное прерывание.

Со стороны ядра - да, похоже на обычное прерывание. Но AIC к abort'ам никак не относится.
Go to the top of the page
 
+Quote Post
serwz
сообщение Feb 11 2009, 16:09
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 17-11-05
Пользователь №: 10 989



Цитата(aaarrr @ Feb 11 2009, 19:57) *
Ошибка OVR не связана с возникающим Data Abort.


Со стороны ядра - да, похоже на обычное прерывание. Но AIC к abort'ам никак не относится.


Ну тогда совсем не понятно, откуда берется признак EMAC abort, что причина?
драйвер только читает память контроллера и анализирует уже пришедшие пакеты, при чет тут EMAC data abort?

Ладно.
Спасибо за ответы, еще раз проверю драйвер.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 16:12
Сообщение #13


Гуру
******

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



Цитата(serwz @ Feb 11 2009, 19:09) *
Ну тогда совсем не понятно, откуда берется признак EMAC abort, что причина?

Например, грохнули дескрипторы DMA.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 12 2009, 00:57
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(serwz @ Feb 11 2009, 18:09) *
драйвер только читает память контроллера и анализирует уже пришедшие пакеты, при чет тут EMAC data abort?

Вот вопросы и ответы которые могут быть полезны, и которые Вы сами могли задать и ответить:

Это не драйвер аборт вызвал, а EMAC самолично.
Почему? - потому что ему сказали складывать или брать данные с неверного адреса.
Кто ему так сказал? - по всей видимости проц.
Где он так сказал? - да где угодно (например при формировании TX пакета) - вылезли за границу буфера - затерли шапку другого буфера, EMAC взял эту шапку - а там каша вместо верного адреса - вот и аборт.
Go to the top of the page
 
+Quote Post

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

 


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


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