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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ADSP BF532, Сброс процессора
_pv
сообщение Sep 19 2017, 16:30
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(__inline__ @ Sep 19 2017, 21:29) *
Или речь идёт о том, что линкер сделает стартап, который сделает копию функции из SDRAM в L1 и сформирует вызовы именно из L1 ? (это фантастика =)


речь о том чтобы выделить в L1 десяток байт для этой функции и засунуть её туда, а не в SDRAM, зачем копию?

#pragma section("MY_L1_CODE_SECTION")
void Blackfin_reset()
ну как-то так, забыл уже.

Цитата(__inline__ @ Sep 19 2017, 21:29) *
Ну я под этим подразумевал пустой цикл sm.gif А если запятую убрать, то получится 75 раз NOP-ов )) Ну а на счёт выкинет, есть же volatile)

а там и должно быть 75 NOPов, точнее там должна быть пауза в 5 sclk, а 75 получилось из максимально возможного делителя SCLK:CCLK = 15.
а как написано - этой паузы скорее всего нет.
и volatile относится исключительно к nop который зачем-то стоит отдельно после пустого цикла, который компилятору выкинуть никто не помешает.

Цитата(__inline__ @ Sep 19 2017, 21:29) *
Если фрагмент кода сброса находится во внешней кешируемой памяти - не поможет.
Надо чтоб этот фрагмент гарантировано был закеширован, тогда отключение SDRAM не страшно. Иначе получается - программа рубит сук на котором сидит)

этот кусок кода не должен находиться во внешней памяти.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 19 2017, 16:58
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(_pv @ Sep 19 2017, 16:30) *
#pragma section("MY_L1_CODE_SECTION")
void Blackfin_reset()
ну как-то так, забыл уже.


Так это всего-лишь говорит о том, что функция располагается в данной области памяти и не более того.
А ответственность за наличие кода в этой области - лежит на программисте.

На практике часто приходится делать большие ROM - от сотен килобайт - до несколько мегабайтов. Такие программы исполнять только в SRAM или SDRAM.
Кроме того, программы загружаются во внешнюю память самописанным загрузчиком и линковщик максимум что может сделать - это сформировать вызов функции по адресу в регионе MY_L1_CODE_SECTION. А будет ли там код - это на совести программиста.

Можно было вообще сделать без этих секций:

Код
void* FunctionInL1Memory=(void*)MY_L1_CODE_SECTION_Physical_Address


и вызывать уже как:
Код
FunctionInL1Memory();


Но сам код нужно будет размещать в L1 самому - копировать его из SDRAM в L1, и ещё FLUSH-ить кеш данных, чтоб гаранированно легло.
И ещё Position Independent, чтоб от адресов не зависел...

Я просто не представляю, как линковщик сделает копирование функции из SDRAM в L1, когда бинарный образ кода линкуется для адреса 0x4. - это внешняя память.

Цитата(_pv @ Sep 19 2017, 16:30) *
этот кусок кода не должен находиться во внешней памяти.


А вот задача была именно такая - из выполняемого кода в SDRAM, ресетнуть процессор. Решение найдено как писал ранее (WDT)
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 19 2017, 17:21
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



а в SDRAMе код простите само по себе появляется или его туда кладёт кто-то.
почему бы этому кому-то, а то и вообще штатному бутлоадеру небольшую часть кода не положить в L1?
несколько МБ исполняемого кода для блэкфина?
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 20 2017, 03:52
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(_pv @ Sep 19 2017, 17:21) *
а в SDRAMе код простите само по себе появляется или его туда кладёт кто-то.
почему бы этому кому-то, а то и вообще штатному бутлоадеру небольшую часть кода не положить в L1?
несколько МБ исполняемого кода для блэкфина?

Это оправдано только лишь в единичном случае.
Когда приложений много, и запросы каждого уникальны, то становится очень неразумно возлагать на загрузчик SDRAM дополнительно ещё функцию загрузки части кода в L1.
Использую свой загрузчик, который с SD карты считывает несколько секторов и кладёт их в SDRAM и кидает туда управление. Поиск приложения - по специальной сигнатуре в стартовом секторе карты. Оттуда же и размер приложения берется. Единственное условие - файл приложения должен быть нефрагментированным, это легко: достаточно отформатировать карту и записать файлы.

Это было давно - в 2009 г. Сейчас же конечно же можно FATFs прикрутить - испытано проверено: http://elm-chan.org/fsw/ff/00index_e.html
Только пришлось писать обёртку, так как порядок аргументов, возвращаемые значения и некоторые принципы - отличаются от стандартных C-функций (fopen, fread,...)

Речь на этот раз идёт о вот этом девайсике:
Прикрепленное изображение

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


Кстати вопрос по L1, есть память для кода в BlackFin-ax.

Но ведь её можно как память для данных использовать? Иначе тогда как в неё класть код?

Будет ли шуршать DMA из/в этой/эту память/и ?
Go to the top of the page
 
+Quote Post
uriy
сообщение Sep 20 2017, 05:04
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 287
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Код
                ssync();
                *pSWRST = 0x0007;
                ssync();
                ssync();
                *pSWRST = 0x0000;
                *pUART_SCR = 0x01;    
                ssync();
                asm("raise 1;");

Вот так у меня работает. Но код выполняется из внутренней памяти.
pUART_SCR используется в загрузчике. Содержимое этого регистра не сбрасывается при перезагрузке.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st October 2017 - 16:01
Рейтинг@Mail.ru


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