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

bf533 sdram инициализация массива

Добрый день уважаемые!

(Работаю в VisualDSP 5.1.2)

Подскажите что я делаю не так:

1.Сделал initcode.dxe для инициализации SDRAM - загружаю его в проекте.

Сдрам работает ,если там разместить массивы всё пишется и читается .

 

2. Я добавил заранее заполненный массив :

#pragma section ("my_data_section",RUNTIME_INIT) 
unsigned short buf_sdram3[64]={0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xab
cd,0xabcd,0xabcd,
0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xa
bcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,
0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xa
bcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,
0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd};

 

в .ldf файле прописал :

  my_data_section RUNTIME_INIT
        {
        INPUT_SECTION_ALIGN(4)
        INPUT_SECTIONS( $OBJECTS(my_data_section) )
        }>MEM_SDRAM0_BANK0

 

компилю программу, вывожу массив на экран - там одни нули.

Вроде как не проинициализировался, почему?

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


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

А как проверяете массив? В окне просмотра переменных или по адресу? В настройках есть галочка "уничтожать неиспользуемые переменные". если он у вас нигде кроме объявления не находится в тексте, то компилятор просто мог стереть этот блок.

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


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

компилю программу, вывожу массив на экран - там одни нули.

Вроде как не проинициализировался, почему?

А где у Вас инитится SDRAM? Как я понимаю - firmware у Вас грузится bootROM-ом откуда-то (флешь?) частично в SDRAM, потом стартует. После старта firmware внутри него делаете инит SDRAM?

Или может меняете какую-то частоту, от которой тактируется SDRAM? Не выходит ли она за допустимые пределы? Или может за допустимые пределы на новой частоте выходят предустановленные тайминги в регистрах контроллера SDRAM?

Если так - то перед этим надо SDRAM перевести например в режим Self Refresh и только в таком состоянии можно поменять тактовую SDRAM.

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


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

А как проверяете массив? В окне просмотра переменных или по адресу? В настройках есть галочка "уничтожать неиспользуемые переменные". если он у вас нигде кроме объявления не находится в тексте, то компилятор просто мог стереть этот блок.

 

..в прошивке есть функция которая по команде выводит массив в терминал, вот и выводит одни нули.

Хотя если записать (по команде) в какуюнить часть массива какое-нить число - то оно там сохраняется и выводится.

Проверяю и через указатель на память и буквально по индексу массива.

 

 

А где у Вас инитится SDRAM? Как я понимаю - firmware у Вас грузится bootROM-ом откуда-то (флешь?) частично в SDRAM, потом стартует. После старта firmware внутри него делаете инит SDRAM?

Или может меняете какую-то частоту, от которой тактируется SDRAM? Не выходит ли она за допустимые пределы? Или может за допустимые пределы на новой частоте выходят предустановленные тайминги в регистрах контроллера SDRAM?

Если так - то перед этим надо SDRAM перевести например в режим Self Refresh и только в таком состоянии можно поменять тактовую SDRAM.

 

..у меня грузится initcode , потом грузится основная прошивка - массив инициализирован в ней.

Частота PLL и sdram устанавливается в initcode и больше не меняется.

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


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

Нули - это подозрительно. Если SDRAM контроллер не настроен, то в SDRAM лежит "мусор".

 

Посмотрите содержимое образа - там должна быть секция, которая инициализирует массив по этому адресу. В вашем случае это должна быть секция с данными, а поведение такое, как будто секция ZEROFILL. Посмотреть содержимое образа можно утилитой LdrLoader.exe, подсунув ей .ldr файл (на самом деле он hex), утилита легко находится на просторах интернета.

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


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

..спасибо, посмотрю в будни.

Я заметил что если я какой проинициализированый массив или функцию переносил в sdram , то прошивка почему-то уменьшалась.

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


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

Нули - это подозрительно. Если SDRAM контроллер не настроен, то в SDRAM лежит "мусор".

Содержимое SDRAM никак не зависит от настроенности контроллера SDRAM.

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


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

Содержимое SDRAM никак не зависит от настроенности контроллера SDRAM.

Правда? Вы это на практике с сабжевым процессором проходили или умозрительно изрекаете?

 

Объясните, как инициализация SDRAM (а это напрямую влияет на её содержимое), висящей на шине ADSP-BF533, может быть осуществлена без контролера SDRAM?

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


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

..в прошивке есть функция которая по команде выводит массив в терминал, вот и выводит одни нули.

Хотя если записать (по команде) в какуюнить часть массива какое-нить число - то оно там сохраняется и выводится.

А если туда записать не одно число, а массив в несколько КБ? Он полностью сохраняется?

Проверять одну ячейку не корректно - может у Вас там в МК кеш включен :rolleyes: и прочитаете обратно из него, не проверив никак саму SDRAM.

Судя по описанию - какие-то проблемы с компиляцией/компоновкой. Проверьте по map-файлу - по какому адресу размещается данный массив? Есть ли записи о его инициализации?

Попробуйте перенести его во внутреннее ОЗУ и сравнить что меняется в map.

 

PS: Неужто за полгода так и не решили проблему??? :05:

 

Правда? Вы это на практике с сабжевым процессором проходили или умозрительно изрекаете?

Объясните, как инициализация SDRAM (а это напрямую влияет на её содержимое), висящей на шине ADSP-BF533, может быть осуществлена без контролера SDRAM?

Вы думаете, что алгоритм работы SDRAM как-то зависит от МК, к которому она подключена? :laughing:

Причём тут процесс инициализации контроллера? Вы внимательно прочитали что сами написали и мой ответ??

Контроллер может быть настроен, туда занесены данные, потом он может быть перестать быть настроен (процессор может быть сброшен или в sleep уйти например), но данные в SDRAM при этом никак не изменятся.

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


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

Вы думаете, что алгоритм работы SDRAM как-то зависит от МК, к которому она подключена? :laughing:

Причём тут процесс инициализации контроллера? Вы внимательно прочитали что сами написали и мой ответ??

Пардоньте, но это вы невнимательно читаете. У меня было:

 

Объясните, как инициализация SDRAM

 

SDRAM может быть проиницилизирована только с помощью контроллера SDRAM и никак иначе. Поэтому он и был упомянут.

 

 

Контроллер может быть настроен, туда занесены данные, потом он может быть перестать быть настроен (процессор может быть сброшен или в sleep уйти например), но данные в SDRAM при этом никак не изменятся.

Во-первых, ADSP-BF533 - не МК, и у него процесс загрузки и инициализации весьма отличается от флешовых МК. Во-вторых, то, что вы написали в отцитированном: настроен, перестать быть настроен, опять стать быть настроен... - это ваши фантазии. Автор темы явно написал, что у него проблема при загрузке, т.е. после включения питания - данные массива не инициализируются правильно.

 

Причин тут две:

  • правильно ли настроен контроллер SDRAM - за это отвечает код в .init секции загрузочного образа - именно это я имел в виду;
  • имеется ли секция данных с инициализаторами этого массива в этом же образе.

 

У меня складывается впечатление, что с ADSP-BF вы дел не имели и пытаетесь экстраполировать свои знания из области МК серии Cortex-M на эту область.

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


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

Пардоньте, но это вы невнимательно читаете. У меня было:

Вы читать умеете? А понимать смысл прочитанного?

У Вас было то, что написано в сообщении #5. На него я ответил сообщением #7. Причём тут ваше сообщение #8???

Мой ответ из сообщения #7 касается только Вашего #5, он никак не может быть ответом на #8, так как оно было позже.

Вы понимаете, что причина должна быть ранее следствия, и не может быть после?

Вначале - причина, потом - следствие? Улавливаете?

Улавливаете почему моё сообщение #7 не может быть ответом на Ваше #8?

 

SDRAM может быть проиницилизирована только с помощью контроллера SDRAM и никак иначе.

Да ладно? :laughing:

Наверное те чудаки, которые подключали SDRAM например к AVR по GPIO, этого не знали.

 

Во-вторых, то, что вы написали в отцитированном: настроен, перестать быть настроен, опять стать быть настроен... - это ваши фантазии. Автор темы явно написал, что у него проблема при загрузке,

А Вы сами-то читали, что написал автор темы?

