Сделал так:
CODE
#define MK_MVA(addr) ((unsigned long) (addr) & ~ 0x1fUL)
void arm_hardware_invalidate(const void * base, size_t size)
{
enum { CACHEROWSOZE = 32 };
unsigned long len = (size + (CACHEROWSOZE - 1)) / CACHEROWSOZE + (((unsigned long) base & (CACHEROWSOZE - 1)) != 0);
unsigned long mva = MK_MVA(base);
while (len --)
{
CP15_invalidateCacheSingleEntryMVA(mva); // очистить кэш
mva += CACHEROWSOZE;
}
}
void arm_hardware_flush(const void * base, size_t size)
{
enum { CACHEROWSOZE = 32 };
unsigned long len = (size + (CACHEROWSOZE - 1)) / CACHEROWSOZE + (((unsigned long) base & (CACHEROWSOZE - 1)) != 0);
unsigned long mva = MK_MVA(base);
while (len --)
{
CP15_cleanDCacheEntryMVA(mva); // записать буфер, кэш продолжает хранить
mva += CACHEROWSOZE;
}
}
void arm_hardware_flush_invalidate(const void * base, size_t size)
{
enum { CACHEROWSOZE = 32 };
unsigned long len = (size + (CACHEROWSOZE - 1)) / CACHEROWSOZE + (((unsigned long) base & (CACHEROWSOZE - 1)) != 0);
unsigned long mva = MK_MVA(base);
while (len --)
{
CP15_cleanInvalidateDCacheEntryMVA(mva); // записать буфер, очистить кэш
mva += CACHEROWSOZE;
}
}
Гложет мысль - выгонять кэш в 3-х килобайтном буфере может быть накладно по ресурсам? 100 вызовов обращения к CP15...