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

Код в SDRAM и Write-Back cache

в SDRAM загрузил небольшое приложение со стартового адреса 0x00000004

затем из самописанного загрузчика в L1 передал управление на адрес 0x00000004

 

приложение работает когда кэши отключены

и работает в несколько раз быстрее когда включены кэши Instruction, DataA и режим сквозной записи (Write-Throw)

 

при установке режима обратной записи (Write-Back) -приложение не работает

 

кэши и их режимы включаю в меню менеджера проекта VDSP - enable Instr. и DataA caches

 

DataB - не кэширую, так как понадобится инит-файл

 

Вопрос - что надо сделать, чтобы приложение находящееся в SDRAM заработало после передачи на него управления по адресу 0x00000004 ?

 

flush, flushinv, iflush , как ими пользоваться?

 

напишите плиз фрагмент для моего случая :help

 

добавлю:

приложение не использует ДМА, работает с флагами

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


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

из описания на BF понял, что нужно данные в кэше сбростить в саму SDRAM

 

допустим адрес приемника(SDRAM): 0x00000004

адрес источника: &APPData

количество байт 0x1000

 

фрагмент:

 

ssync();
flush(0x00000004);
ssync();

ни к чему не приводит - приложение не запускается.

 

помогите плиз разобраться - как с кеша данных скинуть в память?

 

 

в переводе chapter6.pdf написано, что полностью переводить кэш данных в недостоверное состояние можно путем сброса битов DMC[1:0] в регистре DMEM_CONTROL

и с последующей их обратной установкой

 

вопрос - будут ли данные перенесены из кеша данных в реальную память перед объявлением всего кеша недостоверным ?

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


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

пробовал отключать кеш данных в регистре DMEM_CONTROL битами DMC[1:0]

затем копировал код в SDRAM

потом обратной установил биты DMC[1:0] в DMEM_CONTROL

 

также flush-ил в цикле:

 

for(i=0;i<sizeof(appdata);i++)
{
  *(u8*)(0x00000004+i)=appdata[i];
csync();
ssync();
flush(0x00000004+i)
csync();
ssync();
}

 

оба варианта заработали - приложение в SDRAM успешно старатнуло с кешем данных в W-Back режиме.

 

 

как можно весь кеш целиком сбросить в память и нужно ли в моём случае?

можно ли как-то оптимизировать вышеприведенный цикл?

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


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

аууу... народ! вы где? :1111493779:

 

неужели никто не игрался с кешами? или вопросы плохо задаю?

 

в исходниках ulinux'а нашёл:

 

ENTRY(_blackfin_dcache_flush_range)
       R2 = -32;
       R2 = R0 & R2;
       P0 = R2;
       P1 = R1;
       CSYNC;
1:
       FLUSH[P0++];
       CC = P0 < P1(iu);
       IF CC JUMP 1b(bp);
       FLUSH[P0];
       SSYNC;
       RTS;
ENDPROC(_blackfin_dcache_flush_range)

 

R0 - начальный адрес, R1 - конечный

 

по ходу оно? :smile3046:

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


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

Не могли бы вы выложить фрагмент с настройками кэша и передачей управления в SDRAM?

 

Насколько я понимаю, после ресета внутренняя память L1 инструкций и данных настроена как SRAM (т. е. кэширование выключено). При этом лоадер выполняется в SRAM инструкций (L1 instruction memory). В Blackfin Processor Programming Reference сказано, что в этом режиме при попытке выполнить инструкцию из

- пустой области инструкций L1,

- области данных L1,

- области MMR

вырабатывается исключение.

Я пробовал включить кэширование (пример взял из u-boot, там выполняются настройки CPLB и включаются кэши) - но после выполнения этих ф-ций

перестали выполняться следующие за ними инструкции (вывод содержимого регистров IMEM_CONTROL, DMEM_CONTROL и переход в SDRAM).

 

Помогите плиз, ибо я в отчаянии!

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


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

Не могли бы вы выложить фрагмент с настройками кэша и передачей управления в SDRAM?

 

настройка кешей происходит в загрузчике, который в L1

ничего вручную пока не пишу - в VDSP в менеджере проектов выбираем - использовать кеш данных/инструкций, кастомизировать таблицу(может что-нибудь поменять прийдется), политика записи кеша - WriteBack

это все делается кликом мыши по чек-боксам :)

 

передача управления происходит так:

 

void (*program)(void) = (void (*)(void))(0x00000004); 
(*program)();

 

Где 0x0000004 - начальный адрес загруженного приложения в SDRAM

 

Приложение пишется также в VDSP, тип файла ldr, не использовать файлы инициализации и ldr-хедер.

использовать сплиттер - маска 29, формат hex

hex формат перегоняем в bin (программой hex2bin.exe)

 

Для приложения переправить ldf-файл - все секции которые ссылаются на L1 data,code, scratchpad тупо заменить на секцию SDRAM (к примеру bank0)

cекция код должна быть ROM (а не RAM)

 

всё это написано очень подробно в EE-239 в разделе Running from Flash via Bypass Mode

там о том как заставить линковщик генерить "чистый" исполняемый файл

 

если вас VDSP не устраивает скачайте EE-271 и файлик 5281628562547355432EE271v01.zip с сайта аналога.

там как раз рассказывается/показывается как работать с кэшами

 

Помогите плиз, ибо я в отчаянии!

 

надеюсь, помог :)

 

встречный вопрос:

 

политика кеша write-through она ускоряет чтение данных и исполнение кода. запись происходит сквозь кеш в память, тоесть по записи выигрыша не даёт?

 

write-back - кешируется ещё и при записи.

 

вопрос - даст ли выигрыш в производительности кеширование write-back для кода/чтения данных?

 

нужно ли кешировать data L1, code L1 ?

 

где лучше разместить стек - в write-back SDRAM, cached L1 или в scratchpad ?

где будет быстрее?

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


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

нужно ли кешировать data L1, code L1 ?

Зачем? :07: L1 и так работает на частоте ядра

где лучше разместить стек - в write-back SDRAM, cached L1 или в scratchpad ?

где будет быстрее?

Не в SDRAM однозначно. Если хватит 4к под стек (мне до сих пор хватало) - тогда в scratchpad. Если мало - в некэшируемой L1.

По скорости L1 и scratchpad одинаковы.

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


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

встречный вопрос:

 

политика кеша write-through она ускоряет чтение данных и исполнение кода. запись происходит сквозь кеш в память, тоесть по записи выигрыша не даёт?

 

write-back - кешируется ещё и при записи.

 

вопрос - даст ли выигрыш в производительности кеширование write-back для кода/чтения данных?

 

Скорость при чтении не зависит от write-back/write-through - ведь содержимое памяти не изменяется. Другое дело при записи - write-back изменяет только содержимое кэша и ставит пометку об изменении, так что, по идее, должно быть быстрее, чем write-through.

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


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

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

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

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

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

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

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

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

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

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