Kiryanov 0 15 августа, 2014 Опубликовано 15 августа, 2014 (изменено) · Жалоба Добрый день всем! Народ, подскажите плиз: не понимаю как работать с прерываниями в 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. Подскажите плиз!!! Изменено 15 августа, 2014 пользователем transf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 15 августа, 2014 Опубликовано 15 августа, 2014 · Жалоба программа запускается но прерывание не возникает. Нужно ли что еще вызывать для настройки? А по шагам проверить что делается в _int_install_isr? Правильно ли определено поле INTERRUPT_TABLE_PTR в структуре kernel_data. В Lite версии оно назначается на адрес статического массива mqx_static_isr_table. Этот массив выделен правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kiryanov 0 18 августа, 2014 Опубликовано 18 августа, 2014 · Жалоба Ларчик открывался просто: 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 3 19 августа, 2014 Опубликовано 19 августа, 2014 · Жалоба Тут есть маленький вопрос... INTERRUPT_TABLE_PTR это не таблица векторов. Это массив управляющих структур, которые в том числе содержат и вектора. А ориентируюсь по полной версии MQX. У меня переменная mqx_static_isr_table фигурирует только один раз в одной строке в файле int.c Я допускаю, что она может объявляться где-то в скриптах линкера для Lite версии. И тогда легко упустить из виду ее реальный адрес. Скажем, переменная может указывать на Flash Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться