Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: bf533 sdram инициализация массива
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Сигнальные процессоры и их программирование - DSP
Lmx2315
Добрый день уважаемые!
(Работаю в 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


компилю программу, вывожу массив на экран - там одни нули.
Вроде как не проинициализировался, почему?
kolobochishe
А как проверяете массив? В окне просмотра переменных или по адресу? В настройках есть галочка "уничтожать неиспользуемые переменные". если он у вас нигде кроме объявления не находится в тексте, то компилятор просто мог стереть этот блок.
jcxz
Цитата(Lmx2315 @ Aug 30 2016, 18:14) *
компилю программу, вывожу массив на экран - там одни нули.
Вроде как не проинициализировался, почему?

А где у Вас инитится SDRAM? Как я понимаю - firmware у Вас грузится bootROM-ом откуда-то (флешь?) частично в SDRAM, потом стартует. После старта firmware внутри него делаете инит SDRAM?
Или может меняете какую-то частоту, от которой тактируется SDRAM? Не выходит ли она за допустимые пределы? Или может за допустимые пределы на новой частоте выходят предустановленные тайминги в регистрах контроллера SDRAM?
Если так - то перед этим надо SDRAM перевести например в режим Self Refresh и только в таком состоянии можно поменять тактовую SDRAM.
Lmx2315
Цитата(kolobochishe @ Sep 5 2016, 20:17) *
А как проверяете массив? В окне просмотра переменных или по адресу? В настройках есть галочка "уничтожать неиспользуемые переменные". если он у вас нигде кроме объявления не находится в тексте, то компилятор просто мог стереть этот блок.


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


Цитата(jcxz @ Sep 6 2016, 08:59) *
А где у Вас инитится SDRAM? Как я понимаю - firmware у Вас грузится bootROM-ом откуда-то (флешь?) частично в SDRAM, потом стартует. После старта firmware внутри него делаете инит SDRAM?
Или может меняете какую-то частоту, от которой тактируется SDRAM? Не выходит ли она за допустимые пределы? Или может за допустимые пределы на новой частоте выходят предустановленные тайминги в регистрах контроллера SDRAM?
Если так - то перед этим надо SDRAM перевести например в режим Self Refresh и только в таком состоянии можно поменять тактовую SDRAM.


..у меня грузится initcode , потом грузится основная прошивка - массив инициализирован в ней.
Частота PLL и sdram устанавливается в initcode и больше не меняется.
dxp
Нули - это подозрительно. Если SDRAM контроллер не настроен, то в SDRAM лежит "мусор".

Посмотрите содержимое образа - там должна быть секция, которая инициализирует массив по этому адресу. В вашем случае это должна быть секция с данными, а поведение такое, как будто секция ZEROFILL. Посмотреть содержимое образа можно утилитой LdrLoader.exe, подсунув ей .ldr файл (на самом деле он hex), утилита легко находится на просторах интернета.
Lmx2315
..спасибо, посмотрю в будни.
Я заметил что если я какой проинициализированый массив или функцию переносил в sdram , то прошивка почему-то уменьшалась.
jcxz
Цитата(dxp @ Apr 8 2017, 03:42) *
Нули - это подозрительно. Если SDRAM контроллер не настроен, то в SDRAM лежит "мусор".

Содержимое SDRAM никак не зависит от настроенности контроллера SDRAM.
dxp
QUOTE (jcxz @ Apr 8 2017, 13:38) *
Содержимое SDRAM никак не зависит от настроенности контроллера SDRAM.

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

Объясните, как инициализация SDRAM (а это напрямую влияет на её содержимое), висящей на шине ADSP-BF533, может быть осуществлена без контролера SDRAM?
jcxz
Цитата(Lmx2315 @ Apr 7 2017, 13:49) *
..в прошивке есть функция которая по команде выводит массив в терминал, вот и выводит одни нули.
Хотя если записать (по команде) в какуюнить часть массива какое-нить число - то оно там сохраняется и выводится.

А если туда записать не одно число, а массив в несколько КБ? Он полностью сохраняется?
Проверять одну ячейку не корректно - может у Вас там в МК кеш включен rolleyes.gif и прочитаете обратно из него, не проверив никак саму SDRAM.
Судя по описанию - какие-то проблемы с компиляцией/компоновкой. Проверьте по map-файлу - по какому адресу размещается данный массив? Есть ли записи о его инициализации?
Попробуйте перенести его во внутреннее ОЗУ и сравнить что меняется в map.

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

Цитата(dxp @ Apr 8 2017, 08:42) *
Правда? Вы это на практике с сабжевым процессором проходили или умозрительно изрекаете?
Объясните, как инициализация SDRAM (а это напрямую влияет на её содержимое), висящей на шине ADSP-BF533, может быть осуществлена без контролера SDRAM?

Вы думаете, что алгоритм работы SDRAM как-то зависит от МК, к которому она подключена? laughing.gif
Причём тут процесс инициализации контроллера? Вы внимательно прочитали что сами написали и мой ответ??
Контроллер может быть настроен, туда занесены данные, потом он может быть перестать быть настроен (процессор может быть сброшен или в sleep уйти например), но данные в SDRAM при этом никак не изменятся.
dxp
QUOTE (jcxz @ Apr 8 2017, 13:50) *
Вы думаете, что алгоритм работы SDRAM как-то зависит от МК, к которому она подключена? laughing.gif
Причём тут процесс инициализации контроллера? Вы внимательно прочитали что сами написали и мой ответ??

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

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


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


QUOTE (jcxz @ Apr 8 2017, 13:50) *
Контроллер может быть настроен, туда занесены данные, потом он может быть перестать быть настроен (процессор может быть сброшен или в sleep уйти например), но данные в SDRAM при этом никак не изменятся.

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

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


У меня складывается впечатление, что с ADSP-BF вы дел не имели и пытаетесь экстраполировать свои знания из области МК серии Cortex-M на эту область.
jcxz
Цитата(dxp @ Apr 8 2017, 09:27) *
Пардоньте, но это вы невнимательно читаете. У меня было:

Вы читать умеете? А понимать смысл прочитанного?
У Вас было то, что написано в сообщении #5. На него я ответил сообщением #7. Причём тут ваше сообщение #8???
Мой ответ из сообщения #7 касается только Вашего #5, он никак не может быть ответом на #8, так как оно было позже.
Вы понимаете, что причина должна быть ранее следствия, и не может быть после?
Вначале - причина, потом - следствие? Улавливаете?
Улавливаете почему моё сообщение #7 не может быть ответом на Ваше #8?

Цитата(dxp @ Apr 8 2017, 09:27) *
SDRAM может быть проиницилизирована только с помощью контроллера SDRAM и никак иначе.

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

Цитата(dxp @ Apr 8 2017, 09:27) *
Во-вторых, то, что вы написали в отцитированном: настроен, перестать быть настроен, опять стать быть настроен... - это ваши фантазии. Автор темы явно написал, что у него проблема при загрузке,

А Вы сами-то читали, что написал автор темы?
А написал он, что у него сперва грузится одно ПО, которое инитит МК, PLL и SDRAM-контроллер, потом грузится другое ПО. Обычно при загрузке любого ПО, оно при старте настраивает периферию МК, в том числе PLL и контроллер SDRAM.
Вот как раз именно та ситуация, о которой я и пишу.
Очевидно Вы не имели опыта работы с SDRAM, а у меня в нескольких проектах именно так и делается: инитится PLL+SDRAM, затем они используются, потом они переинитятся на другие частоты, но при этом содержимое в SDRAM сохраняется.
Прочитайте выделенное несколько раз, пока не поймёте. Потому что между первой инициализацией и повторной переинициализацией контроллера SDRAM, данные у меня в SDRAM сохраняются, хотя контроллер её в это время не настроен. laughing.gif

Цитата(dxp @ Apr 8 2017, 09:27) *
У меня складывается впечатление, что с ADSP-BF вы дел не имели и пытаетесь экстраполировать свои знания из области МК серии Cortex-M на эту область.

И ещё раз - при чём тут Cortex или не Cortex? Да, с ADSP я не работал. Алгоритм работы SDRAM как-то от этого меняется???
Могу Вас успокоить - с SDRAM я работал и на OMAP L-137 (ARM9+DSP), а не только на Cortex-M.
Lmx2315
Цитата(jcxz @ Apr 8 2017, 09:50) *
А если туда записать не одно число, а массив в несколько КБ? Он полностью сохраняется?
Проверять одну ячейку не корректно - может у Вас там в МК кеш включен rolleyes.gif и прочитаете обратно из него, не проверив никак саму SDRAM.
Судя по описанию - какие-то проблемы с компиляцией/компоновкой. Проверьте по map-файлу - по какому адресу размещается данный массив? Есть ли записи о его инициализации?
Попробуйте перенести его во внутреннее ОЗУ и сравнить что меняется в map.

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


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

з.ы.
Я тогда начал разбираться и забросил, а сейчас время появилось. Обидно - все интерфейсы у блекфина попробовал и так или иначе запустил , а со SDRAMом какие-то проблемы .
И подозрение такое что просто где-то туплю.
dxp
QUOTE (Lmx2315 @ Apr 8 2017, 16:28) *
..по map файлу массив попадает куда нужно и массив и переменную совал в сдрам .
Менял им значения при работе , тестил содержимое сдрам записью туда нескольких килобайт чисел и потом проверкой их.
Пока считаю что sdram настраивается корректно. Но почему-то инится нулями.

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

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

QUOTE (Lmx2315 @ Apr 8 2017, 16:28) *
а со SDRAMом какие-то проблемы .
И подозрение такое что просто где-то туплю.

Не отчаивайтесь, там всё просто и надёжно работает, за 10+ лет интенсивного использования BF533 + SDRAM (да там ещё на этой же шине FPGA с самописным контроллером) ни одной проблемы не помню. Вам надо просто посмотреть потроха ldr упомянутой выше утилитой, и сразу станет ясно, где проблема.
jcxz
Цитата(Lmx2315 @ Apr 8 2017, 11:28) *
..по map файлу массив попадает куда нужно и массив и переменную совал в сдрам .
Менял им значения при работе , тестил содержимое сдрам записью туда нескольких килобайт чисел и потом проверкой их.
Пока считаю что sdram настраивается корректно. Но почему-то инится нулями.

Я спрашивал - если просто этой секции, в которую линкуется проблемный массив, назначить целевой регион вместо SDRAM внутреннюю ОЗУ, то его содержимое становится правильным или нет?
Смотрите
Инициализация си-переменных (и конструкторы статических объектов) выполняется си-стартап кодом. Инит контроллера SDRAM может выполнятся как в си-коде (после си-стартапа), так и до си-стартапа (в асм как правило, но можно и си-функцию написать).
Если есть какие-то инициализированные переменные (хоть нулями хоть другими константами или конструкторами), то нужен 2ой вариант. Ещё конечно возможен инит контроллера SDRAM скриптом эмулятора (полезно для отладки кода в SDRAM), но здесь не Ваш случай.
Вы пишете, что у Вас контроллер SDRAM инитит загрузчик, потом он грузит образ рабочей прошивки в ОЗУ и запускает его. А сама рабочая прошивка ничего не делает ни с PLL ни с контроллером SDRAM. Так?
Возможно она меняет какую-то периферию или перепрограммирует какую-то ногу контроллера?
И если секция, в которую линкуется массив, инициализируемая, для неё должна быть в образе прошивки секция-инициализатор с начальными данными, которую потом исполнит стартап-код. Она есть?

Lmx2315
Цитата(dxp @ Apr 8 2017, 12:53) *
Настройка контроллера SDRAM у вас где производится? В init? В основном приложении? Или в обоих?

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

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


в ldr или в ldf ?

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


спасибо sm.gif

Цитата(jcxz @ Apr 8 2017, 14:24) *
Я спрашивал - если просто этой секции, в которую линкуется проблемный массив, назначить целевой регион вместо 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. Так?

верно, рабочая прошивка не трогает ни плл ни сдрам .
CODE
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;
}

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

я тогда не пойму почему если массив лежит не всдраме то в прошивке всё есть и инициализатор тоже по видимому , а если в сдраме то всё вдруг пропадает?
dxp
QUOTE (Lmx2315 @ Apr 8 2017, 19:55) *
и настройка сдрам и pll настраиваются в init. В основном приложеннии ничего не трогаю из этого.

Это правильно. sm.gif

QUOTE (Lmx2315 @ Apr 8 2017, 19:55) *
в ldr или в ldf ?

Да, расширение файла ldf, но сам файл образа у них называется ldr. Вот, кстати, смотрелка для него.

Если правильно отработала утилита elfloader.exe (ей сообщили правильные опции), то в загрузочном образе будет секция с флагом INIT и он будет в первых рядах, а где-то за ней должна быть секция с данными, в заголовке которой должен быть адрес массива в SDRAM и его размер. Этим вьювером всё это вполне удобно проинспектировать - адреса, размеры и флаги он показывает читабельно.
Lmx2315
Цитата(dxp @ Apr 8 2017, 16:13) *
Это правильно. sm.gif
Да, расширение файла ldf, но сам файл образа у них называется ldr. Вот, кстати, смотрелка для него.

Если правильно отработала утилита elfloader.exe (ей сообщили правильные опции), то в загрузочном образе будет секция с флагом INIT и он будет в первых рядах, а где-то за ней должна быть секция с данными, в заголовке которой должен быть адрес массива в SDRAM и его размер. Этим вьювером всё это вполне удобно проинспектировать - адреса, размеры и флаги он показывает читабельно.


открыл этой программой одну из старых прошивок (там массив лежал в самом начале sdrama - с адреса 0x68)
И вижу две прошивки , init и рабочую : DXE0 и DXE1 , в DXE1 вижу свой массив с правильного адреса заполненный правильными данными.
Ничего тогда не понимаю.
Может прошивка так быстро грузится что пишет в сдрам данные, а сдрам ещё в "промежуточном состоянии" находится ? Может после init прошивки нужно какую-то паузу создать?
dxp
QUOTE (Lmx2315 @ Apr 8 2017, 20:26) *
Может прошивка так быстро грузится что пишет в сдрам данные, а сдрам ещё в "промежуточном состоянии" находится ? Может после init прошивки нужно какую-то паузу создать?

Это вряд ли - если контроллер настроен, то он сразу работает. Вы можете в init добавить свой код, чтобы поэкспериментировать, в т.ч. и паузу. И потом, у вас, вы сказали, там нули лежат. А это означает, что данные-то туда грузятся - если бы контроллер не работал, то там лежал бы "мусор". Такое впечатление, что там кто-то поверх нули записывает. Посмотрите, не ли случайно ещё одной секции с этим же адресом и флагом ZEROFILL?
Lmx2315
Цитата(dxp @ Apr 8 2017, 17:07) *
Такое впечатление, что там кто-то поверх нули записывает. Посмотрите, не ли случайно ещё одной секции с этим же адресом и флагом ZEROFILL?

