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

 
 
> 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
Ответов
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
serwz
сообщение Feb 11 2009, 14:52
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:27
Рейтинг@Mail.ru


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