Цитата(Velund @ Apr 13 2006, 00:39)

Я про другое... Про FIQ... Там вообще copy/paste с IRQ handler'а, похоже никто даже не вникал в отличия, а уж тем более не пытался запускать... ;-)
В принципе, в оси с generic портом должно все нормально работать.
Получается система с 2 уровнями приоритетов, IRQ - младший, FIQ - старший.
Из области векторов нужно перейти на точки входа IRQ и FIQ, что-то типа
Код
CODE32 ; Always ARM mode after reset
org 0x18
irq_handler: ldr pc, do_irq_addr
; Constant table entries (for ldr pc) will be placed at 0x20
org 0x38
do_irq_addr:
DC32 OS_CPU_IRQ_ISR
и также для FIQ.
Из портовых хэндлеров IRQ и FIQ вызываются OS_CPU_IRQ_ISR_Handler() и OS_CPU_FIQ_ISR_Handler(),
объявляемых юзером. Перехватчики прерываний в порте оси сделаны так, что можно вызывать сервисы ОС как из IRQ, так и из FIQ. Надо это или нет, вопрос конкртеной задачи. Если из FIQ вызывать сервисы ОС не требуется, то можно вообще не пользовать OS_CPU_FIQ_ISR а вызывать свой обработчик fiq прямо с вектора.
В этом случае целесообразно также переписать осевую функцию OS_CPU_SR_Save(),
переопределив макроопределение NO_INT как
Код
NO_INT EQU 0x80 ; Mask used to disable only IRQ interrupt
что у меня и сделано.
и еще, IRQ хэндлер нужно сделать так
Код
/*
********************************************************************************
*************************
* OS_CPU_IRQ_ISR_Handler
*
* Description: Обработчик прерывания ОС
*
* Arguments : none
*
* Returns : none
*
* Notes : VICDefVectAddr должен быть установлен в 0 при инициализации
*
********************************************************************************
*************************
*/
#ifdef __cplusplus
extern "C"
#endif
void OS_CPU_IRQ_ISR_Handler (void)
{
PFNCT pfnct;
pfnct = (PFNCT)VICVectAddr; /* Read the interrupt vector from the VIC */
while (pfnct != (PFNCT)0) /* Handle ALL interrupting devices */
{
(*pfnct)(); /* Call ISR for interrupting device */
VICVectAddr = 0; /* update priority hardware */
pfnct = (PFNCT)VICVectAddr; /* Read the interrupt vector from the VIC */
}
}
А FIQ хэндлер нужно обрабатывать так, как нужно в конкретном случае и в зависимсоти от того, какая периферия активирует FIQ. То, что приведено - фигня полная.
Пасу котов...