..других данных на тот же адрес в файле нет.
jcxz
Цитата(Lmx2315 @ Apr 8 2017, 17:08) *
..других данных на тот же адрес в файле нет.

эмулятор есть? Поставьте watchpoint на первое слово вашего массива и увидите кто в него и что пишет.
Также можно записать перед стартапом какое-нить значение (при помощи эмулятора) в одну из ячеек массива и посмотреть после стартапа её содержимое.
Возможно у вас кто-то портит этот массив.
Отлаживать своё ПО можете только Вы сами, удалённо это не сделать.
Lmx2315
Цитата(jcxz @ Apr 8 2017, 21:26) *
эмулятор есть?.

..ооо! эмулятора нет, но в VDSP есть симулятор, может поможет?

Цитата(Lmx2315 @ Apr 8 2017, 21:42) *
..ооо! эмулятора нет, но в VDSP есть симулятор, может поможет?

..хотя симулятор без сдрамки наверное не поможет sad.gif . Ну на работе есть отладочная плата аналога под блекфин, там правда сдрам другой , посмотрю на ней.
Lmx2315
Создал свою секцию в файле ldf
CODE
init_sdram RUNTIME_INIT
{
INPUT_SECTION_ALIGN(4)
INPUT_SECTIONS($OBJECTS(init_sdram))
} > MEM_SDRAM0_BANK1


Массив стал выводиться но только почему-то по пол слова правильно , т.е.
Массив записан так :

Код
#pragma section ("init_sdram",RUNTIME_INIT)
unsigned short buf_sdram3[buf_size3]={0xabcd,0xabcd,0xabcd};


а выводится это:
Код
buf_sdram3:
AB00 AB00 AB00 AB00


Почему?

Причём если ручками записать по адресу массива двухбайтное слово - то оно записывается правильно, и читается правильно.
dxp
QUOTE (Lmx2315 @ Apr 12 2017, 22:11) *
а выводится это:
CODE
buf_sdram3:
AB00 AB00 AB00 AB00


Почему?

А в ldr файле в соответствующий секции тоже такие же значения лежат?

У меня в коде инициализирумый массив описан так:
CODE
//------------------------------------------------------------------------------
#pragma section("sdram1")
TCoordinates BrightnessIcon[46] =
{
    {1,8}, {2,2}, {2,8}, {2,13}, {3,3}, {3,12}, {4,6}, {4,7}, {4,8}, {4,9},
    {5,5}, {5,6}, {5,9}, {5,10}, {6,4}, {6,5}, {6,10}, {6,11}, {7,4}, {7,11},
    {8,1}, {8,2}, {8,4}, {8,11}, {8,13}, {8,14}, {9,4}, {9,11}, {10,4}, {10,5},
    {10,10}, {10,11}, {11,5}, {11,6}, {11,9}, {11,10}, {12,6}, {12,7}, {12,8}, {12,9},
    {13,3}, {13,12}, {14,2}, {14,8}, {14,13}, {15,8}
};
//------------------------------------------------------------------------------

А в линкерном скрипте
CODE
        sdram1
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS($OBJECTS(sdram1) $LIBRARIES(sdram1))
        } >MEM_SDRAM1

Не помню никаких проблем.
Lmx2315
Цитата(dxp @ Apr 13 2017, 08:18) *
А в ldr файле в соответствующий секции тоже такие же значения лежат?


я ничего не понимаю - посмотрел гляделкой LdrViewer.exe в файле NewProject.ldr и не нашёл там своего массива, хотя он (пусть половинчато) выводится и в файле NewProject.map.xml есть :

Код
<OUTPUT_SECTION name='init_sdram' id='03D85970' memory_id='00582A08' type='SHT_PROGBITS' start_address='0x4' word_size='0x80' word_size_unmapped='0x0' word_size_reserved='0x0' >
<INPUT_SECTIONS>
<INPUT_SECTION id='03858170' name='init_sdram' start_address='0x4' size='0x80' element_at='0x0' >
<INPUT_FILE><![CDATA[.\Release\main.doj]]></INPUT_FILE>
<SYMBOL name='_buf_sdram3' address='0x4' size='0x80' binding='GLOBAL'><DEMANGLED_NAME><![CDATA[buf_sdram3]]></DEMANGLED_NAME></SYMBOL>
<SYMBOL name='._buf_sdram3.end' address='0x84' size='0x0' binding='LOCAL'><DEMANGLED_NAME><![CDATA[]]></DEMANGLED_NAME></SYMBOL>
dxp
QUOTE (Lmx2315 @ Apr 13 2017, 14:19) *
я ничего не понимаю - посмотрел гляделкой LdrViewer.exe в файле NewProject.ldr и не нашёл там своего массива, хотя он (пусть половинчато) выводится и в файле NewProject.map.xml есть :

