Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MQX-LITE, работа с прерываниями.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
transf
Добрый день всем!

Народ, подскажите плиз: не понимаю как работать с прерываниями в 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
Цитата(transf @ Aug 15 2014, 13:35) *
программа запускается но прерывание не возникает. Нужно ли что еще вызывать для настройки?


А по шагам проверить что делается в _int_install_isr?
Правильно ли определено поле INTERRUPT_TABLE_PTR в структуре kernel_data.
В Lite версии оно назначается на адрес статического массива mqx_static_isr_table. Этот массив выделен правильно?
transf
Ларчик открывался просто: 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
Цитата(transf @ Aug 18 2014, 18:47) *
Тут есть маленький вопрос...


INTERRUPT_TABLE_PTR это не таблица векторов. Это массив управляющих структур, которые в том числе содержат и вектора.

А ориентируюсь по полной версии MQX.
У меня переменная mqx_static_isr_table фигурирует только один раз в одной строке в файле int.c
Я допускаю, что она может объявляться где-то в скриптах линкера для Lite версии. И тогда легко упустить из виду ее реальный адрес. Скажем, переменная может указывать на Flash

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.