_pv 79 19 сентября, 2017 Опубликовано 19 сентября, 2017 · Жалоба Или речь идёт о том, что линкер сделает стартап, который сделает копию функции из 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 не страшно. Иначе получается - программа рубит сук на котором сидит) этот кусок кода не должен находиться во внешней памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 19 сентября, 2017 Опубликовано 19 сентября, 2017 · Жалоба #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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 19 сентября, 2017 Опубликовано 19 сентября, 2017 · Жалоба а в SDRAMе код простите само по себе появляется или его туда кладёт кто-то. почему бы этому кому-то, а то и вообще штатному бутлоадеру небольшую часть кода не положить в L1? несколько МБ исполняемого кода для блэкфина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба а в SDRAMе код простите само по себе появляется или его туда кладёт кто-то. почему бы этому кому-то, а то и вообще штатному бутлоадеру небольшую часть кода не положить в L1? несколько МБ исполняемого кода для блэкфина? Это оправдано только лишь в единичном случае. Когда приложений много, и запросы каждого уникальны, то становится очень неразумно возлагать на загрузчик SDRAM дополнительно ещё функцию загрузки части кода в L1. Использую свой загрузчик, который с SD карты считывает несколько секторов и кладёт их в SDRAM и кидает туда управление. Поиск приложения - по специальной сигнатуре в стартовом секторе карты. Оттуда же и размер приложения берется. Единственное условие - файл приложения должен быть нефрагментированным, это легко: достаточно отформатировать карту и записать файлы. Это было давно - в 2009 г. Сейчас же конечно же можно FATFs прикрутить - испытано проверено: http://elm-chan.org/fsw/ff/00index_e.html Только пришлось писать обёртку, так как порядок аргументов, возвращаемые значения и некоторые принципы - отличаются от стандартных C-функций (fopen, fread,...) Речь на этот раз идёт о вот этом девайсике: Кстати вопрос по L1, есть память для кода в BlackFin-ax. Но ведь её можно как память для данных использовать? Иначе тогда как в неё класть код? Будет ли шуршать DMA из/в этой/эту память/и ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 20 сентября, 2017 Опубликовано 20 сентября, 2017 · Жалоба ssync(); *pSWRST = 0x0007; ssync(); ssync(); *pSWRST = 0x0000; *pUART_SCR = 0x01; ssync(); asm("raise 1;"); Вот так у меня работает. Но код выполняется из внутренней памяти. pUART_SCR используется в загрузчике. Содержимое этого регистра не сбрасывается при перезагрузке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться