[an error occurred while processing this directive]
Помогите разобраться - 5502 глюк какой-то или с картой памяти или с прерываниями (+ много)
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено _A_K 22 апреля 2004 г. 08:52

Ситуация такая: больая часть написана на С, фильтры и т.п. взято из DSPLIB на АСМе с творческой переработкой.
Версия CCS - 2.20, build tools - 2.56
Кэш отключен.

Объявлена структура для работы с кольцевыми буферами:


typedef struct
{
s16 *read;
s16 *write;
s16 *start;
u16 size;
} Cbuf;

Обработчик прерывания (берет байт принятый от АЦП через McBSP и кладет его в кольцевой буфер):


interrupt void isr_aic23_rx(void)
{
extern Cbuf LineRxSmpl;

*LineRxSmpl.write++ = _MCBSP_DRR20;
_MCBSP_DRR10;

if(LineRxSmpl.write >= LineRxSmpl.start + LineRxSmpl.size) LineRxSmpl.write = LineRxSmpl.start;
}


его ассемблерный код ниже

так вот в основной программе в модуле, где работа с кольцевыми буферами время отклика на это прерывание зависит от длины (в байтах) этого модуля
пример:
если в функции


u16 cbuf_get_free(Cbuf *Buf)
{
asm(" nop");
return Buf->size - cbuf_get_fill(Buf);
}

изменять количество nop-ов, то это влияет на время отклика на прерывание, причем на время порядка 500-1000 тактов проца

карта памяти - все в одной куче, все во внутренней RAM:

MEMORY /* in bytes */
{
PAGE 0:
MMR (RWIX) : origin = 0000h, length = 000C0h
IVEC (RWIX) : origin = 0100h, length = 00100h
DARAM (RWIX) : origin = 0200h, length = 0FE00h

PAGE 2:
IOPORT (RWIX) : origin = 0000h, length = 0FFFFh
}

SECTIONS
{
.init > DARAM
.cinit > DARAM
.const > DARAM
.text > DARAM
.data > DARAM
.csldata > DARAM
.stack > DARAM
.sysstack > DARAM
.fircoeff > DARAM
.dbuffer > DARAM
.vectors > IVEC

.bss > DARAM
.ioport > IOPORT PAGE 2
}

я уже затрахался, не знаю что и делать

реплики типа "надо все на асме писать" прошу оставить при себе

эмулятора нет, жду второй месяц , когда придет SM510PCI

ассемблерный код всех кусков:


