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

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

 

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

 

#pragma section("MY_L1_CODE_SECTION")

void Blackfin_reset()

ну как-то так, забыл уже.

 

Ну я под этим подразумевал пустой цикл :) А если запятую убрать, то получится 75 раз NOP-ов )) Ну а на счёт выкинет, есть же volatile)

а там и должно быть 75 NOPов, точнее там должна быть пауза в 5 sclk, а 75 получилось из максимально возможного делителя SCLK:CCLK = 15.

а как написано - этой паузы скорее всего нет.

и volatile относится исключительно к nop который зачем-то стоит отдельно после пустого цикла, который компилятору выкинуть никто не помешает.

 

Если фрагмент кода сброса находится во внешней кешируемой памяти - не поможет.

Надо чтоб этот фрагмент гарантировано был закеширован, тогда отключение SDRAM не страшно. Иначе получается - программа рубит сук на котором сидит)

этот кусок кода не должен находиться во внешней памяти.

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


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

#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. - это внешняя память.

 

этот кусок кода не должен находиться во внешней памяти.

 

А вот задача была именно такая - из выполняемого кода в SDRAM, ресетнуть процессор. Решение найдено как писал ранее (WDT)

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


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

а в SDRAMе код простите само по себе появляется или его туда кладёт кто-то.

почему бы этому кому-то, а то и вообще штатному бутлоадеру небольшую часть кода не положить в L1?

несколько МБ исполняемого кода для блэкфина?

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


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

а в SDRAMе код простите само по себе появляется или его туда кладёт кто-то.

почему бы этому кому-то, а то и вообще штатному бутлоадеру небольшую часть кода не положить в L1?

несколько МБ исполняемого кода для блэкфина?

Это оправдано только лишь в единичном случае.

Когда приложений много, и запросы каждого уникальны, то становится очень неразумно возлагать на загрузчик SDRAM дополнительно ещё функцию загрузки части кода в L1.

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

 

Это было давно - в 2009 г. Сейчас же конечно же можно FATFs прикрутить - испытано проверено: http://elm-chan.org/fsw/ff/00index_e.html

Только пришлось писать обёртку, так как порядок аргументов, возвращаемые значения и некоторые принципы - отличаются от стандартных C-функций (fopen, fread,...)

 

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

post-99126-1505879394_thumb.jpg

post-99126-1505879401_thumb.jpg

 

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

 

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

 

Будет ли шуршать DMA из/в этой/эту память/и ?

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


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

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

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

pUART_SCR используется в загрузчике. Содержимое этого регистра не сбрасывается при перезагрузке.

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


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

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

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

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

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

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

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

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

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

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