Jump to content

    

AVR+FREERTOS и прерывания

FreeRTOS использует таймер1. Таймер 3 использую для своих нужд. Написал обработчик прерываний

ISR(TIMER3_COMPA_vect)
{
   //code
}

Внутри прерывания поставил брейкпоинты. Гружу дебаг.... выскакивает "ахтунг" с сообщением что брейкпоинта не будет. Ну и в прерывание не попадаю ни когда. посмотрел вектора прерываний - напротив TIMER3_COMPA_vect (0х38) пусто. поискал по ассемблеру мой обработчек - нету, в *.map тоже нету. Как будь-то компилятор его выпилил. Без фрииртос этот код работает нормально, а с фряхой обработчики исчезают. Куда девается обработчик прерывания? Может ос перекрыть макрос ISR(TIMER3_COMPA_vect) каким то своим?

 

ps на таймерах 0 и 2 тоже самое: обработчики в рабочем коде выпилены (((

Share this post


Link to post
Share on other sites
FreeRTOS использует таймер1. Таймер 3 использую для своих нужд. Написал обработчик прерываний

ISR(TIMER3_COMPA_vect)
{
   //code
}

Внутри прерывания поставил брейкпоинты. Гружу дебаг.... выскакивает "ахтунг" с сообщением что брейкпоинта не будет. Ну и в прерывание не попадаю ни когда. посмотрел вектора прерываний - напротив TIMER3_COMPA_vect (0х38) пусто. поискал по ассемблеру мой обработчек - нету, в *.map тоже нету. Как будь-то компилятор его выпилил. Без фрииртос этот код работает нормально, а с фряхой обработчики исчезают. Куда девается обработчик прерывания? Может ос перекрыть макрос ISR(TIMER3_COMPA_vect) каким то своим?

 

ps на таймерах 0 и 2 тоже самое: обработчики в рабочем коде выпилены (((

Очень странно. У меня не "выпиливает". Какой компилятор? Какой отладчик? Какая мега?

На сколько я разобрался, тоже только осваиваю фриртос, то она ни каким боком к аппаратным прерываниям не примазывается.

только что вставил в свой исходник:

ISR(TIMER1_COMPA_vect)
{
  ;//code
}

в мапе появилась строка: 0x0000013a __vector_13

Edited by Volldemar

Share this post


Link to post
Share on other sites

AT90CAN128, AVR Studio 4, компилятор gcc (winavr)

 

У меня был проект тяжёлый, без оси. нужно добавить функционал... без оси - чем дальше тем хуже. Переписывать весь проект на ос - нереально долго/дорого, да и отладку по стыковке с др устройствами нет возможности сделать.

 

поставил голую ось, сделал одну задачу и в эту задачу сунул из старого проекта main. РАБОТАЕТ!!! Тока косяк с аппаратными прерываниями. в векторах прерывания остались вектора ресета, системного таймера и INT0. А вектора остальных таймеров, вектора обоих уартов - выпилены. (((

 

Очень странно. У меня не "выпиливает".
блинннн..... пойду к гадалке.

 

там есть ещё всякие заусенцы, от которых надо будет избавляца, например в обработчиках прерывания вызывались функции паузы.... pauseMs(int ms); Эта функция блокировала процессор с одним потоком на ms миллисекунд. Во фриртос паузы заменил на vTaskDelay(). Возможно получилось так, что в коде, в обработчиках аппаратных прерываний есть вызовы vTaskDelay(). Может на этапе компиляции обработчики с вызовами vTaskDelay() выпиливаются? вечером поисследую..

Share this post


Link to post
Share on other sites

Добавил себе в проект

ISR(TIMER1_COMPA_vect)
{

    vTaskDelay(10/portTICK_RATE_MS);
}

есть и в мапе и в lss.

Использую эклипс+винавр

Share this post


Link to post
Share on other sites

решил проблему...... в мейкфайле не был включён объектник с обработчиками прерываний. :laughing:

Share this post


Link to post
Share on other sites

мда, бывает ;)

глянь в приват сообщения...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this