А написал он, что у него сперва грузится одно ПО, которое инитит МК, PLL и SDRAM-контроллер, потом грузится другое ПО. Обычно при загрузке любого ПО, оно при старте настраивает периферию МК, в том числе PLL и контроллер SDRAM.

Вот как раз именно та ситуация, о которой я и пишу.

Очевидно Вы не имели опыта работы с SDRAM, а у меня в нескольких проектах именно так и делается: инитится PLL+SDRAM, затем они используются, потом они переинитятся на другие частоты, но при этом содержимое в SDRAM сохраняется.

Прочитайте выделенное несколько раз, пока не поймёте. Потому что между первой инициализацией и повторной переинициализацией контроллера SDRAM, данные у меня в SDRAM сохраняются, хотя контроллер её в это время не настроен. :laughing:

 

У меня складывается впечатление, что с ADSP-BF вы дел не имели и пытаетесь экстраполировать свои знания из области МК серии Cortex-M на эту область.

И ещё раз - при чём тут Cortex или не Cortex? Да, с ADSP я не работал. Алгоритм работы SDRAM как-то от этого меняется???

Могу Вас успокоить - с SDRAM я работал и на OMAP L-137 (ARM9+DSP), а не только на Cortex-M.

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


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

А если туда записать не одно число, а массив в несколько КБ? Он полностью сохраняется?

Проверять одну ячейку не корректно - может у Вас там в МК кеш включен :rolleyes: и прочитаете обратно из него, не проверив никак саму SDRAM.

Судя по описанию - какие-то проблемы с компиляцией/компоновкой. Проверьте по map-файлу - по какому адресу размещается данный массив? Есть ли записи о его инициализации?

Попробуйте перенести его во внутреннее ОЗУ и сравнить что меняется в map.

 

PS: Неужто за полгода так и не решили проблему??? :05:

 

..по map файлу массив попадает куда нужно и массив и переменную совал в сдрам .

Менял им значения при работе , тестил содержимое сдрам записью туда нескольких килобайт чисел и потом проверкой их.

Пока считаю что sdram настраивается корректно. Но почему-то инится нулями.

 

з.ы.

Я тогда начал разбираться и забросил, а сейчас время появилось. Обидно - все интерфейсы у блекфина попробовал и так или иначе запустил , а со SDRAMом какие-то проблемы .

И подозрение такое что просто где-то туплю.

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


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

..по map файлу массив попадает куда нужно и массив и переменную совал в сдрам .

Менял им значения при работе , тестил содержимое сдрам записью туда нескольких килобайт чисел и потом проверкой их.

Пока считаю что sdram настраивается корректно. Но почему-то инится нулями.

Настройка контроллера SDRAM у вас где производится? В init? В основном приложении? Или в обоих?

 

map файл - это хорошо, но важно, чтобы в ldr была секция, содержащая инициализаторы, с правильным заголовком. И секция init до неё.

 

а со SDRAMом какие-то проблемы .

И подозрение такое что просто где-то туплю.

Не отчаивайтесь, там всё просто и надёжно работает, за 10+ лет интенсивного использования BF533 + SDRAM (да там ещё на этой же шине FPGA с самописным контроллером) ни одной проблемы не помню. Вам надо просто посмотреть потроха ldr упомянутой выше утилитой, и сразу станет ясно, где проблема.

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


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

..по map файлу массив попадает куда нужно и массив и переменную совал в сдрам .

Менял им значения при работе , тестил содержимое сдрам записью туда нескольких килобайт чисел и потом проверкой их.

Пока считаю что sdram настраивается корректно. Но почему-то инится нулями.

Я спрашивал - если просто этой секции, в которую линкуется проблемный массив, назначить целевой регион вместо SDRAM внутреннюю ОЗУ, то его содержимое становится правильным или нет?

Смотрите

Инициализация си-переменных (и конструкторы статических объектов) выполняется си-стартап кодом. Инит контроллера SDRAM может выполнятся как в си-коде (после си-стартапа), так и до си-стартапа (в асм как правило, но можно и си-функцию написать).