Да, я тоже не вижу в ldr (в моём есть такие секции - в адресом пространстве SDRAM, т.е. утилита отображает исправно). Если есть в мапе, следовательно, должно быть и в dxe. Если из dxe в ldr не попадает, надо смотреть процесс генерации образа - утилита elfloader. У меня её запуск:

CODE
COMMON_FLAGS = ' -proc ADSP-' + Processor + ' -si-revision ' + DeviceRev
...
LDRFLAGS  = COMMON_FLAGS
LDRFLAGS += ' -Width 16'

...

LOADER + LDRFLAGS + ' -Init ' + <исполняемый init>


где: LOADER - elfloader.exe
Lmx2315
Цитата(dxp @ Apr 13 2017, 10:37) *

А вы не из под VisualDSP работаете?
dxp
QUOTE (Lmx2315 @ Apr 13 2017, 15:23) *
А вы не из под VisualDSP работаете?

Нет, IDE VisialDSP++ только для отладчика использую (точнее, использовал, пока не перелез на линух, кодирование и сборка внешними тулзами (slickedit + scons)).

У вас тоже нет препятствий напрямую запустить любой инструмент из пакета. Попробуйте руками (утилитой elfloader.exe) ldr файл сгенерировать.
Lmx2315
По прежнему выводит по пол слова:

вывод моего терминала:
Цитата
buf_sdram3:
AA00 BB00 CC00 DD00 EE00 1100 2200 3300


Хотя если пишу после включения ручками в память - пишет и читает нормально, но при условии что пишу по чётному адресу.
А если пытаюсь записать двухбайтное слово по нечётному адресу в памяти - всё зависает, почему?
dxp
QUOTE (Lmx2315 @ Apr 13 2017, 18:54) *
Хотя если пишу после включения ручками в память - пишет и читает нормально, но при условии что пишу по чётному адресу.
А если пытаюсь записать двухбайтное слово по нечётному адресу в памяти - всё зависает, почему?

У Blackfin есть требование по выравниванию. Однобайтные обращения можно делать по любому адресу, двухбайтные (halfword) - только по чётным адресам, четырёхбайтные (word) - только по адресам, кратным четырём. Если это нарушить, то возникает аппаратное исключение. Это всё описано в документации. Поэтому у вас проц и виснет.
Lmx2315
Цитата(dxp @ Apr 13 2017, 15:04) *
Поэтому у вас проц и виснет.

спасибо.
jcxz
Цитата(dxp @ Apr 13 2017, 14:04) *
Если это нарушить, то возникает аппаратное исключение. Это всё описано в документации. Поэтому у вас проц и виснет.

Виснет не поэтому. Виснет потому, что нет обработки этого исключения. laughing.gif
dxp
QUOTE (jcxz @ Apr 27 2017, 13:15) *
Виснет не поэтому. Виснет потому, что нет обработки этого исключения. laughing.gif

Обработчик исключения там есть - обработчик по умолчанию. В нём процессор и сидит, а основная программа при этом висит.
jcxz
Цитата(dxp @ May 1 2017, 09:56) *
Обработчик исключения там есть - обработчик по умолчанию. В нём процессор и сидит, а основная программа при этом висит.

Наличие обработчика не говорит о наличии обработки исключения. Обработчик может быть пустой. Или только осуществляющий индикацию.
Обработка исключения - это набор некоторых действий после исключения, позволяющих вернуть ход выполнения в штатное русло. В данном случае например: выполнить операцию побайтно в обработчике и вернуться в основной поток выполнения. Ну или нечто иное.
Раз у Вас там "сидит", значит никакой обработки у Вас нет.
dxp
QUOTE (jcxz @ May 6 2017, 20:38) *
Наличие обработчика не говорит о наличии обработки исключения. Обработчик может быть пустой. Или только осуществляющий индикацию.
Обработка исключения - это набор некоторых действий после исключения, позволяющих вернуть ход выполнения в штатное русло. В данном случае например: выполнить операцию побайтно в обработчике и вернуться в основной поток выполнения. Ну или нечто иное.
Раз у Вас там "сидит", значит никакой обработки у Вас нет.

Это после любого исключения можно вернуть "в штатное русло"? Наверное поэтому каждый видел сообщения ОС "Приложение выполнило недопустимую операцию и будет завершено". Невыровненный доступ на Blackfin - невыполнимая операция. И выполнить её "побайтно" вы не сможете. Там просто нет никакой дополнительной информации - какой был доступ. Кроме того, чаще всего такая ошибка возникает ни из-за того, что программист ошибся и выполнил такой доступ (на том же Си не так просто это сделать, т.к. компилятор правильно организует доступ). А возникает это из-за как правило из-за ошибок работы с памятью - порчи стека, ошибок адресной арифметики и т.д. - вот тут-то и лезет обращение по невыровненному адресу. И как тут прикажете исправлять?

