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

 
 
> Undefined instruction, Data Abort, SWI - помогите локализовать проблему!
Атмег
сообщение Aug 10 2010, 18:23
Сообщение #1


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

Группа: Участник
Сообщений: 149
Регистрация: 17-05-07
Пользователь №: 27 787



Тупой вопрос, но уже месяц не могу найти концов. Спецы, помогите!

Имеется отладочная плата at91sam9263-ek (то есть железо как мне кажется рабочее). Приложение работает, вроде бы все нормально. Но. Периодически возникают прерывания Undefined instruction, Prefetch abort, Data abort и Software interrupt. Возникают в произвольный момент времени. То есть иногда программа идет по одной и той же ветке нормально, иногда в какой то момент возникает прерывание.
Я могу понять причины Undefined instruction, ну скажем не туда что то записал (код из SDRAM исполняется), но SWI почему тогда возникает?
Смотрю отладчиком:

backtrace
#0 0x0000000c in ?? () // исключение по prefetch abort
#1 0xdfff9f36 in ?? () // предыдущее значение PC - из неиспользуемого диапазона, такое обращение и должно вызвать abort

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

Проект слинкован под SDRAM, собирается gcc-4.2.2, newlib-1.16.0.

Более конкретно вопросы:

1. SWI (software, не spurious), случайно возникает, хотя нигде в коде не используется - непонятно, как?

2. В gcc был (есть?) баг, касающийся генерации прологов/эпилогов в прерываниях, но у меня обработчики взяты из атмеловских примеров, ниже приведу их. Там и вложенность поддерживается и общий стек используется, переполнения быть не должно.
Тут вроде как все норм должно быть? Или я еще какой то тонкости не понимаю?

3. Программа попадает в прерывание, я отладчиком вижу конечное состояние и стек, но это мало чего дает, может есть еще какие то способы получить информацию о предыстории?

Вот мой стартап, обработчик FIQ скопирован с IRQ, выкидывать лишнее не стал для уверенности что не в нем проблема.
CODE

#define FIQ_STACK_SIZE 8*3*4
#define IRQ_STACK_SIZE 8*3*4

#define ARM_MODE_ABT 0x17
#define ARM_MODE_FIQ 0x11
#define ARM_MODE_IRQ 0x12
#define ARM_MODE_SVC 0x13

#define I_BIT 0x80
#define F_BIT 0x40

//------------------------------------------------------------------------------
// Startup routine
//------------------------------------------------------------------------------

.align 4
.arm

/* Exception vectors
*******************/
.section .vectors, "a", %progbits

resetVector:
ldr pc, =resetHandler /* Reset */
undefVector:
b undefVector /* Undefined instruction */
swiVector:
b swiVector /* Software interrupt */
prefetchAbortVector:
b prefetchAbortVector /* Prefetch abort */
dataAbortVector:
b dataAbortVector /* Data abort */
reservedVector:
b reservedVector /* Reserved for future use */
irqVector:
b irqHandler /* Interrupt */
fiqVector:
// b fiqHandler /* Fast interrupt */
//------------------------------------------------------------------------------
/// Handles a fast interrupt request by branching to the address defined in the
/// AIC.
//------------------------------------------------------------------------------
fiqHandler:

/* Save interrupt context on the stack to allow nesting */
sub lr, lr, #4
stmfd sp!, {lr}
mrs lr, SPSR
stmfd sp!, {r0, lr}

