Jump to content

    
Sign in to follow this  
Itch

Blackfin. Как включить и использовать кэш?

Recommended Posts

Нужно включить кэш инструкций и данных в режиме Write-Through. Visual DSP 4.5 (пятая глючит и вообще не охота менять коней на переправе)

 

1. Захожу в опции проекта, выставляю нужные галочки, генерируется файл вида *_cplbtab.c

Потом конфигурирую этот файл под свою систему.

 

Этого достаточно для включения кэша, т.е. кэш уже работает?

Почему я нигде не вижу манипуляцию с регистром IMEM_CONTROL?

 

2. Есть пример в C:\Program Files\Analog Devices\VisualDSP 4.5\Blackfin\Examples\ADSP-BF533 EZ-Kit Lite\Cache (ASM)

 

Вырвать оттуда cacheinit.asm и вставить в свой проект?

Почему там в опциях проекта вообще нет галочек ни про кэш, ни про SDRAM?

 

3. Где бы взять нормальный проект на C, чтобы и галочки были проставлены, и все работало?

 

Share this post


Link to post
Share on other sites
Нужно включить кэш инструкций и данных в режиме Write-Through. Visual DSP 4.5 (пятая глючит и вообще не охота менять коней на переправе)

 

1. Захожу в опции проекта, выставляю нужные галочки, генерируется файл вида *_cplbtab.c

Потом конфигурирую этот файл под свою систему.

 

Этого достаточно для включения кэша, т.е. кэш уже работает?

Почему я нигде не вижу манипуляцию с регистром IMEM_CONTROL?

 

2. Есть пример в C:\Program Files\Analog Devices\VisualDSP 4.5\Blackfin\Examples\ADSP-BF533 EZ-Kit Lite\Cache (ASM)

 

Вырвать оттуда cacheinit.asm и вставить в свой проект?

Почему там в опциях проекта вообще нет галочек ни про кэш, ни про SDRAM?

 

3. Где бы взять нормальный проект на C, чтобы и галочки были проставлены, и все работало?

 

помню, когдато тоже мучались

потом плюнули и начали использовать u-boot

там уже все правильно инициализировано

Share this post


Link to post
Share on other sites
Нужно включить кэш инструкций и данных в режиме Write-Through. Visual DSP 4.5 (пятая глючит и вообще не охота менять коней на переправе)

 

1. Захожу в опции проекта, выставляю нужные галочки, генерируется файл вида *_cplbtab.c

Потом конфигурирую этот файл под свою систему.

 

Этого достаточно для включения кэша, т.е. кэш уже работает?

Почему я нигде не вижу манипуляцию с регистром IMEM_CONTROL?

 

2. Есть пример в C:\Program Files\Analog Devices\VisualDSP 4.5\Blackfin\Examples\ADSP-BF533 EZ-Kit Lite\Cache (ASM)

 

Вырвать оттуда cacheinit.asm и вставить в свой проект?

Почему там в опциях проекта вообще нет галочек ни про кэш, ни про SDRAM?

 

3. Где бы взять нормальный проект на C, чтобы и галочки были проставлены, и все работало?

 

В VDSP галочкой есть возможность автоматической генерации кода только для - кэш инструкций и кэш данных только в режиме Write-Back

Таких примеров полно в Examples. Тот же lwip

Хотя с кэшем данных уже нужно думать - поскольку любые буфера ввода-вывода DMA и вообще волатильные данные/регистры

должны руками быть выведены из областей кеширования - для этого нужно задать сохранение файла cplbtab.c для кустомизации - и его нужно

править руками.

 

Write-Through кеширование управляется (программируется) только руками, а не галочками (точно не знаю, но мне кажется, что это верно также и для gcc)

 

Есть примеры настоящего программирования кеш руками например в проекте Application EE-234 про T1/E1

http://www.analog.com/en/embedded-processi...rces/index.html

Share this post


Link to post
Share on other sites
В VDSP галочкой есть возможность автоматической генерации кода только для - кэш инструкций и кэш данных только в режиме Write-Back

т.е. выставив галочки как в пункте 1. я получу рабочий проект с Write-Back кэшем и ничего больше делать не надо?

 

попробую посмотреть EE-234, не знал про неё. спасибо!

Share this post


Link to post
Share on other sites
т.е. выставив галочки как в пункте 1. я получу рабочий проект с Write-Back кэшем и ничего больше делать не надо?

 

Автоматически сгенерированый cplbtab закеширует всю внешнюю память данных (и память инструкций - но это неважно, память инструкций это ROM,а ROM можно всяко кешировать).

Если во внешних пространствах нет буферов ввода/вывода DMA (в SDRAM) и регистров внешних устройств (в ASYNC) - то ничего делать не надо.

Достаточно включить галочками кеши в опциях проекта и галочкой же выбрать Write-Back

Если они таки есть - то нужно править сplbtab так, чтобы эти буфера не кешировались - кеш не может знать об обновлении волатильных буферов ничего, очевидно, и молча будет работать тупо неправильно. Поэтому эти области или не кешируются или программист должен сообщать кешу когда данные изменились (в обработчике DMA, например)