Если есть какие-то инициализированные переменные (хоть нулями хоть другими константами или конструкторами), то нужен 2ой вариант. Ещё конечно возможен инит контроллера SDRAM скриптом эмулятора (полезно для отладки кода в SDRAM), но здесь не Ваш случай.

Вы пишете, что у Вас контроллер SDRAM инитит загрузчик, потом он грузит образ рабочей прошивки в ОЗУ и запускает его. А сама рабочая прошивка ничего не делает ни с PLL ни с контроллером SDRAM. Так?

Возможно она меняет какую-то периферию или перепрограммирует какую-то ногу контроллера?

И если секция, в которую линкуется массив, инициализируемая, для неё должна быть в образе прошивки секция-инициализатор с начальными данными, которую потом исполнит стартап-код. Она есть?

 

 

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


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

Настройка контроллера SDRAM у вас где производится? В init? В основном приложении? Или в обоих?

и настройка сдрам и pll настраиваются в init. В основном приложеннии ничего не трогаю из этого.

 

map файл - это хорошо, но важно, чтобы в ldr была секция, содержащая инициализаторы, с правильным заголовком. И секция init до неё.

 

в ldr или в ldf ?

 

Не отчаивайтесь, там всё просто и надёжно работает, за 10+ лет интенсивного использования BF533 + SDRAM (да там ещё на этой же шине FPGA с самописным контроллером) ни одной проблемы не помню. Вам надо просто посмотреть потроха ldr упомянутой выше утилитой, и сразу станет ясно, где проблема.

 

спасибо :)

 

Я спрашивал - если просто этой секции, в которую линкуется проблемный массив, назначить целевой регион вместо SDRAM внутреннюю ОЗУ, то его содержимое становится правильным или нет?

вот массив

#pragma section ("sdram0_bank1") 
unsigned short buf_sdram3[64]={0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xab
cd,0xabcd,0xabcd,
0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xa
bcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,
0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xa
bcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,
0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd,0xabcd};

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

Вы пишете, что у Вас контроллер SDRAM инитит загрузчик, потом он грузит образ рабочей прошивки в ОЗУ и запускает его. А сама рабочая прошивка ничего не делает ни с PLL ни с контроллером SDRAM. Так?

верно, рабочая прошивка не трогает ни плл ни сдрам .

int main(void)
{
int i=0;
u32 z1=0;

sysreg_write(reg_SYSCFG, 0x32);	 // Initialize System Configuration Register 
// Set_PLL(27,4); 		 // инициализация PLL  400 МГЦ ядро и 100 МГЦ 
// InitSDRAM(); //память инициализируем заранее!!!
Init_Flags();
Init_Timers();	 //инициализация таймера
//spi_cs(1); 
SPIInit (100, 0);	// инициализация SPI  - 6
UART_init (115200); // инициализация UArrrRT  UART_init (38400);UART_SPD_K615
//init_SPORT0 (50000000);	   //инициализация канала SPORT0
//init_SPORT1 (1562500);  //инициализация канала SPORT1
//SPORT0_enable();
CPUAccel();
 //Init_RTC();
Init_Interrupts();
time_sekund=0;  //обнуление счётчика времени

rx_wr_index0=0;
rx_rd_index0=0;
rx_counter0 =0;

for (i=0;i<40;i++) Transf("\r\n");

Transf("----------\r\n");	
Transf("ver:1.900A\r\n");
Transf("----------\r\n");
u_out ("date:",030417);
Transf("----------\r\n");	
//WDG_on;	
while(1)			// вечный цикл
  { 
	  AVARIYA_DISP ();   
   Ethernet_MU ();	  
//UDP_TIMEOUT_TST(TIMER_UDP_LS_DOWN);	   
  WORK_REGIM ();
  };
// return 0;
}

Возможно она меняет какую-то периферию или перепрограммирует какую-то ногу контроллера?

И если секция, в которую линкуется массив, инициализируемая, для неё должна быть в образе прошивки секция-инициализатор с начальными данными, которую потом исполнит стартап-код. Она есть?

я тогда не пойму почему если массив лежит не всдраме то в прошивке всё есть и инициализатор тоже по видимому , а если в сдраме то всё вдруг пропадает?

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


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

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

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

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

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

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

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

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

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

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