Цитата(AlexBoy @ Jun 22 2007, 16:03)

Выложи кусок, где общий хандлер прерываний (который вызывается из асма) и хандлер системного прерывания.
это из порта
Код
DbguUart_Irq_UCOS
STMFD SP!, {R1-R3} ; PUSH WORKING REGISTERS ONTO IRQ STACK
MOV R1, SP ; Save IRQ stack pointer
ADD SP, SP,#12 ; Adjust IRQ stack pointer
SUB R2, LR,#4 ; Adjust PC for return address to task
MRS R3, SPSR ; Copy SPSR (i.e. interrupted task CPSR) to R3
MSR CPSR_c, #(NO_INT | SVC32_MODE); Change to SVC mode
; SAVE TASK CONTEXT ONTO TASK STACK
STMFD SP!, {R2} ; Push task Return PC
STMFD SP!, {LR} ; Push task LR
STMFD SP!, {R4-R12} ; Push task R12-R4
LDMFD R1!, {R4-R6} ; Move task R1-R3 from IRQ stack to SVC stack
STMFD SP!, {R4-R6}
STMFD SP!, {R0} ; Push task R0 onto task stack
STMFD SP!, {R3} ; Push task CPSR (i.e. IRQ SPSR)
LDR R4, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP
LDR R5, [R4]
STR SP, [R5] ;
MSR CPSR_c, #(NO_INT | IRQ32_MODE); Change to IRQ mode (to use the IRQ stack to handle interrupt)
BL DbguUart_Irq ; OS_CPU_IRQ_ISR_Handler();
MSR CPSR_c, #(NO_INT | SVC32_MODE); Change to SVC mode
BL OSIntExitI ; OSIntExit();
; RESTORE NEW TASK CONTEXT
LDMFD SP!, {R4} ; Pop new task CPSR
MSR SPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}^ ; Pop new task context
это ISR
Код
void DbguUart_Irq(void) {
REG_t u32_t dw ;
REG_t u32_t csr ;
csr = SAM256_DBGU->SR;
if (csr & UART_SR_RXRDY) {
dw = SAM256_DBGU->RHR;
// putch0('r');
}
/////////////////////////////////////////////////
if (csr & UART_SR_TXEMPTY) {
// putch0('t');
if (SAM256_DBGU->IMR & UART_SR_TXEMPTY) {
SAM256_DBGU->THR = 't';
} else {
SAM256_DBGU->IDR = UART_SR_TXEMPTY;
}
}
/////////////////////////////////////////////////
SAM256_AIC->EOICR = 0;
}
установка
Код
SAM256_AIC->SMR[SYSC_PH_ID] = 0;
SAM256_AIC->SVR[SYSC_PH_ID] = (u32_t)&DbguUart_Irq_UCOS;
ну и вектора
Код
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ; Reserved vector
LDR PC, [PC,#-0xF20] ; IRQ_Addr
LDR PC, FIQ_Addr
т.е. с этим портом на LPC ни одной проблемы не было, в SAM7 на другиx источниках прерываний тоже
проблем нет, а если на прерывание 1, но стразу завис.