Нужно ли делать кэш недействительным перед чтением из кадрового буфера?
Я пытаюсь читать с /dev/fb0
на машине Linux.
я просто open("/dev/fb0", O_RDWR)
, затем mmap
, затем memcpy
из сопоставленного указателя.
Все выглядит хорошо, за исключением того, что верхний правый угол изображения, который я получаю, взят из предыдущего кадра.
Это похоже на проблему когерентности кэша. В частности, я использую его на чипе ARM, где GPU и CPU разделяют память.
Это правда? Является ли обычной практикой аннулирование кэша после mmap
в кадр кадра?
Если мне нужно аннулировать память, какой вызов API я должен использовать?
Я пробую Memory.h из SDK от TI, но есть ли более стандартная альтернатива /Linux/Posix?
1 ответ
Убедитесь, что GPU завершил запись данных в буфер перед memcpy(). В этом случае вам не нужно аннулировать кеш, поскольку кешированный буфер не будет кэшироваться. Если вы подозреваете, что копируемые данные кэшируются, вы можете использовать следующий API для аннулирования кэша:
outer_cache.inv_range()
Смотрите заголовочный файл arch / arm / include / asm / outercache.h.