|
ADSP BF532, Сброс процессора |
|
|
|
Sep 19 2017, 00:15
|

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

|
Здравствуйте! Конфигурация: ADSP Blackfin BF532, код выполняется из SDRAM, кеширование включено. Первичная загрузка - из SPI флешки 8-битной (микросхема AT45DB....), затем переход кода в SDRAM. Нужно сбросить процессор, чтобы снова подгрузилась программа из SPI-флешки. (причем именно чтобы снова повторился цикл загрузки с SPI-флешки, ттак как старый образ программы в L1 может быть уже разрушен - стеком, буферами DMA) Вот так - НЕ работает: Код while(1) __asm__ ("raise 1;"); Спецы, подскажите плиз как сбросить программно?
|
|
|
|
|
Sep 19 2017, 05:52
|

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

|
Цитата(jcxz @ Sep 19 2017, 05:17)  Перейти на начало загрузчика в ROM? Да. Штатный загрузчик, который по двум ногам определяет, что надо скопировать код с spi-флешки AT45DB... и передать на него управление
|
|
|
|
|
Sep 19 2017, 14:37
|

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

|
Сделал вот так: Код static __inline__ void BlackFin_SoftReset(void) { *pSWRST=0x0007; ssync(); register u32 i=75; while(i--); __asm__ __volatile__ ("NOP;"); *pSWRST=0x0000; ssync(); __asm__ __volatile__ ("RAISE 1;"); } Работает, но не всегда - зависит от расположения данного кода. Подозреваю, что этот фрагмент должен быть в кеше инструкций целиком, тогда успешно. Каким образом можно сделать чтобы данный код был гарантированно в кеше инструкций? (код выполняется из SDRA со включенным write-back кешированием)
|
|
|
|
|
Sep 19 2017, 15:17
|

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

|
В общем, найдёно изящное решение - сброс по сторожевому таймеру: Код static __inline__ void BlackFin_Reset(void) { *pWDOG_CNT=13200000; //таймаут 0.1 секунды (число тактов шины SCLK, у меня 132 МГц) *pWDOG_CTL=0; //выбираем RESET и включаем watchdog while(1); //зацикливание } Работает надёжно и с любого адреса, ресет такой же как при нажатии на кнопку, загрузчик снова тянет из SPI-флеш самописанную программу-загрузчик-инициализатор в SDRAM. До этого ещё пробовал как здесь: http://electronix.ru/forum/index.php?showtopic=32272 - НЕ помогло. Всё-же RAISE 1 и SWRST - это от лукавого (при выполнения кода из кешируемой области памяти)
|
|
|
|
|
Sep 19 2017, 15:29
|

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

|
Цитата(_pv @ Sep 19 2017, 14:59)  объясните линкеру чтобы он эту конкретную функцию в внутреннюю память положил. А как он её положет, если сама программа исполняется в SDRAM с адреса 0x00000004 ? Образ программы в LDF-файле задается как ROM, но это для линковщика, на самом деле там всё RAM  (ох уж эти линковщики  Или речь идёт о том, что линкер сделает стартап, который сделает копию функции из SDRAM в L1 и сформирует вызовы именно из L1 ? (это фантастика =) Цитата p.s. точку с запятой после while(i--) уберите, она там немного лишняя, а то компилятор может этот цикл выкинуть за ненадобностью. Ну я под этим подразумевал пустой цикл  А если запятую убрать, то получится 75 раз NOP-ов )) Ну а на счёт выкинет, есть же volatile) Цитата(_pv @ Sep 19 2017, 15:26)  мануалы читать надо, там написано для чего и какая пауза должна быть между записями в SWRST. Если фрагмент кода сброса находится во внешней кешируемой памяти - не поможет. Надо чтоб этот фрагмент гарантировано был закеширован, тогда отключение SDRAM не страшно. Иначе получается - программа рубит сук на котором сидит)
Сообщение отредактировал __inline__ - Sep 19 2017, 15:28
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|