Перейти к содержанию
    

MQX-LITE, работа с прерываниями.

Добрый день всем!

 

Народ, подскажите плиз: не понимаю как работать с прерываниями в 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. Подскажите плиз!!!

 

 

Изменено пользователем transf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

программа запускается но прерывание не возникает. Нужно ли что еще вызывать для настройки?

 

А по шагам проверить что делается в _int_install_isr?

Правильно ли определено поле INTERRUPT_TABLE_PTR в структуре kernel_data.

В Lite версии оно назначается на адрес статического массива mqx_static_isr_table. Этот массив выделен правильно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ларчик открывался просто: 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?

 

За совет спасибо!! Прошел везде - везде порядок, и проблема оказалась простецкая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут есть маленький вопрос...

 

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

 

А ориентируюсь по полной версии MQX.

У меня переменная mqx_static_isr_table фигурирует только один раз в одной строке в файле int.c

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...