.sect ".text"
.align 4
.global _isr_aic23_rx
.sym _isr_aic23_rx,_isr_aic23_rx, 32, 2, 0
.func 61
;----------------------------------------------------------------------
; 61 | interrupt void isr_aic23_rx(void)
;----------------------------------------------------------------------
;*******************************************************************************
;* INTERRUPT NAME: _isr_aic23_rx *
;* *
;* Function Uses Regs : AR1,XAR1,AR2,XAR2,AR3,XAR3,SP,ST1,ST2,ST3,MDP,CARRY, *
;* TC1,M40,SATA,SATD,RDM,FRCT,SMUL *
;* Save On Entry Regs : AR1,AR2,AR3,ST3,MDP *
;*******************************************************************************
_isr_aic23_rx:
.line 2
;----------------------------------------------------------------------
; 63 | extern Cbuf LineRxSmpl;
;----------------------------------------------------------------------
PSHBOTH XAR1
PSHBOTH XAR2
PSHBOTH XAR3
PSH mmap(ST3_55)
PSH mmap(MDP)
AMAR *SP(#0), XAR1
AND #0xfffe, mmap(SP)
PSH AR1
AND #0xf91f, mmap(ST1_55)
OR #0x4100, mmap(ST1_55)
AND #0xfa00, mmap(ST2_55)
OR #0x8000, mmap(ST2_55)
.ref ___bss__
MOV #((___bss__ >> 16) & 0x7f), MDP
AMOV #___bss__, XAR1
AMAR *AR1, XAR2
AMAR *AR1, XAR3
AADD #-1, SP
.line 5
;----------------------------------------------------------------------
; 65 | *LineRxSmpl.write++ = _MCBSP_DRR20;
;----------------------------------------------------------------------
MOV *abs16(#(_LineRxSmpl+1)), AR2 ; |65|
AMOV AR2, AR3 ; |65|
AMAR *AR3+
MOV AR3, *abs16(#(_LineRxSmpl+1)) ; |65|
MOV #10241, AR3 ; |65|
MOV port(*AR3), AR1 ; |65|
MOV AR1, *AR2 ; |65|
.line 6
;----------------------------------------------------------------------
; 66 | _MCBSP_DRR10;
;----------------------------------------------------------------------
MOV #10240, AR3 ; |66|
MOV port(*AR3), AR1 ; |66|
.line 8
;----------------------------------------------------------------------
; 68 | if(LineRxSmpl.write >= LineRxSmpl.start + LineRxSmpl.size) LineRxSmpl.w
; | rite = LineRxSmpl.start;
;----------------------------------------------------------------------
BCLR ST3_SATA
MOV *abs16(#(_LineRxSmpl+3)), AR1 ; |68|
ADD *abs16(#(_LineRxSmpl+2)), AR1, AR1 ; |68|
MOV *abs16(#(_LineRxSmpl+1)), AR2 ; |68|
CMPU AR2 < AR1, TC1 ; |68|
BCC L4,TC1 ; |68|
; branch occurs ; |68|
MOV *abs16(#(_LineRxSmpl+2)), AR1 ; |68|
MOV AR1, *abs16(#(_LineRxSmpl+1)) ; |68|
L4:
.line 9
;----------------------------------------------------------------------
; 69 | _MCBSP_PCR1 ^= ~b0;
;----------------------------------------------------------------------
MOV #11282, AR3 ; |69|
XOR #0xfffe, port(*AR3) ; |69|
.line 10
AADD #1, SP
POP mmap(SP)
POP mmap(MDP)
POP mmap(ST3_55)
POPBOTH XAR3
POPBOTH XAR2
POPBOTH XAR1
RETI

.sect ".text"
.align 4
.global _cbuf_get_free
.sym _cbuf_get_free,_cbuf_get_free, 45, 2, 0
.func 44
;----------------------------------------------------------------------
; 44 | u16 cbuf_get_free(Cbuf *Buf)
;----------------------------------------------------------------------
;*******************************************************************************
;* FUNCTION NAME: _cbuf_get_free *
;* *
;* Function Uses Regs : T0,AR0,AR3,SP,CARRY,M40,SATA,SATD,RDM,FRCT,SMUL *
;* Stack Frame : Compact (No Frame Pointer, w/ debug) *
;* Total Frame Size : 2 words *
;* (1 return address/alignment) *
;* (1 local values) *
;*******************************************************************************
_cbuf_get_free:
.line 2
;* AR0 assigned to _Buf
.sym _Buf,16, 24, 17, 16, $$fake0
.sym _Buf,0, 24, 1, 16, $$fake0
AADD #-1, SP
MOV AR0, *SP(#0) ; |45|
.line 12
;----------------------------------------------------------------------
; 55 | asm(" nop");
;----------------------------------------------------------------------
nop
.line 13
;----------------------------------------------------------------------
; 56 | return Buf->size - cbuf_get_fill(Buf);
;----------------------------------------------------------------------
CALL #_cbuf_get_fill ; |56|
; call occurs [#_cbuf_get_fill] ; |56|
MOV *SP(#0), AR3 ; |56|
SUB T0, *AR3(short(#3)), T0 ; |56|
.line 14
AADD #1, SP ; |56|
RET ; |56|
; return occurs ; |56|
.endfunc 57,000000000h,1


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru