Перейти к содержанию
    

Как правильно разместить буфер в SDRAM

Размещаю массив как глобальную переменную:

section ("BT656_buffer") static unsigned char BT656_input_frame_buffer;

 

в LDF файле описываю куда массив положить:

/*******************************************

sdram0_video NO_INIT

{

INPUT_SECTION_ALIGN(4)

INPUT_SECTIONS($OBJECTS(BT656_buffer))

} > MEM_SDRAM0_BANK3

/*******************************************

 

Компилирую.

От раза к разу комилятор делит массив на 2 или более частей с одинаковым именем символа и разными адресами, но распологает эти части в одном банке - SDRAM0_BANK3 (смотрю в окне BlackFin Memory, Browse by Symbol) В итоге, получить верный указатель на начало массива не удаётся. Он возвращается как адрес второго или последующего куска. Где искать траблы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Размещаю массив как глобальную переменную:

section ("BT656_buffer") static unsigned char BT656_input_frame_buffer;

 

в LDF файле описываю куда массив положить:

/*******************************************

sdram0_video NO_INIT

{

INPUT_SECTION_ALIGN(4)

INPUT_SECTIONS($OBJECTS(BT656_buffer))

} > MEM_SDRAM0_BANK3

/*******************************************

 

Компилирую.

От раза к разу комилятор делит массив на 2 или более частей с одинаковым именем символа и разными адресами, но распологает эти части в одном банке - SDRAM0_BANK3 (смотрю в окне BlackFin Memory, Browse by Symbol) В итоге, получить верный указатель на начало массива не удаётся. Он возвращается как адрес второго или последующего куска. Где искать траблы?

 

Зачем он так делает я не разбирался. Но сделайте так и будет вам счастье

 

sdram0_video NO_INIT

{

INPUT_SECTION_ALIGN(4)

FORCE_CONTIGUITY

INPUT_SECTIONS($OBJECTS(BT656_buffer))

} > MEM_SDRAM0_BANK3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет счастья .... :(

Уверенности нет, что поможет, но попробуйте задать секцию с помощью прагмы:

 

#pragma section("sdram0", NO_INIT)

TFrame InfoFrame;

 

Никаких проблем не испытываю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#pragma не помогла к сожалению

 

Видимо нельзя использовать переменные как буфер.

Тогда другой вопрос.

Как зарезервировать область памяти с конкретного адреса и запретить компилятору его использовать под другие нужды?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#pragma не помогла к сожалению

 

Видимо нельзя использовать переменные как буфер.

Почему же нельзя? Странно как-то. Вполне успешно использую. И SDRAM, и флешку, и регистры управления внешней периферией (ПЛИС) отмаплены на физические адреса, все работает. Не понимаю, что у вас там не так. Вот у меня в ldf:

    MEM_SDRAM0     
    {        
        TYPE(RAM) WIDTH(8)
        START(0x00000000) END(0x07FFFFFF)
    }

...

        sdram NO_INIT
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS($OBJECTS(sdram0) $LIBRARIES(sdram0))
        } >MEM_SDRAM0

 

В исходнике - в прошлом посте показывал. Все прекрасно работает. VDSP4.5 с каким-то апдейтом, не помню.

 

 

Тогда другой вопрос.

Как зарезервировать область памяти с конкретного адреса и запретить компилятору его использовать под другие нужды?

Ну, создать в линкерном скрипте свой сегмент в этой памяти, вестимо. Компилятор туда ничего класть не будет, если ему прямо не сказать с помощью той же прагмы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня версия 5.0 upd2

И откровенно говоря, худшей среды ещё не видел ...

По совокупности глюков и непоняток - впереди планеты всей.

А уж USB эмулятор - мёртвого достанет... уже жалею что связался с Аналогом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня версия 5.0 upd2

И откровенно говоря, худшей среды ещё не видел ...

 

Не преувеличивайте. Не без дури конечно, но чтобы так...

 

В версии 4.5 таких проблем не было.

 

В версии 5 up 2 появилось дробление секций. Выдаёт Warning:

 

 

Предлагает вставить тот скрипт FORCE_CONTIGUITY в ldf.

Баг это или фича пока ещё не понятно

Трудно сказать когда это появилось. В первоначальной версии не работал оптимизатор.

Поэтому этой версией никто не пользовался. Исправлено только в 5_2 up 2

Попробуйте версию 5 up 1 :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну... например я уже пару раз переустановил VDSP, после того как он потерял эмулятор и подвис

а затем вообще перестал запускаться

не говоря уж о том, что в конфигурационных регистрах отладчика есть лишние биты от других кристаллов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну... например я уже пару раз переустановил VDSP, после того как он потерял эмулятор и подвис

а затем вообще перестал запускаться

не говоря уж о том, что в конфигурационных регистрах отладчика есть лишние биты от других кристаллов

 

USB-эмулятор встроеный? Проблемы USB-эмулятора это чаще проблемы Windous драйвера

У меня PCI-эмулятор и работает устойчиво

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внешний

Всё с нуля, куплено месяц назад ...

 

Может попробовать поставить заново версию 4_5 и поработать с нею

Старые версии VDSP++ у аналога в архиве

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё бы хорошо .... но!

Не открывается проект сделаный версией 5.0 в версии 4.5

Надо переделывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Размещаю массив как глобальную переменную:

section ("BT656_buffer") static unsigned char BT656_input_frame_buffer;

 

в LDF файле описываю куда массив положить:

/*******************************************

sdram0_video NO_INIT

{

INPUT_SECTION_ALIGN(4)

INPUT_SECTIONS($OBJECTS(BT656_buffer))

} > MEM_SDRAM0_BANK3

/*******************************************

 

Добрый день. Может быть поможет, я работаю с DSP TMS320evm5509a. Пишу в CCStudio v.3.3. Для размещения части кода в SDRAM я использовал #pragma CODE_SECTION(in_task, ".MySect"). Где in_task - имя подпрограммы, ".MySect" - секция в .cmd файле. Причем в .cmd файле вручную прописывал

SECTIONS

{

.csldata: > SARAM

.MySect: {} > SDRAM

}

 

А для размещения какой-то переменной в SDRAM необходимо использовать вместо CODE_SECTION

#pragma DATA_SECTION (symbol, "section name") [;].

Например, #pragma DATA_SECTION(bufferB, "my_sect")

char bufferB[512];

 

Только есть одно но! для работы SDRAM необходимо ее сконфигурировать, а точнее настроить регистры процессора для работы с памятью. В моем для связи с памятью служит EMIF шина. Там есть одно НО, если чем-то мой ответ поможет, пишите, расскажу про НО. А так, сам пробовал, все получается.

Не знаю, может немного не по теме, но какое название темы, такой и ответ. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело оказалось в неправильно разведённой плате.

Младший адрес был перепутан со старшим, и переменные "двоились".

После перепайки проблема решилась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...