QUOTE (KOLOBOK123124356 @ Oct 26 2011, 17:33)

Доброго всем времени суток! Настройка таймера прошла успешно, теперь запускается таймер, соответственно планировщик, появились наконец то системные тики, успешно запускаются тесты ядра, а именно tm_basic, вывод у них осуществляется через diag_printf(). Сейчас стоит задача запустить UART. С этим возникла проблема, а именно с обработчиком прерывания UART. При появлении прерывания от UART проц переходит на выполнение default_interrupt_isr, то есть затычки которая делает только return. Вообще судя по коду должен выполняться cyg_hal_plf_serial_isr, но этого не происходит. При запуске тестов из каталога io процессор просто крутит idle process. Помогите пожалуйста в чем может быть проблема?
На требуемый вектор прерывания должен завеситься обработчик isr:
Обработчик завешивается?
http://ecos.sourceware.org/cgi-bin/cvsweb....mp;cvsroot=ecosCODE
CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
static int
cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc,
CYG_ADDRWORD __vector, CYG_ADDRWORD __data)
{
int res = 0;
channel_data_t* chan = (channel_data_t*)__ch_data;
char c;
cyg_uint8 lsr;
CYGARC_HAL_SAVE_GP();
cyg_drv_interrupt_acknowledge(chan->isr_vector);
*__ctrlc = 0;
HAL_READ_UINT8(chan->base+CYG_DEV_LSR, lsr);
if ( (lsr & SIO_LSR_DR) != 0 ) {
HAL_READ_UINT8(chan->base+CYG_DEV_RBR, c);
if( cyg_hal_is_break( &c , 1 ) )
*__ctrlc = 1;
}
res = CYG_ISR_HANDLED;
CYGARC_HAL_RESTORE_GP();
return res;
}
QUOTE (KOLOBOK123124356 @ Oct 28 2011, 12:53)

Нужна помощь в запуске UART под eCos. На данный момент при появлении прерывания с UART проц переходит к обработчику прерывания по умолчанию - простой затычке, которая делает только return. Вообще должна вызываться функция обработки прерывания UART, которая описана в файле hal_diag.c
cyg_hal_plf_serial_isr(channel_data_t *chan, int *ctrlc,.
CYG_ADDRWORD vector, CYG_ADDRWORD data)
{
chan->ctrlc = ctrlc;
XUartNs550_InterruptHandler(&chan->dev);
HAL_INTERRUPT_ACKNOWLEDGE(chan->isr_vector);
return CYG_ISR_HANDLED;
}
При инициализации channel 0 обявляется этот обработчик
void
cyg_hal_plf_serial_init(void)
{
hal_virtual_comm_table_t* comm;
int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
// Disable interrupts.
HAL_INTERRUPT_MASK(channels[0].isr_vector);
// Init channels
init_serial_channel(&channels[0]);
// Setup procs in the vector table
// Set channel 0
CYGACC_CALL_IF_SET_CONSOLE_COMM(0);
comm = CYGACC_CALL_IF_CONSOLE_PROCS();
CYGACC_COMM_IF_CH_DATA_SET(*comm, &channels[0]);
CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);
CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);
CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);
CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);
CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);
CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout);
// Restore original console
CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
}
Но в итоге при появлении прерывания не проходит подтверждение прерывания (interrupt acknowledge), прерывание не сбрасывается и проц крутит постоянно обработку прерывания в виде return. Помогите разобраться в чем проблема?
Функция обработчика вызывается?
Снимается ли причина прерывания? Флаги наличия прерывания в UART?
Если снимается причина прерывания, я бы посмотрел макрос HAL_INTERRUPT_ACKNOWLEDGE(chan->isr_vector); Флаги прерывания в регистрах контроллера до его вызова и после.
Разбирался бы с логикой работы контроллера прерываний.
QUOTE (asket @ Oct 27 2011, 10:35)

Может кто посоветует, где взять порты под ecos на плату at91sam9263-ek?
Под мою плату также не было порта.
Я собирпл порт из кубиков (компонент из комплекта eCos) при помощи GUI утилиты настройки bp rjvgktrnf eCos : ./tools/bin/configtool
http://caxapa.ru/upload/files/58bbd5554bd7...83f4372e73d8f79Стр 248