/* Write in the FVR to support Protect Mode */
ldr lr, =AT91C_BASE_AIC
ldr r0, [lr, #AIC_FVR]
str lr, [lr, #AIC_FVR]

/* Branch to interrupt handler in Supervisor mode */
msr CPSR_c, #ARM_MODE_SVC | F_BIT | I_BIT
stmfd sp!, {r1-r3, r4, r12, lr}
blx r0

/* Restore scratch/used registers and LR from User Stack */
/* Disable Interrupt and switch back in FIQ mode */
ldmia sp!, {r1-r3, r4, r12, lr}
msr CPSR_c, #ARM_MODE_FIQ | F_BIT | I_BIT

/* Acknowledge interrupt */
ldr lr, =AT91C_BASE_AIC
str lr, [lr, #AIC_EOICR]

/* Restore interrupt context and branch back to calling code */
ldmia sp!, {r0, lr}
msr SPSR_cxsf, lr
ldmia sp!, {pc}^

//------------------------------------------------------------------------------
/// Handles incoming interrupt requests by branching to the corresponding
/// handler, as defined in the AIC. Supports interrupt nesting.
//------------------------------------------------------------------------------
irqHandler:

/* Save interrupt context on the stack to allow nesting */
sub lr, lr, #4
stmfd sp!, {lr}
mrs lr, SPSR
stmfd sp!, {r0, lr}

/* Write in the IVR to support Protect Mode */
ldr lr, =AT91C_BASE_AIC
ldr r0, [lr, #AIC_IVR]
str lr, [lr, #AIC_IVR]

/* Branch to interrupt handler in Supervisor mode */
msr CPSR_c, #ARM_MODE_SVC
stmfd sp!, {r1-r3, r4, r12, lr}
blx r0

/* Restore scratch/used registers and LR from User Stack */
/* Disable Interrupt and switch back in IRQ mode */
ldmia sp!, {r1-r3, r4, r12, lr}
msr CPSR_c, #ARM_MODE_IRQ | F_BIT | I_BIT

/* Acknowledge interrupt */
ldr lr, =AT91C_BASE_AIC
str lr, [lr, #AIC_EOICR]

/* Restore interrupt context and branch back to calling code */
ldmia sp!, {r0, lr}
msr SPSR_cxsf, lr
ldmia sp!, {pc}^

//------------------------------------------------------------------------------
/// Initializes the chip and branches to the main() function.
//------------------------------------------------------------------------------
.section .text
.global entry

entry:
resetHandler:

/* Useless instruction for referencing the .vectors section */
ldr r0, =resetVector

/* Set pc to actual code location (i.e. not in remap zone) */
ldr pc, =1f

/* Initialize the prerelocate segment */
1:
ldr r0, =_efixed
ldr r1, =_sprerelocate
ldr r2, =_eprerelocate
1:
cmp r1, r2
ldrcc r3, [r0], #4
strcc r3, [r1], #4
bcc 1b

/* Perform low-level initialization of the chip using LowLevelInit() */
ldr sp, =_sstack
stmfd sp!, {r0}
ldr r0, =LowLevelInit
blx r0

/* Initialize the postrelocate segment */

ldmfd sp!, {r0}
ldr r1, =_spostrelocate
ldr r2, =_epostrelocate
1:
cmp r1, r2
ldrcc r3, [r0], #4
strcc r3, [r1], #4
bcc 1b

/* Clear the zero segment */
ldr r0, =_szero
ldr r1, =_ezero
mov r2, #0
1:
cmp r0, r1
strcc r2, [r0], #4
bcc 1b

/* Setup stacks
**************/
/* FIQ mode */
msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
ldr sp, =_sstack
sub r4, sp, #FIQ_STACK_SIZE

/* IRQ mode */
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
mov sp, r4
sub r4, sp, #IRQ_STACK_SIZE

/* Supervisor mode (interrupts enabled) */
msr CPSR_c, #ARM_MODE_SVC
mov sp, r4

/* Branch to main()
******************/
ldr r0, =main
blx r0

/* Loop indefinitely when program is finished */
1:
b 1b



Буду благодарен любым соображениям! Подскажите хоть что нибудь. Может кто натолкнет на мысль.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Атмег
сообщение Aug 11 2010, 11:36
Сообщение #2


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

Группа: Участник
Сообщений: 149
Регистрация: 17-05-07
Пользователь №: 27 787



Вот смотрю LR:

#0 0x0000 0004
#1 0x2000 20A4 at main.c....
#2 0xE24E E004

В LR не могло оказаться 0xE24E E004, там вообще нет кода, это зарезервированный диапазон адресов.
То есть действительно стек запорчен? Но под стек места полно и непонятно как туда что то попало.

Вот мой линкер-скрипт, может я тут чего накосячил?
CODE

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(entry)

MEMORY
{
sram (W!RX) : ORIGIN = 0x300000, LENGTH = 0x10000
sdram (W!RX) : ORIGIN = 0x20000000, LENGTH = 32M
sdram_nocache (W!RX) : ORIGIN = 0x22000000, LENGTH = 32M
}

SECTIONS
{
.fixed :
{
. = ALIGN(4);
_sfixed = .;
*(.text*)
*(.glue_7)
*(.glue_7t)
*(.rodata*)
*(.data)
. = ALIGN(4);
_efixed = .;
} > sdram

.prerelocate : AT (_efixed)
{
. = ALIGN(4);
_sprerelocate = .;
. = ALIGN(4);
_eprerelocate = .;
}

.postrelocate : AT (_efixed + SIZEOF(.prerelocate))
{
. = ALIGN(4);
_spostrelocate = .;
*(.vectors)
*(.ramfunc)
. = ALIGN(4);

_epostrelocate = .;
} > sram

.bss (NOLOAD) :
{
_szero = .;
*(.bss)
_ezero = .;
} > sdram

.nocache (NOLOAD) :
{
*(.nocache)
} > sdram_nocache

_sstack = 0x22000000;
}
end = .;


Область 0x22000000 - 0x24000000 отведена под буферы и не кэшируется.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 11 2010, 13:11
Сообщение #3


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Обычно места под стеки резервируются в startup'e. Посмотрите там внимательно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Атмег   Undefined instruction, Data Abort, SWI - помогите локализовать проблему!   Aug 10 2010, 18:23
- - aaarrr   Цитата(Атмег @ Aug 10 2010, 22:23) 1. SWI...   Aug 10 2010, 18:49
- - zltigo   QUOTE (Атмег @ Aug 10 2010, 21:23) 3. Про...   Aug 10 2010, 19:22
- - Атмег   Стартап я в первом посте привел, уже много раз все...   Aug 11 2010, 15:36
|- - zltigo   QUOTE Но под стек места полно и непонятно Вопрос н...   Aug 11 2010, 16:12
|- - defunct   Цитата(zltigo @ Aug 11 2010, 19:12) Вот, ...   Aug 12 2010, 01:16
|- - zltigo   QUOTE (defunct @ Aug 12 2010, 04:16) но п...   Aug 12 2010, 05:33
|- - defunct   Цитата(zltigo @ Aug 12 2010, 08:33) Это т...   Aug 16 2010, 02:34
|- - zltigo   QUOTE (defunct @ Aug 16 2010, 04:34) Прав...   Aug 16 2010, 06:49
|- - defunct   Цитата(zltigo @ Aug 16 2010, 09:49) Именн...   Aug 16 2010, 11:45
|- - zltigo   QUOTE (defunct @ Aug 16 2010, 13:45) Удоб...   Aug 16 2010, 11:50
|- - defunct   Цитата(zltigo @ Aug 16 2010, 14:50) Что ...   Aug 16 2010, 11:55
|- - zltigo   QUOTE (defunct @ Aug 16 2010, 13:55) смот...   Aug 16 2010, 11:59
- - sergeeff   Проверьте, правильно ли заполнена таблица векторов...   Aug 11 2010, 16:34
- - Атмег   ЦитатаВопрос на засыпку, сколько стеков у Вашего A...   Aug 12 2010, 13:37
|- - zltigo   QUOTE (Атмег @ Aug 12 2010, 16:37) backtr...   Aug 12 2010, 13:58
- - sergeeff   Вы бы взяли и прислали свой проект, если он не сов...   Aug 12 2010, 14:08
- - Атмег   Цитата(zltigo @ Aug 12 2010, 17:58) Какие...   Aug 12 2010, 14:19
|- - zltigo   QUOTE (Атмег @ Aug 12 2010, 17:19) Посему...   Aug 12 2010, 14:23
- - DpInRock   Если начинаются неожиданные вещи, первым делом при...   Aug 12 2010, 14:49


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

 


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


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