мне необходимо реализовать на асм-е следующий сишный код - обработчик прерывания таймера:
Код
__ramfunc void timer0_irq_handler()
{
ii--;
if(ii==0) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
if(datA&0x80000000) regA = 0x20000;
else regA = 0x0;
regs->PIOA_ODSR = regA|front;
datA = datA<<1;
dummy = MipsTimerBase->TC_SR;
}
Этот код рабочий, благодаря ему я получаю необходимую последовательность импульсов на выходе.
Так я повторил этот код на асме АРМ:
При прирывании вызываетя следующая функция:
__ramfunc void ASM_timer0_irq()
{
timer0_irq_ASM(ii,datA,front);
}
которая в свою очередь вызывает асм-функциюи сообщает туда 3 параметра.
Код
IO_base DEFINE 0xFFFFF400
ODSR DEFINE 0x38
TC_base DEFINE 0xFFFA0000
TC0_CCR DEFINE 0x0
TC0_RA DEFINE 0x14
TC0_RB DEFINE 0x18
TC0_RC DEFINE 0x1C
TC0_SR DEFINE 0x20
TC_CLKDIS DEFINE 0x2
PUBLIC timer0_irq_ASM
timer0_irq_ASM ;r0 = ii, r1 = dataA, r2 = front
ldr r12,=TC_base ;смещение для TC
ldr r11,=IO_base ;смещение для PIO
sub r0, r0, #1 ;ii--
beq Stop_TC0
bne Work_TC0
Stop_TC0:
ldr r7, =TC_CLKDIS
str r7,[r12,#TC0_CCR] ;MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS
b timer0_irq_ASM_end
Work_TC0:
ldr r7, =30
str r7,[r12, #TC0_RA] ;MipsTimerBase->TC_RA = 30
ldr r7, =60
str r7, [r12, #TC0_RB] ;MipsTimerBase->TC_RB = 60
str r7, [r12, #TC0_RC] ;MipsTimerBase->TC_RC = 60
mov r6, r1, lsr #28 ;смещаем содержимое r1 (datA) вправо на 28 бит, так как операнд не может быть больше 12 бит в длину, а мне необходимо анализировать состояние 32-бита r1
and r6, r6, #0x8
ldrne r6, =0x20000 ;if(datA&0x80000000) regA = 0x20000
ldreq r6, =0 ;else regA = 0x0
orr r6, r6, r2
str r6, [r11, #ODSR] ;regs->PIOA_ODSR = regA|front
mov r0, r0, lsl #1 ;datA = datA<<1
ldr r6, [r12, #TC0_SR] ;dummy = MipsTimerBase->TC_SR
timer0_irq_ASM_end:
bx lr
асм-код не работает так же, как и сишный. то есть таймер запускается, импульсы нужной частоты идут, но таймер не останавливается при обнулении счетчика ii и не меняет ldrne r6, =0x20000 или ldreq r6, =0 в зависимости от содержимого r1.
Заранее благодарен.
Сообщение отредактировал Bulat - Nov 23 2009, 07:05