transf
Aug 15 2014, 10:35
Добрый день всем!
Народ, подскажите плиз: не понимаю как работать с прерываниями в MQX-LITE. Как известно - это облегченная система MQX. Мне совершенно не понятно, как настраивать это. Я пробовал с помощью операции _int_install_isr(), вызов не происходит. команда вида:
_int_install_isr(0x49, ADC0_MeasurementCompleteInterrupt, adc0);
где ADC0_MeasurementCompleteInterrupt - функция-событие завершения измерения ADC0, adc0 - указатель на дескриптор ADC0, где размещена и ссылка на данные. Вектор прерывания от ADC0 - 0x49. Правильно ли я его указал? Верно ли написана строка? Компилятор не ругается(пользуюсь средой CodeWarrior 10.4 с компилятором Freescale), программа запускается но прерывание не возникает. Нужно ли что еще вызывать для настройки? В документации по MQX-LITE толком ничего не написано, только самые общие фразы. Пользуюсь документацией по MQX (MQXUG), потому, что в доке по MQXLITE (MQXLITEUG) про механизм прерываний ничего не написано. Работаю с контроллером MK20DN512 через программатор Segger J-Link. Подскажите плиз!!!
AlexandrY
Aug 15 2014, 14:40
Цитата(transf @ Aug 15 2014, 13:35)
программа запускается но прерывание не возникает. Нужно ли что еще вызывать для настройки?
А по шагам проверить что делается в _int_install_isr?
Правильно ли определено поле INTERRUPT_TABLE_PTR в структуре kernel_data.
В Lite версии оно назначается на адрес статического массива mqx_static_isr_table. Этот массив выделен правильно?
transf
Aug 18 2014, 15:47
Ларчик открывался просто: ADC0_StartSingleMeasurement(adc0) - сбрасывает бит разрешения прерывания в ADC0_AC1A.
Но есть несколько вопросов, чтоб все до конца понять.
А по шагам проверить что делается в _int_install_isr?
По шагам все просмотрел - не нашел никакого криминала.
Правильно ли определено поле INTERRUPT_TABLE_PTR в структуре kernel_data.
Тут есть маленький вопрос, т.к. у меня недопонимание, так как я просто не знаю, что там должно быть. Как я понял - должен быть указатель на таблицу векторов. Так или нет? Подскажите.
Дальше идет проверка условия, чтоб вектор инициализируемого прерывания не выходил за рамки диапазона [FIRST_INTERRUPT_VECTOR_USED - LAST_INTERRUPT_VECTOR_USED]. Причем значения FIRST_USER_ISR_VECTOR и LAST_USER_ISR_VECTOR проверяются те, которые находятся в структуре kernel_data, и они похоже установлены правильно. Есть еще такая строка в _int_install_isr:
table_ptr = &kernel_data->INTERRUPT_TABLE_PTR[vector -
kernel_data->FIRST_USER_ISR_VECTOR];
что, как я понимаю, является передачей адреса вектора прерываний. Далее строки:
old_isr_ptr = table_ptr->APP_ISR;
table_ptr->APP_ISR = isr_ptr;
первая - сохранение в переменной old_isr_ptr указателя на текущий обработчик прерывания, а вторая - присваивание нового, передаваемого в виде параметра isr_ptr. Затем еще строка присвоения указателя на данные обработчика прерывания. Все именно так, или что-то иначе?
В Lite версии оно назначается на адрес статического массива mqx_static_isr_table. Этот массив выделен правильно?
Здесь у меня тоже вопрос по поводу этого (последнего) высказывания: в функции _int_init( _mqx_uint, _mqx_uint) присвоение адреса массива mqx_static_isr_table идет переменной указателю int_table_ptr. Только потом этот адрес попадает в kernel_data, и по всем векторам присваивается указатель на обработчик _int_default_isr. Памяти выделяется под него достаточно и в этой же функции. Но ведь это функции не пользовательские? Они внутри операционки? как же здесь могут возникать проблемы? В общем я разобрался, но хочется "уберечь" себя от проблем в будущем. Где еще есть обращение и переприсваивание указателей на эти массивы кроме _int init?
За совет спасибо!! Прошел везде - везде порядок, и проблема оказалась простецкая.
AlexandrY
Aug 19 2014, 08:56
Цитата(transf @ Aug 18 2014, 18:47)
Тут есть маленький вопрос...
INTERRUPT_TABLE_PTR это не таблица векторов. Это массив управляющих структур, которые в том числе содержат и вектора.
А ориентируюсь по полной версии MQX.
У меня переменная mqx_static_isr_table фигурирует только один раз в одной строке в файле int.c
Я допускаю, что она может объявляться где-то в скриптах линкера для Lite версии. И тогда легко упустить из виду ее реальный адрес. Скажем, переменная может указывать на Flash