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

 
 
 
Reply to this topicStart new topic
> Проблема вывода длинных PCM-аудио фрагментов на LPC 2366
lavrik
сообщение Jan 18 2015, 19:12
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635



Здравствуйте форумчане! Прошу вашей помощи!

Столкнулся с проблемой при выводе звука на 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).

Go to the top of the page
 
+Quote Post
mantech
сообщение Jan 18 2015, 19:59
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


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

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

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


На счет кейла не знаю, в иаре есть такая штука pragma location=адрес флеша, куда пишете данные... В кейле должно быть что-то подобное.
Go to the top of the page
 
+Quote Post
lavrik
сообщение Jan 18 2015, 20:38
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635



Просто не знаю какой конкретно инструментарий использовать, чтобы записать в память wacko.gif Только въезжаю в эту микроконтроллерную тему laugh.gif

Спасибо за прояснение ситуации!)
Go to the top of the page
 
+Quote Post
mantech
сообщение Jan 18 2015, 20:54
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


рекомендую начать с ознакомления с линкером. Любая прога помещается в определенную область памяти, которую определяют настройки линкера, прога и все, что не модифицируется - read only идет во флеш, переменные, массивы, стек и пр - в read write, т.е. в RАМ. По умолчанию, все массивы, которые создаете пишутся в read write, соотв все, что больше размера оперативки вызывает ошибку, нужно определить соотв. секцию, задать массив в ней и указать линкеру, чтоб поместил ее в read only. После этого, когда прога запустится, читать данные, начиная с указанного адреса. Все просто, но разобраться в этом нужно...
Go to the top of the page
 
+Quote Post
lavrik
сообщение Jan 18 2015, 21:12
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635



Я на верном пути?

Прикрепленное изображение

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 18 2015, 22:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



сделайте С файл
создайте в нем массив
добавьте в кеил
тыкните на файл правой кнопкой мыши в кейле-прожект-визарде, и там есть пунктик options, а в нем Memory Asigned там можно выбрать куда его класть, запихайте его в ром. Объявления массива как const тоже должно помочь.

можно и ручками, но через визард удобнее... А вы далеко от правильного пути, вам файлик линкера с текстом непохожим ни на что человеческое курочить надо...
Go to the top of the page
 
+Quote Post
mantech
сообщение Jan 19 2015, 07:31
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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к, в виде константного, если вменяемый компилятор, он может поместить его в ром автоматом...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 19 2015, 07:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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


я слабо помню как выглядит линкер скрипт от IAR, но помню что не особо отличается от кейловского.
Те же секции, скобочки, точки, в целом разобраться можно, но....
в кейле сделаны мего удобные визарды, вот есть у вас программка и острое желание какие-то функции запустить из RAM, тыкнул правой кнопкой в файлик, вызвал опции, и перепихал их в рам, передумал, все обратно оттыкал и свободен... а среда сама все сделает, разместить, проинициализирует, удобно... после этого руками линкер скрипт ковырять становиться не удобноsm.gif все в сравнении как говориться...
Go to the top of the page
 
+Quote Post
lavrik
сообщение Jan 19 2015, 08:33
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635



Всем спасибо большое!

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

Прикрепленное изображение

Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jan 19 2015, 15:24
Сообщение #10


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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

А "мегоудобные визарды" ничерта не работают, если хранить во флеше настройки, загрузчик и прочие нестандартные извращения.
Впрочем, по статьям на кейл.ком конфигурация линкера пишется легко и непринуждённо, главное - понимать, чего хочется :-)


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:46
Рейтинг@Mail.ru


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