尊敬的 TI 专家:
当我们使用共享存储器来读取和写入数据时、我们会发现写入 A72中的数据与 MCU1_0读取的数据不一致。
我们认为它应该是由存储器一致性问题引起的。 请告诉我们如何 在 A72内核上设置 DDR 内存高速缓存?
此致。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的 TI 专家:
当我们使用共享存储器来读取和写入数据时、我们会发现写入 A72中的数据与 MCU1_0读取的数据不一致。
我们认为它应该是由存储器一致性问题引起的。 请告诉我们如何 在 A72内核上设置 DDR 内存高速缓存?
此致。
尊敬的 Brijesh:
此内存是否由 DMA buf 框架( 即 OpenVX 框架中的 TIvxMemAlloc)分配? [/报价]我认为它不是 DMA 分配。 我们只是想确保 mcu1_0可以正确读取 a72写入 DDR 的数据。
如何确保写入 A72的存储器为缓存?
我不能使用接口 appMemCacheInv 和 appMemCacheWb?
void appMemCacheInv(void *ptr, uint32_t size) { int32_t status = 0; uint32_t offset = 0; uint32_t dmaBufFd = appMemGetDmaBufFd(ptr, &offset); struct dma_buf_sync sync_flags; sync_flags.flags = DMA_BUF_SYNC_RW; if(dmaBufFd > 0) { status = ioctl(dmaBufFd, DMA_BUF_IOCTL_SYNC, &sync_flags); if(status < 0) { printf("MEM: ERROR: DMA_BUF_IOCTL_SYNC failed for appMemCacheInv(%p, %d) !!!\n", ptr, size ); } } } void appMemCacheWb(void *ptr, uint32_t size) { int32_t status = 0; uint32_t offset = 0; uint32_t dmaBufFd = appMemGetDmaBufFd(ptr, &offset); struct dma_buf_sync sync_flags; sync_flags.flags = DMA_BUF_SYNC_RW | DMA_BUF_SYNC_END; if(dmaBufFd > 0) { status = ioctl(dmaBufFd, DMA_BUF_IOCTL_SYNC, &sync_flags); if(status < 0) { printf("MEM: ERROR: DMA_BUF_IOCTL_SYNC failed for appMemCacheWb(%p, %d) !!!\n", ptr, size ); } } }此致。
尊敬的 xie JC:
我不是指 DMA 分配。 我是指 dma-buf 框架。 此框架在 Vision Apps 中用于分配和管理缓冲区。 此框架从内存的512MB 独立分区中分配缓冲区。 不可以、 如果未 使用 TIvxMemAlloc API 分配存储器、则我们无法使用 appMemCacheInv 和 appMemCacheWb API。 首先、您能帮助我了解如何分配存储器吗?
此致、
Brijesh
您好,Brijesh V ä,
很抱歉 误解了您的意思。
实际上、我调用了 appMemMap 接口以将物理地址替换为虚拟地址。
#define NOR_TX_FIFO_ADDR (0xFB100400)
#define NOR_RX_FIFO_ADDR (0xFB102400)
void Update_Msg_Init_Nor(void)
{
UpdateRxFifoNor = (UpdateFifo_Nor_t *) NOR_RX_FIFO_ADDR;
UpdateTxFifoNor = (UpdateFifo_Nor_t *) NOR_TX_FIFO_ADDR;
UpdateRxFifoNor = appMemMap(UpdateRxFifoNor, NOR_FIFO_CACHE_SIZE);
UpdateTxFifoNor = appMemMap(UpdateTxFifoNor, NOR_FIFO_CACHE_SIZE);
initQue(&(UpdateTxFifoNor->que), NOR_FIFO_DEPTH);
initQue(&(UpdateRxFifoNor->que), NOR_FIFO_DEPTH);
appMemCacheWb(UpdateTxFifoNor, NOR_FIFO_CACHE_SIZE);
appMemCacheWb(UpdateRxFifoNor, NOR_FIFO_CACHE_SIZE);
}
void *appMemMap(void *phys_ptr, uint32_t size)
{
uint32_t pageSize = getpagesize ();
uintptr_t taddr;
uint32_t tsize;
void *virt_ptr = NULL;
int32_t status = 0;
static int dev_mem_fd = -1;
if(dev_mem_fd == -1)
{
dev_mem_fd = open("/dev/mem",O_RDWR|O_SYNC);
if(dev_mem_fd < 0)
{
printf("APP_LOG: ERROR: Unable to open /dev/mem !!!\n");
status = -1;
}
}
if(status==0 && dev_mem_fd >= 0)
{#ifdef APP_LOG_DEBUG
printf("APP_LOG: Mapping %p ...\n", phys_ptr);
#endif
/* Mapping this physical address to linux user space */
taddr = (uintptr_t)phys_ptr;
tsize = size;
/* Align the physical address to page boundary */
tsize = appAlign(tsize + (taddr % pageSize), pageSize);
taddr = appFloor(taddr, pageSize);
virt_ptr = mmap(0, tsize,
(PROT_READ | PROT_WRITE),
(MAP_SHARED), dev_mem_fd, taddr);
if(virt_ptr==MAP_FAILED)
{
virt_ptr = NULL;
}
else
{ virt_ptr = (void*)((uintptr_t)virt_ptr + ((uintptr_t)phys_ptr % pageSize));
}
#ifdef APP_LOG_DEBUG
printf("APP_LOG: Mapped %p -> %p of size %d bytes \n", phys_ptr, virt_ptr, size);
#endif
}
if(virt_ptr==NULL)
{
printf("APP_LOG: ERROR: Unable to map memory @ %p of size %d bytes !!!\n", phys_ptr, size);
}
return virt_ptr;
}
此致。
尊敬的 xie JC:
分配缓冲区的地址不是使用 dma-buf 分配器管理的、因此我们 无法加载 使用 appMemCacheWb 和 appMemCacheInv API。
我看到您已 使用 O_SYNC 标志打开/dev/mem 器件。 现在、在映射 存储器时、您是否 还可以添加 PROT_NoCache 标志、如下所示? 完成此更改后、无需调用 Cache API。
Virt_ptr = mmap (0、tsize、
(PROT_READ | PROT_WRITE | PROT_NoCache )、
(map_shared)、dev_mem_fd、taddr);
此致、
Brijesh
尊敬的 Brijesh:
我看到您已 使用 O_SYNC 标志打开/dev/mem 设备。 现在、在映射 存储器时、您是否 还可以添加 PROT_NoCache 标志、如下所示? 完成此更改后、无需调用 Cache API。 [/报价]我将尝试这种改变,并给你反馈。但我仍然有一些困惑。
1) PROT_NoCache 标志 指示存储器是高速缓存还是 NOCache?
2) QNX 的系统将使用 PROT_NoCache 标志, Linux 是否也可以使用该标志?My process is run on linux8.4。
此致。
尊敬的 Brijesh:
但如果内存未映射为 A72上的缓存,则无需调用缓存操作
是的、但现在我们需要 映射在 A72上缓存的存储器。我需要确保 A72将数据写入存储器、mcu1_ 0可以读取一致的数据。
我看到过 mcu1_0的代码、它们没有将存储器映射为缓存。
此致。
一些提示:
SCTLR_EL1.UCI 设置为1)