Поэтому никто там ничего не исправляет - возникло такое исключение - прибили задачу, если это взрослая ОС. А в bare-metal - просто индикация и больше никакой дополнительной обработки. Автор программы должен исправить причину (порчу памяти), тогда и следствий (невыровненного доступа) не будет.

Т.ч. у каждого свои понятия, что есть обработка. Какая-то она есть. А другую там и применить.
jcxz
Цитата(dxp @ May 9 2017, 11:51) *
Это после любого исключения можно вернуть "в штатное русло"?

В зависимости от алгоритма работы ПО - возможно.

Цитата(dxp @ May 9 2017, 11:51) *
Наверное поэтому каждый видел сообщения ОС "Приложение выполнило недопустимую операцию и будет завершено".

Вот это и есть - один из вариантов реализации такого Обработчика исключений. Не тупо зависнуть на заглушке, а собрать необходимую информацию об исключении. И выдать её пользователю. Либо сохранить её куда-то и перегрузиться. Это всё и есть - "штатные русла выполнения ПО после исключения". У меня исключения как правило именно так и обрабатываются. Если нет каких-то спец. требований.

Цитата(dxp @ May 9 2017, 11:51) *
И выполнить её "побайтно" вы не сможете. Там просто нет никакой дополнительной информации - какой был доступ.

Да ладно? Все могут, а я не смогу? biggrin.gif
А значение PC при возникновении этого исключения разве не известно? Даже с учётом конвеера DSP я думаю возможно будет определить команду вызвавшую его.
А дальше всё штатно, как и для других архитектур, где есть такие же ограничения: декодируем код команды, режимы адресации, регистр, вычисляем результирующий адрес доступа и операцию, и выполняем её.

Цитата(dxp @ May 9 2017, 11:51) *
А возникает это из-за как правило из-за ошибок работы с памятью - порчи стека, ошибок адресной арифметики и т.д. - вот тут-то и лезет обращение по невыровненному адресу. И как тут прикажете исправлять?

Как правило такая ошибка чаще всего возникает при некорректной работе с указателями.
Конечно - при разработке ПО её лучше исправить. Но в каких-то редких случаях может быть полезной и программная эмуляция невыровненного доступа.
Например - в Cortex-M я видел рекомендации по использованию исключения невыровненного доступа именно для программной эмуляции этой операции и возвращения выполнения в штатное русло.
dxp
QUOTE (jcxz @ May 11 2017, 15:59) *
Вот это и есть - один из вариантов реализации такого Обработчика исключений. Не тупо зависнуть на заглушке, а собрать необходимую информацию об исключении. И выдать её пользователю. Либо сохранить её куда-то и перегрузиться. Это всё и есть - "штатные русла выполнения ПО после исключения". У меня исключения как правило именно так и обрабатываются. Если нет каких-то спец. требований.

И что это даёт? Ну, перезагрузилсь - и что? Проблема-то не решена. В программе баг, ваши перезагрузки его не исправят.

QUOTE (jcxz @ May 11 2017, 15:59) *
Да ладно? Все могут, а я не смогу? biggrin.gif
А значение PC при возникновении этого исключения разве не известно? Даже с учётом конвеера DSP я думаю возможно будет определить команду вызвавшую его.
А дальше всё штатно, как и для других архитектур, где есть такие же ограничения: декодируем код команды, режимы адресации, регистр, вычисляем результирующий адрес доступа и операцию, и выполняем её.

Насчёт PC не знаю. Но даже если это известно, это не поможет. При возникновении исключения из-за невыровненного доступа у Blackfin в регистре SEQSTAT лежит код 0х24 (Data access misaligned address violation), всё, больше никакой информации нет. Вы не можете определить, был ли 32-разрядный доступ по адресу, кратному 8 бит или по адресу 16 бит, или это был 16-разрядный доступ ко нечётному адресу. И как вы будете тут что-то исправлять?

А самое главное - в 99% (если) случаев это исключение возникает из-за "прострелов" памяти, т.е. тут даже если знать всё о точке возникновения исключения и о размерах выравнивания, это всё равно абсолютно ничего не даёт - бессмысленно исправлять доступ, когда ошибка совсем в другом. На ARMv7 тут и исключения не возникнет, т.к. эта ISA поддерживает невыровненный доступ, но это лишь отсрочивает обнаружение проблемы. А на Blackfin обнаруживается в том числе и по этому признаку, т.к. его аппаратура не поддерживает невыровненный доступ. Только и всего. И такие ошибки в программе на РС всегда заканчиваются выдачей Segmentation Fault и аварийным завершением программы.

