Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: непонятные ошибки вычислений
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Zelepuk
Суть проблемы:
Есть необходимость вычисления FFT на микроконтроллере.
Есть вполне рабочая реализация (проверено в CBuilder).

Проверил работу реализации в тестовой программе (написаной под IAR для MSP430) - возвращаемые значения верные.
Попробовал добавить эту же реализацию в рабочий проект(так же под IAR для MSP430) - функция расчёта FFT возвращает полную чушь.

Грешил на оптимизацию - оба проекта (тестовый и рабочий) имеют одинаковые настройки. Никак не пойму в чём дело.
Возможно у кого-то были такие проблемы. Прошу поделиться соображениями.
Dog Pawlowa
А банально - стек какой-нить?
Типа в рабочем коде прерывания (или функции вывода) затирают данные расчетов.
Zelepuk
Цитата(Dog Pawlowa @ Sep 24 2011, 19:22) *
А банально - стек какой-нить?
Типа в рабочем коде прерывания (или функции вывода) затирают данные расчетов.


А как данные могут затираться, если нигде в прерываниях и в функциях вывода переменные учатвующие расчётах не фигурируют?
paskal
Цитата(Zelepuk @ Sep 25 2011, 09:58) *
А как данные могут затираться, если нигде в прерываниях и в функциях вывода переменные учатвующие расчётах не фигурируют?

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

ps
А в принципе данные могут затираться при выходе за границу массива, или из за неправильного указателя.
Сергей Борщ
QUOTE (Zelepuk @ Sep 25 2011, 08:58) *
А как данные могут затираться, если нигде в прерываниях и в функциях вывода переменные учатвующие расчётах не фигурируют?
Потелепатируем: Ваши данные хранятся в глобальной переменной (массиве). Массив большой. В функции расчета FFT вы заводите локальные массив или какие-то переменные. Они размещаются на стеке. Поскольку стек и область глобальных переменных растут навстречу друг другу - при нехватке памяти стек налезает на глобальные переменные и локальные данные оказываются поверх вашего массива входных данных. Со всеми вытекающими. Проверить оченть просто - разместите после массива глобальную переменную (обязательно volatile), при старте программы занесите в нее любое значение и в ходе выполнения программы проверяйте, что значение не изменилось. Если изменилось - проблема вероятнее всего в нехватке стека.
Zelepuk
Цитата(Сергей Борщ @ Sep 25 2011, 22:09) *
Потелепатируем: Ваши данные хранятся в глобальной переменной (массиве). Массив большой. В функции расчета FFT вы заводите локальные массив или какие-то переменные. Они размещаются на стеке. Поскольку стек и область глобальных переменных растут навстречу друг другу - при нехватке памяти стек налезает на глобальные переменные и локальные данные оказываются поверх вашего массива входных данных. Со всеми вытекающими. Проверить оченть просто - разместите после массива глобальную переменную (обязательно volatile), при старте программы занесите в нее любое значение и в ходе выполнения программы проверяйте, что значение не изменилось. Если изменилось - проблема вероятнее всего в нехватке стека.


Простите за невежество, но как разместить переменную в памяти после массива? (интересует синтаксис)
_Артём_
Цитата(Zelepuk @ Sep 25 2011, 23:00) *
Простите за невежество, но как разместить переменную в памяти после массива? (интересует синтаксис)


Например так
Код
unsigned char VashMassiv[DLINA_MASSIVA];// Ваш массив
volatile unsigned char TestVar=0x55;// занесённое число


или

Код
struct TestStruct {
    unsigned char VashMassiv[DLINA_MASSIVA];// Ваш массив
    volatile unsigned char TestVar;// занесённое число
};
struct TestStruct Test;

int main() {
    Test.TestVar=0x55;

}


или сделать массив на 1 элемент длиней, чем надо.
SSerge
Цитата(_Артём_ @ Sep 26 2011, 05:13) *
Например так
Код
unsigned char VashMassiv[DLINA_MASSIVA];// Ваш массив
volatile unsigned char TestVar=0x55;// занесённое число

Это не поможет, массив и TestVar окажутся в разных сегментах.
Если убрать инициализацию (=055;) тогда другое дело.
Два других способа тоже годятся.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.