Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема вывода длинных PCM-аудио фрагментов на LPC 2366
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
lavrik
Здравствуйте форумчане! Прошу вашей помощи!

Столкнулся с проблемой при выводе звука на LPC 2366: в контроллере 32 кб оперативки, 256 флэш-памяти; звуковые фрагменты в hex-виде лежат в массиве. Если массив меньше 32 кб - все компилируется и играет, но если больше 32 кб - компилятор выдает ошибку переполнения, т.е. при работе с массивом программа помещает его полностью в оперативку. Но главная загвоздка в том, что даже если не использовать массив больше 32 кб, а просто объявить его, то компилятор все-равно ругается точно так же. Мне подсказали, что надо организовать буфер в оперативке. Однако все равно непонятно, как записать сэмпл звуковой, допустим в 64 кб, но чтобы компилятор принял его? Другими словами как ещё, кроме массива, можно записать эти самые 64 кб в код?

Работаю в KEIL, при компиляции выдает вот что:

compiling main.c...
linking...
.\1.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.data).
.\1.axf: Error: L6407E: Sections of aggregate size 0x10c54 bytes could not fit into .ANY selector(s).

mantech
Цитата(lavrik @ Jan 18 2015, 22:12) *
Если массив меньше 32 кб - все компилируется и играет, но если больше 32 кб - компилятор выдает ошибку переполнения, т.е. при работе с массивом программа помещает его полностью в оперативку. Но главная загвоздка в том, что даже если не использовать массив больше 32 кб, а просто объявить его, то компилятор все-равно ругается точно так же.


Во первых - глупо копировать в оперативку даные из флеша, особенно если это не программа,а звук или что другое. Во вторых, в оперативке еще должен храниться стек и глобальные переменные, если копируете массив в размер оперативки, то куда складывать их?? Должен ругаться линкер на это безобразие biggrin.gif
Если все равно будете биться об стенку, чтоб линкер не ругался, объявите массив, как "no init", но это все равно не правильно, ибо данные нужно читать их флеша напрямую, благо в армах линейное адр. пространство...

Цитата(lavrik @ Jan 18 2015, 22:12) *
Однако все равно непонятно, как записать сэмпл звуковой, допустим в 64 кб, но чтобы компилятор принял его? Другими словами как ещё, кроме массива, можно записать эти самые 64 кб в код?

Работаю в KEIL, при компиляции выдает вот что:


На счет кейла не знаю, в иаре есть такая штука pragma location=адрес флеша, куда пишете данные... В кейле должно быть что-то подобное.
lavrik
Просто не знаю какой конкретно инструментарий использовать, чтобы записать в память wacko.gif Только въезжаю в эту микроконтроллерную тему laugh.gif

Спасибо за прояснение ситуации!)
mantech
Цитата(lavrik @ Jan 18 2015, 23:38) *
Просто не знаю какой конкретно инструментарий использовать, чтобы записать в память


рекомендую начать с ознакомления с линкером. Любая прога помещается в определенную область памяти, которую определяют настройки линкера, прога и все, что не модифицируется - read only идет во флеш, переменные, массивы, стек и пр - в read write, т.е. в RАМ. По умолчанию, все массивы, которые создаете пишутся в read write, соотв все, что больше размера оперативки вызывает ошибку, нужно определить соотв. секцию, задать массив в ней и указать линкеру, чтоб поместил ее в read only. После этого, когда прога запустится, читать данные, начиная с указанного адреса. Все просто, но разобраться в этом нужно...
Golikov A.
сделайте С файл
создайте в нем массив
добавьте в кеил
тыкните на файл правой кнопкой мыши в кейле-прожект-визарде, и там есть пунктик options, а в нем Memory Asigned там можно выбрать куда его класть, запихайте его в ром. Объявления массива как const тоже должно помочь.

можно и ручками, но через визард удобнее... А вы далеко от правильного пути, вам файлик линкера с текстом непохожим ни на что человеческое курочить надо...
mantech
Цитата(Golikov A. @ Jan 19 2015, 01:18) *
сделайте С файл
кнопкой мыши в кейле-прожект-визарде


Если там есть такое дело - можно попробовать, у меня в иаре визард какой-то убогий код делал - ничего не работало, плюнул, решил ручками... Дольше, конечно, но понял, как все устроено biggrin.gif



Цитата(Golikov A. @ Jan 19 2015, 01:18) *
А вы далеко от правильного пути, вам файлик линкера с текстом непохожим ни на что человеческое курочить надо...


Там, в кейле, действительно все так запущено??

Цитата(Golikov A. @ Jan 19 2015, 01:18) *
Объявления массива как const тоже должно помочь.


Это дельная мысль, че-то я ее упустил biggrin.gif Попробуйте объявить массив, скажем 64к, в виде константного, если вменяемый компилятор, он может поместить его в ром автоматом...
Golikov A.
Цитата
Там, в кейле, действительно все так запущено??


я слабо помню как выглядит линкер скрипт от IAR, но помню что не особо отличается от кейловского.
Те же секции, скобочки, точки, в целом разобраться можно, но....
в кейле сделаны мего удобные визарды, вот есть у вас программка и острое желание какие-то функции запустить из RAM, тыкнул правой кнопкой в файлик, вызвал опции, и перепихал их в рам, передумал, все обратно оттыкал и свободен... а среда сама все сделает, разместить, проинициализирует, удобно... после этого руками линкер скрипт ковырять становиться не удобноsm.gif все в сравнении как говориться...
lavrik
Всем спасибо большое!

Поставил const, в свойствах Си-файла поставил в IROM1 и все заработало!

Нажмите для просмотра прикрепленного файла
esaulenka
Цитата(mantech @ Jan 19 2015, 10:31) *
Там, в кейле, действительно все так запущено??

"там в кейле" необходимо и достаточно объявить этот несчастный массив как const и ничего больше не трогать.

А "мегоудобные визарды" ничерта не работают, если хранить во флеше настройки, загрузчик и прочие нестандартные извращения.
Впрочем, по статьям на кейл.ком конфигурация линкера пишется легко и непринуждённо, главное - понимать, чего хочется :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.