И лучшее, что тут можно сделать - это организовать какую-то выдачу информации о коде ошибки. Но мне и это было не надо - если программа зависла, я делаю останов эмулятором и смотрю, что там произошло. Если висит в обработчике исключения, то смотрю код исключения. Если он указывает на невыровненный доступ, то даже не сомневаюсь, что где-то "прострелило" память. И в подобной ситуации практически на любом МК ничего принципиально иного - т.е. возможности исправить ход выполнения программы, - сделать нельзя. А ваши доводы - это теоретизирование.
jcxz
Цитата(dxp @ May 12 2017, 06:03) *
И что это даёт? Ну, перезагрузилсь - и что? Проблема-то не решена. В программе баг, ваши перезагрузки его не исправят.

Вы что-то не догоняете... wink.gif
Причём тут баг? Баги надо исправлять, а не костыли для них делать - это несомненно.
Речь не о багах, а когда по каким-то причинам необходимо изредка обращаться к памяти невыровненно. Именно штатно, а не при баге.
При чём тут все эти разрушения памяти и переполнения стека?? Речь вообще не об этом.
Я же писал о штатном русле выполнения, в котором такие исключения - вполне стандартный путь поведения ПО.
Это во-первых.
Во-вторых - даже если это нештатное поведение программы, баг, то как раз запись точки события (со всем контекстом) в энергонезависимую память - это очень помогает в нахождении этого бага.
Похоже у Вас мало опыта в разработки сложных систем, работающих у заказчика круглые сутки. Иначе бы понимали, что возможны ситуации когда твоё устройство работает скажем месяц у заказчика не выключаясь без сбоев, а потом происходит внезапный сбой (например - неожиданное исключение). Т.е. - очень редкий. Воспроизвести это "на столе" практически невозможно, так как происходит оно при редком стечении множества факторов в определённой последовательности. Сколько не отлаживай на столе - не получается воспроизвести. И визуально не найти - объём ПО - десятки тысяч строк, а то и сотни.
Вот тут как раз очень помогает запись таких событий.
В опытной эксплуатации на объекте заказчика работает множество таких устройств, скажем месяц. Набирается статистика таких сбоев (если есть). И потом по ней уже можно искать причину. Я много раз сталкивался с такими случаями.

Цитата(dxp @ May 12 2017, 06:03) *
Насчёт PC не знаю. Но даже если это известно, это не поможет. При возникновении исключения из-за невыровненного доступа у Blackfin в регистре SEQSTAT лежит код 0х24 (Data access misaligned address violation), всё, больше никакой информации нет. Вы не можете определить, был ли 32-разрядный доступ по адресу, кратному 8 бит или по адресу 16 бит, или это был 16-разрядный доступ ко нечётному адресу. И как вы будете тут что-то исправлять?

Опять-же - это Вы не можете, а у меня всегда почему-то получалось laughing.gif
Я ещё ни на одной архитектуре (где есть исключения/прерывания) не видел такого, чтобы не возможно было определить точку, где оно произошло. Адрес возврата всегда есть. А для тех исключений, где по адресу возврата не определить адрес исключения (в Cortex например такие есть), адрес сохраняется в спец. регистре.
А как именно определить какой доступ и скольки-разрядный и прочее - я писал выше.
Если не понятно, разжую:
Скажем по адресу возврата минус одна команда увидели команду: LDR R0, [R1] - попробуйте догадаться скольки-разрядный доступ был и по какому адресу? laughing.gif
И как именно программно сэмулировать это невыровненное чтение? Имхо - даже начинающий должен догадаться.... laughing.gif

Цитата(dxp @ May 12 2017, 06:03) *
На ARMv7 тут и исключения не возникнет, т.к. эта ISA поддерживает невыровненный доступ, но это лишь отсрочивает обнаружение проблемы. А на Blackfin обнаруживается в том числе и по этому признаку, т.к. его аппаратура не поддерживает невыровненный доступ.

Очевидно, что Вы не знаете не только архитектуру Blackfin, но и в архитектуре Cortex-M тоже не разбираетесь.
В Cortex-M только некоторые команды поддерживают невыровненный доступ. Да и то - опционально. Большинство команд обращения к памяти его не поддерживают.

Цитата(dxp @ May 12 2017, 06:03) *
И лучшее, что тут можно сделать - это организовать какую-то выдачу информации о коде ошибки. Но мне и это было не надо - если программа зависла, я делаю останов эмулятором и смотрю, что там произошло.

Ну да - теперь попробуйте это сделать когда это произошло на объекте заказчика за несколько тысяч км в ночь с 31-го декабря на 1-е января. И с учётом того, что работу объекта остановить нельзя ни на час.
У Вас совсем нет практического опыта работы как видно - не представляете как реально происходят такие сбои. Ваш настольный опыт тут не поможет.

Цитата(dxp @ May 12 2017, 06:03) *
А ваши доводы - это теоретизирование.

