QUOTE (KOLOBOK123124356 @ Nov 1 2011, 11:50)

Здравствуйте, спасибо за ответы. Я понимаю что CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr); привязывает обработчик прерывания, но не совсем понятен механизм привязки. У меня сейчас при появлении прерывания проц переходит на адрес 0x00000010 где содержится команда перехода на стандартный обработчик прерывания, который как я уже писал представляет собой простую затычку. Вопрос в том к какому прерыванию привязывает эта функция CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);??? Потому как cyg_hal_plf_serial_isr корректный обработчик прерывания, так как он выполняет HAL_INTERRUPT_ACKNOWLEDGE и по коду должен сбрасывать флаги прерывания и корректно его обрабатывать но нет привязки его к прерыванию от UART.
Насколько я понял в eCos существует 2 так называемых канала связи - консоль и отладочный канал через который как я понял работают стандартные diag_printf для вывода сообщений при выполнении тестов. Вот как раз отладочный канал работает без нареканий, то есть diag_printf выводит)) а вот если проводить запись с помощью API функций типа cyg_io_write то - все глухо, причем API функция cyg_io_lookup находит устройства /dev/ser0, /dev/tty но при записи в в эти устройства ничего не выводится.И еще такой вопрос - физически устройства для консольного и отладочного каналов должны быть разными?? потому как на плате только 1 UART порт, не совсем ясно потому как если они должны работать с разными физическими устройствами то rx tx надо распиновать отдельно и ставить еще один UART компонент, заранее спасибо за любую помощь в понимании вопроса
Привет!
Для моего процессора MIPS RM 7000 на все прерывания процессор прыгает по одному и тому же адресу, по которому находится ф-я:
main_exception_vsr()
http://ecos.sourceware.org/cgi-bin/cvsweb....mp;cvsroot=ecosОн вызывает ф-ю __ hal_intc_decode(), hal_intc_translate() которая анализирует регистры применяемого в Вашем случае контроллера прерываний.
" .macro hal_intc_decode vnum "
http://ecos.sourceware.org/cgi-bin/cvsweb....mp;cvsroot=ecosНаходит соответсввия адресов обработчиков и номеров прерываний.
И вычисляет адрес обработчика прерывания.
Передает ему управление.
Для регистрации обработчиков в таблице векторов прерываний используется макрос:
#define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ )
#define HAL_INTERRUPT_DETACH( _vector_, _isr_ )
#define HAL_VSR_GET( _vector_, _pvsr_ )
#define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ )
#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ )
......
и прочие аналогичные:
http://ecos.sourceware.org/cgi-bin/cvsweb....mp;cvsroot=ecosПо поводу cyg_io_write() я бы решал проблему, с помощью изучения исходных текстов и их редактирования (вставки выдачи отладочной информации, чтобы определить - какие ф- ии вызываются)
Мы, в основном, пользуемся только начальным загрузчиком Redboot.
В данном загрузчике есть команда "channel N" - переключение консоли.
Консолью, в нашем случае, может быть: VGA+keyb, RS-232, Telnet на 9000 порт.
При подаче команды: переключить консоль("channel 2<cr>"), diag_printf() начинает выдавать отладочную информацию только на эту консоль.
Смена консоли выполняется макросом
CYGACC_CALL_IF_SET_CONSOLE_COMM(chan);
CYGACC_CALL_IF_SET_DEBUG_COMM(chan);
См макросы поиском по исходным текстам eCos:
CYGACC_CALL_IF_CONSOLE_PROCS();
CYGACC_COMM_IF_PUTC(*__chan, c);
__chan = CYGACC_CALL_IF_DEBUG_PROCS();
CYGACC_COMM_IF_PUTC(*__chan, c);
hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_CONSOLE_PROCS();
CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT
и прочие...
Пример использования макроса:
http://ecos.sourceware.org/cgi-bin/cvsweb....mp;cvsroot=ecosВ нашей начальной конфигурации Redboot, и в процессе работы: отладочный канал и консоль всегда совпадают.