Добрый день. Столкнулся с такой непонятной мне бедой.
Контроллер ATmega32a работает от внутренних 8 MHz. Среда IAR Embedded Workbench for Atmel AVR 6.12. Отладчик китайский ноунейм JTAG адаптер.
Есть прерывание по таймеру2 с частотой 20kHz, которое считывает значение АЦП и ничего внутри не считает, выполняется за микросекунды, большая часть времени основная программа свободна.
Еще одно прерывание по таймеру0 на частоте 30Hz(!) отвечает за моргания светодиодами, тоже ничего не считает, выполняется быстро, все контролировал не осциллографе.
В основной программе есть моменты, которые весьма затратны по времени. Быстрое преобразование Фурье, арккосинус с арктангенсом и корнем квадратным, на подобие этого:
if (FFTfull){
cli();
fft_input(capture, bfly_buff);
fft_execute(bfly_buff);
fft_output(bfly_buff, spektrum);
FFTfull=0;
sei();
}
cli();
SKV=0*X+0*Y+1*Z; //скалярное произведение векторов
DLV=sqrt(Y*Y+X*X+Z*Z); //длина вектора
COSV=SKV/DLV; //косинус угла
Alpha=acos(COSV)*pi180; //угол
sei();
Так вот если я не огораживаю расчеты запретом на прерывания cli(), то контроллер ведет себя неадекватно, перескакивает на непонятные адреса памяти и в итоге уходит на перезагруз. Это нормальная ситуация или все же где-то косяк? Я так понимаю он не может нормально вернуться из прерывания к расчетам.
UPD: Написал небольшую заметку для тех, кого гугол приведет сюда. Решение проблемы с CStack и RStack в среде IAR для AVR
driveelectronics.ru/soft/prevyshenie-razmerov-csta...