"Давайте не спорить о вкусе устриц с теми кто их ел" (С) ... laughing.gif
dxp
QUOTE (jcxz @ May 12 2017, 13:15) *
<флуд поскипан>

Окей, давайте докажите на практике, а то ваша пустая болтовня уже поднадоела. Вот возникло исключение - в регистре SEQSTAT код 0х24. Ваши действия? Причину вы не знаете - может память испорчена, а может программист на ассемблере что-то писал и накосячил с доступом.
jcxz
Цитата(dxp @ May 12 2017, 09:26) *
Окей, давайте докажите на практике, а то ваша пустая болтовня уже поднадоела. Вот возникло исключение - в регистре SEQSTAT код 0х24. Ваши действия? Причину вы не знаете - может память испорчена, а может программист на ассемблере что-то писал и накосячил с доступом.

Доказываю я работодателю своей работой. Моё время дорого стоит. Хотите чтобы сделал за Вас работу? Докажите, что способны оплатить моё время!
А то Ваш пустой трёп поднадоел - как видно предмета обсуждения Вы не знаете, а пытаетесь что-то советовать....
dxp
QUOTE (jcxz @ May 12 2017, 15:30) *
Доказываю я работодателю своей работой. Моё время дорого стоит. Хотите чтобы сделал за Вас работу? Докажите, что способны оплатить моё время!
А то Ваш пустой трёп поднадоел - как видно предмета обсуждения Вы не знаете, а пытаетесь что-то советовать....

Не сомневался в таком ответе. Вы не знаете, как это сделать, вот и юлите. Я утверждаю, что из исключения, возникающего на Blackfin из-за невыровненного доступа, невозможно вернуть программу в рабочее русло корректно. Вы же в своей манере менторским тоном как обычно порите чушь, что это можно. Раз утверждаете - докажите. Ваше словоблудие, на которое вы тут тратите ваше "драгоценное" время, - это не доказательство. Не можете показать, не надо выступать.
jcxz
Цитата(dxp @ May 12 2017, 10:48) *
Я утверждаю, что из исключения, возникающего на Blackfin из-за невыровненного доступа, невозможно вернуть программу в рабочее русло корректно.

Вы "знаете"??? Ха! biggrin.gif
Вы даже не знаете как узнать значение PC при котором произошло исключение. Значит Вы не знаете даже базовых основ работы системы исключений в том процессоре, о котором что-то "утверждаете".
А значит всё что Вы тут понаплели - как раз и есть словоблудие.
И я нигде не утверждал, что знаю Blakfin. Я с ним не работал. Но много работал с другими DSP и Cortex-M, про которые Вы тут тоже несли чушь не владея предметом.
И по аналогии с ними, могу предположить, что на Blakfin-е дела обстоят точно так же. И то что Вы этого не знаете - ни о чём не говорит.
Так что это уж скорее к Вам пожалуйста не тратьте драгоценное время всех читателей этой темя на чтение Вашего словоблудия. laughing.gif

ЗЫ: И так: Раз утверждаете что "невозможно вернуть программу в рабочее русло " - докажите.
Цитата(dxp @ May 12 2017, 10:48) *
Не можете показать, не надо выступать.

Вот именно. cool.gif
dxp
Ответа по существу так и нет. Ok, слив засчитан.

Впрочем, ничего иного от вас ожидать и не приходится - только постоянные попытки давать оценку личностям оппонентов и расчёсывание собственного ЧСВ.

QUOTE (jcxz @ Apr 13 2017, 15:03) *
Видно что искусство чтения Вам недоступно.


QUOTE (jcxz @ Apr 29 2017, 15:07) *
Вот это похоже на правду - что не умеете читать.


QUOTE (jcxz @ May 12 2017, 13:15) *
Похоже у Вас мало опыта в разработки сложных систем


QUOTE (jcxz @ May 12 2017, 13:15) *
Очевидно, что Вы не знаете не только архитектуру Blackfin


QUOTE (jcxz @ May 12 2017, 13:15) *
У Вас совсем нет практического опыта работы как видно


QUOTE (jcxz @ Apr 8 2017, 14:59) *
Вы читать умеете? А понимать смысл прочитанного?


QUOTE (jcxz @ Apr 8 2017, 14:59) *
Очевидно Вы не имели опыта работы с SDRAM, а у меня ...


QUOTE (jcxz @ Apr 8 2017, 14:59) *
Прочитайте выделенное несколько раз, пока не поймёте.


QUOTE (jcxz @ May 12 2017, 15:30) *
Моё время дорого стоит.


По двору разнёсся слух,
Что сильнее всех петух,
Что вчера в ужасной драке
Оторвал он хвост собаке,
Гусаку намял бока -
Покалечил гусака...

А распускает этот слух...
Сам петух


Оставайтесь колотить понты. Всего вам хорошего.
jcxz
Так всё-таки - как узнать значение PC прерванного процесса в прерывании/исключении на Blackfin? rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.