реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> непонятные ошибки вычислений, помогите советом
Zelepuk
сообщение Sep 24 2011, 13:00
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Суть проблемы:
Есть необходимость вычисления FFT на микроконтроллере.
Есть вполне рабочая реализация (проверено в CBuilder).

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

Грешил на оптимизацию - оба проекта (тестовый и рабочий) имеют одинаковые настройки. Никак не пойму в чём дело.
Возможно у кого-то были такие проблемы. Прошу поделиться соображениями.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 24 2011, 15:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



А банально - стек какой-нить?
Типа в рабочем коде прерывания (или функции вывода) затирают данные расчетов.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Sep 25 2011, 05:58
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



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


А как данные могут затираться, если нигде в прерываниях и в функциях вывода переменные учатвующие расчётах не фигурируют?
Go to the top of the page
 
+Quote Post
paskal
сообщение Sep 25 2011, 07:31
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



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

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

ps
А в принципе данные могут затираться при выходе за границу массива, или из за неправильного указателя.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 25 2011, 18:09
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Sep 25 2011, 20:00
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



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


Простите за невежество, но как разместить переменную в памяти после массива? (интересует синтаксис)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 25 2011, 22:13
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 элемент длиней, чем надо.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Sep 26 2011, 06:19
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

Это не поможет, массив и TestVar окажутся в разных сегментах.
Если убрать инициализацию (=055;) тогда другое дело.
Два других способа тоже годятся.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016