Share this post


Link to post
Share on other sites

Еще недопонимание: смотрю файлы вида *cplbtab*, где прописаны области памяти и режимы их защиты. В Блэкфине регистров ICPLB_DATAx и DCPLB_DATAx по 16 штук, однако там прописано гораздо больше областей памяти.

Куда они будут скопированы?

 

Все включение кэша, я так понял, происходит следущим образом.

1. объявляем переменную __cplb_ctrl и присваиваем ей значение. А компилятор магическим образом все сделает сам.

int __cplb_ctrl = CPLB_ENABLE_DCPLBS | CPLB_ENABLE_ICPLBS | CPLB_ENABLE_DCACHE;

2. описание областей памяти для CPLB берем стандартное из C:\Program Files\Analog Devices\VisualDSP 4.5\Blackfin\lib\src\libc\crt\cplbtabXXX.s

и меняем его под себя и добавляем этот файл в проект.

 

Все! все?!

 

 

Update:

Нашел! В хэлпе VDSP ищем описание функции cplb_init

The cplb_init routine is called by the default start-up code during processor initialization. It initializes the memory protection hardware and enables caches where requested, according to configuration data in two tables. It is not expected that cplb_init() is called from normal user code, nor is it expected that it is called more than once following each processor reset.

 

The routine’s behavior is controlled by the following data structures:

 

the __cplb_ctrl variable

the dcplbs_table[] array

the icplbs_table[] array

Initially, the routine tests the __cplb_ctrl variable to determine whether any of the caches have been enabled when the .ldf file has already mapped code or data into the corresponding cache area. If so, this would lead to corrupted code or data; therefore, the cplb_init routine aborts by jumping to infinite loops labelled with diagnostic symbols, for example, l1_code_cache_enabled_when_l1_used_for_code.

 

For the ADSP-BF535 processor, if caches are indicated by the __cplb_ctrl variable, then the routine invokes the cache_invalidate routine to first invalidate the caches, so that they are not enabled while containing random bits.

 

For each of the data and instruction CPLBs, if requested, the cplb_init routine copies from one to sixteen entries from the configuration tables, installing the tables’ entries into the corresponding registers. For example, icplbs_table[0] is copied into ICPLB_DATA0 and ICPLB_ADDR0, and dcplbs_table[0] is copied into DCPLB_DATA0 and DCPLB_ADDR0.

The copying is not verbatim; if caches are not requested by the __cplb_ctrl variable, cache bits are masked off the values written to the xCPLB_DATA n registers.

 

If a table has from one to sixteen entries, all of the table’s entries are installed, with any unused xCPLB_DATA n registers being marked as “Invalid”. If a table contains more entries, then only the first sixteen are installed. It is assumed that an appropriate exception handler was installed to process any CPLB Miss exceptions that occur. The cplb_hdr routine is an example of such an exception handler.

 

After installing the CPLB entries from the tables, the cplb_init routine modifies the IMEM_CONTROL and DMEM_CONTROL registers to enable the CPLBs and caches that were indicated. The cplb_init routine also sets the following DMEM_CONTROL bits:

 

The Data Cache Bank Select bit is set, according to whether CPLB_ENABLE_DCBS is set.

The DAG0/1 Port Preference bits are set to 1 and 0, respectively, to reduce memory access stalls.

т.е. где-то в стартап-коде есть функция cplb_init. Она проверяет, не проинициализировал ли кто __cplb_ctrl переменную, и если да, то копирует нужные таблицы в нужные регистры. Если их более 16, то копирует 16шт. Потом выставляет значения в IMEM_CONTROL и DMEM_CONTROL.

Share this post


Link to post
Share on other sites
Еще недопонимание: смотрю файлы вида *cplbtab*, где прописаны области памяти и режимы их защиты. В Блэкфине регистров ICPLB_DATAx и DCPLB_DATAx по 16 штук, однако там прописано гораздо больше областей памяти.

Куда они будут скопированы?

 

Все включение кэша, я так понял, происходит следущим образом.

1. объявляем переменную __cplb_ctrl и присваиваем ей значение. А компилятор магическим образом все сделает сам.

int __cplb_ctrl = CPLB_ENABLE_DCPLBS | CPLB_ENABLE_ICPLBS | CPLB_ENABLE_DCACHE;

2. описание областей памяти для CPLB берем стандартное из C:\Program Files\Analog Devices\VisualDSP 4.5\Blackfin\lib\src\libc\crt\cplbtabXXX.s

и меняем его под себя и добавляем этот файл в проект.

 

Все! все?!

 

не, не все :)

посмотрите стартап файл, там инициализация идет.

а когда проц обращается к памяти не влезшей в 16 пар регистров ICPLB_ и 16 пар DCPLB_, возникает исключение и происходит изменение по какому-то там закону этих регистров.

Т.е. та память, к которой обратился проц становится доступной, а какая-то нет.

Но я предпочитаю ручками это все делать, а из стартапа это все выкинуть.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this