Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема с IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Zelepuk
кто знает что за ругалка в IAR?

MrYuran
Цитата(Zelepuk @ Aug 16 2011, 16:18) *
Error[e27]: Entry "x" in module *.c (путь\*.r43) redefined in module main.c (путь\main.r43)

Это значит, что массив объявлен в обоих файлах.
Объяснить просто. В одном месте объявление оставить, в другом - убрать.
Zelepuk
Спасибо. Полностью заменил первый пост (так как сам разобрался сразу же, но тут другой подвох)
Прошу помоч кто знает.
zltigo
QUOTE (Zelepuk @ Aug 16 2011, 14:18) *
кто знает что за ругалка в IAR?

А взять словарь и перевести? Совсем лениво?
Zelepuk
Ну пишет что места ехватает в кристалле для кода. Как обычно по размеру оптимизируется код? Дайте совет
zltigo
QUOTE (Zelepuk @ Aug 16 2011, 14:46) *
Ну пишет что места ехватает в кристалле для кода. Как обычно по размеру оптимизируется код? Дайте совет

Отлично! Там ведь и цифры есть. Так сколько там Вам не хватает sm.gif? Думаете столько соптимизировать удастся sm.gif? Да у Вас скорее всего в исходниках и проекте полная муть.
MrYuran
Цитата(Zelepuk @ Aug 16 2011, 16:46) *
Ну пишет что места ехватает в кристалле для кода. Как обычно по размеру оптимизируется код? Дайте совет

Тут похоже дело не в коде, а в каких-то массивных константах.
Таблицы, может быть. И нехило так не хватает. Оптимизация кода не поможет. В смысле, тупая установка галочки. Нужно оптимизировать алгоритм либо одно из двух.
Zelepuk
Судя по всему, не хватает около 9.5 байт.
У меня просто таблица Фурье-коэффицентов и окно блэкмена на 1024 отсчёта объявлено как константы.
zltigo
QUOTE (Zelepuk @ Aug 16 2011, 15:13) *
Судя по всему, не хватает около 9.5 байт.

9,5 байт sm.gif. Вообще-то это килобайты.

SSerge
Цитата(Zelepuk @ Aug 16 2011, 20:13) *
Судя по всему, не хватает около 9.5 байт.
У меня просто таблица Фурье-коэффицентов и окно блэкмена на 1024 отсчёта объявлено как константы.

Во-первых места не хватает не для кода, а для данных.
Сегмент DATA16_Z у IAR это сегмент для неинициализированных переменных, они при старте программы прописываются нулями.
Что ещё более удивительно. Это Вы так оригинально свои таблицы коэффициентов объявляете?
Zelepuk
Цитата(SSerge @ Aug 16 2011, 18:35) *
Во-первых места не хватает не для кода, а для данных.
Сегмент DATA16_Z у IAR это сегмент для неинициализированных переменных, они при старте программы прописываются нулями.
Что ещё более удивительно. Это Вы так оригинально свои таблицы коэффициентов объявляете?


на самом деле я делю FFT на 1024 точки (так уж сложилось из требований оконного взвешивания и точности).

У меня АЦП 6 каналов (MSP430F47197).
1) Для каждого АЦП я создаю кольцевой буфер, в котором хряню выборки умноженные на окно;
2) Как только каждый буфер накопился (выставляю флаг готовности данных) - копирую каждый буфер в буфер для фурье (а это отдельные масивы 1024 отсчёта всего 6 массивов);
3) Делаю фурье по два реальных массива за одно комплексное
4) Разделяю действительные и мнимые части двух последовательностей после фурье (это по два массива на один выходной массив FFT - 4 массива по 1024 отсчёта);
5) нахожу амплитудный спектр для каждого канала (2 массива новых)
6) нахожу THD для каждого канала

Итак, после того как количесвто промежуточных массивов было уменьшено в несколько (!!) раз я получил сообщение от линкера:
Error[e16]: Segment DATA16_Z (size: 0x146d align: 0x1) is too long for segment definition. At least 0x46d more bytes needed. The problem occurred...

Чтож уже лучше))

И теперь алгоритм выглядит так:
1) Для каждого АЦП я создаю кольцевой буфер, в котором хряню выборки умноженные на окно;
2) Как только каждый буфер накопился (выставляю флаг готовности данных) - копирую каждый буфер в буфер для фурье, но уже использую два буфера для фурье
3) делаю фурье по два массива (два реальных одним комплексным БПФ)
4) затем извлекаю реальные и мнимые части (это уже 2 массива)
5) нахожу амплитуду (это 1 массив)
6) нахожу THD одного канала;
Причём все вспомогательные массивы (массив фурье, массив реальной и мнимой частей, массив амплитуд) объявлены как extern и находятся в отдельном *.h файле. И естественно при старте инициализируются нулями.

Таким образом количесто циклов в программе увеличилось, но места программа стала занимать меньше. Как ещё можно "поджать" код?
SSerge
А ОЗУ у этого контроллера всего 4К, как раз на два массива int-ов по 1024 элемента в каждом хватит.
И всё, память кончилась, даже на счётчик цикла не остаётся. sm.gif

В этом семействе есть ещё модели с 8 килобайтами, может быть в них и можно будет упихать.
Или придумывать алгоритмы менее требовательные к памяти.

Zelepuk
позарез надо FFT сделать на MSP430F47197.
если не FFT то как расчитать THD на 11 гармоник для отсчётов с каждого АЦП.
Всегда "At least 0x46d more bytes needed." выводится. Меньше сделать не получается((
Zelepuk
Как думаете, если алгоритм Герцеля применить - это спасёт ситуацию?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.