Официальный форум СВД Встраиваемые Системы
23 Апрель, 2024, 10:56:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: QNX 6.5 @ Xilinx Zynq-7000( 2х arm cortex a9) , подозрительная работа libcache  (Прочитано 1755 раз)
Neekeetos
Интересующийся

Сообщений: 1


« : 17 Ноябрь, 2015, 20:10:55 »

Добрый день ,

Занимаясь разработкой драйвера под вышеуказанную платформу наткнулся на занятную проблему, связанную с работой кеша в ос. В устройстве создан источник данных , доставляющий через DMA данные непосредственно в оперативную память устройства. Для работы с этим было создано два приложения, одно из них - драйвер, создает область разделяемой памяти и управляет работой аппаратного модуля и DMA, а второе является клиентом , использующим данные по мере поступления. Во избежании копирования был создан блок разделяемой памяти с флагами SHMCTL_PHYS | SHMCTL_GLOBAL | SHMCTL_ANON ( непрерывной, кешируемой , имеющей во всех процессах одинаковое отображение на виртуальные адреса ), в расчете на то, что после записи данных можно будет сделать cache invalidate, и использовать данные без задержек.  Однако данная реализация оказалась проблемной, функция CACHE_INVAL библиотеки libcache занимает значительную часть процессорного времени, примерно аналогичное время тратится если запретить кеширование в разделяемой памяти и вычитывать данные с помощью memcpy... (Размер блока данных порядка 1,5МБ)   
 Хотелось бы узнать нормально ли такое поведение libcache, возможно кто сталкивался с подобным? Возможно сама схема , которую я выбрал является не совсем корректной и есть более "прямой" в плане реализации вариант ?

( Прикрепляю две картинки с фото происходящего с точки зрения системного профайлера, а также соответствующие им kev. )
( точнее они доступны по ссылке https://drive.google.com/folderview?id=0B6ejWgMiaZIvNm1jSl9fWllERjQ&usp=sharing , в сообщение не влазят)
Записан
Владимир Махилёв
Сотрудник СВД ВС
Старожил

Сообщений: 704



WWW
« Ответ #1 : 18 Ноябрь, 2015, 14:28:42 »

Здравствуйте.

Обратите внимание на внутренний движок DMA самого Zynq. Стоит почитать документацию, возможно у него есть режим аппаратного управления когерентностью кэшей, что теоретически может помочь повысить скорость обмена и избавит от необходимости ручного управления.

По libcache -  проверьте значения которые устанавливаются в структуру cache_ctrl, особенно поле cache_flush_rate после вызова cache_init().
Для ARM должны вызываться напрямую callout'ы управления кэшем из startup'а. Непосредственно программного кода там очень немного. Сколько по времени должна отрабатывать аппаратура при таких вызовах сказать пока не могу, таких замеров мы не проводили.

Подготовьте пожалуйста максимально упрощенный пример в котором просто мапируйте память из ОЗУ с помощью mmap() с каким-либо выровненным адресом, например кратным 1 Мб.  Затем вызывайте принудительную синхронизацию с помощью CACHE_FLUSH()/CACHE_INVAL().
Замер времени вызовов синхронизации стоит произвести с помощью снятия меток ClockCycles() до и после вызова, не забыв привязать его к конкретному процессорному ядру с помощью ThreadCtl(_NTO_TCTL_RUNMASK, (void *)run_mask );
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 06 Апрель, 2024, 05:55:49