|
|
  |
Sam7x256 и EMAC data abort ...., может кто сталкивался, как обрабатывать? |
|
|
|
Feb 11 2009, 13:48
|
Участник

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

|
Устройство на Sam7x256 в большой сетке периодически уходит в EMAC data abort. Устанавливается бит SVMST_EMAC: Saved EMAC Abort Source, почему это случается и как бороться, может кто сталкивался? Как обрабатывать эту ситуацию ? Если работать с устройством p2p, то работает днями без проблем.
|
|
|
|
|
Feb 11 2009, 14:18
|
Участник

Группа: Новичок
Сообщений: 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 ?
|
|
|
|
|
Feb 11 2009, 14:26
|
Гуру
     
Группа: Свой
Сообщений: 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 вызвало не ядро), но сам факт его возникновения указывает на ошибку в программе.
|
|
|
|
|
Feb 11 2009, 14:41
|
Участник

Группа: Новичок
Сообщений: 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?
|
|
|
|
|
Feb 11 2009, 14:45
|

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

|
Цитата(serwz @ Feb 11 2009, 17:41)  По поводу DataAbort Написал простейший хандлер, сразу вернуться из прерывания, но прерывание продолжает висеть и зацикливается на самом себе, то есть вызывается снова. Как сбросить эту ситуацию - не знаю? Как сбросить DataAbort? Наверное потомучто EMAC продолжает пытаться записать что-то по ошибочному адресу. Дата аборт сбрасывается просто корректным выходом из обработчика Код SUBS PC,R14_abt,#8
|
|
|
|
|
Feb 11 2009, 14:49
|
Гуру
     
Группа: Свой
Сообщений: 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'а. Не стоит из него возвращаться, короче говоря.
|
|
|
|
|
Feb 11 2009, 14:52
|
Участник

Группа: Новичок
Сообщений: 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 кода
|
|
|
|
|
Feb 11 2009, 15:02
|
Гуру
     
Группа: Свой
Сообщений: 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 не должен возникать никогда.
|
|
|
|
|
Feb 11 2009, 15:52
|
Участник

Группа: Новичок
Сообщений: 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. то каким местом она может быть прицеплена к драйверу я затрудняюсь ответить. У нас тут сетка большая и ходят разные пакеты, в том числе и битые - может проблема в этом (не уверен). По поводу обработчика исключений, читал разные мануалы и т.д. все пишут обрабатывается как стандартное прерывание. Но могу ошибаться, с ядром АРМа знаком не досконально. Если приведете пример обработчика - большое спасибо.
|
|
|
|
|
Feb 11 2009, 16:09
|
Участник

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

|
Цитата(aaarrr @ Feb 11 2009, 19:57)  Ошибка OVR не связана с возникающим Data Abort.
Со стороны ядра - да, похоже на обычное прерывание. Но AIC к abort'ам никак не относится. Ну тогда совсем не понятно, откуда берется признак EMAC abort, что причина? драйвер только читает память контроллера и анализирует уже пришедшие пакеты, при чет тут EMAC data abort? Ладно. Спасибо за ответы, еще раз проверю драйвер.
|
|
|
|
|
Feb 12 2009, 00:57
|

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

|
Цитата(serwz @ Feb 11 2009, 18:09)  драйвер только читает память контроллера и анализирует уже пришедшие пакеты, при чет тут EMAC data abort? Вот вопросы и ответы которые могут быть полезны, и которые Вы сами могли задать и ответить: Это не драйвер аборт вызвал, а EMAC самолично. Почему? - потому что ему сказали складывать или брать данные с неверного адреса. Кто ему так сказал? - по всей видимости проц. Где он так сказал? - да где угодно (например при формировании TX пакета) - вылезли за границу буфера - затерли шапку другого буфера, EMAC взял эту шапку - а там каша вместо верного адреса - вот и аборт.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|