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 内存高速缓存?
此致。
尊敬的 TI 专家:
当我 在 app_mem_linux_dma_heap.c 文件中使用 appMemCacheInv 和 appMemCacheWb 接口时、将出现如屏幕截图中所示的错误消息。 信息。
此致。
尊敬的 xie JC:
此存储器是否由 DMA buf 框架、 即 OpenVX 框架中的 TIvxMemAlloc 分配? 因为如果不是、则不能在该缓冲区上使用 DMA_BUF_IOCTL_SYNC。
另请注意、这必须由 A72分配。 我们不能在 mcu1_0上分配它而不能在 A72上使用、因为 DMA buf 无法管理外部分配的缓冲区。
此致、
Brijesh
尊敬的 Brijesh:
此内存是否由 DMA buf 框架( 即 OpenVX 框架中的 TIvxMemAlloc)分配? [/报价]我认为它不是 DMA 分配。 我们只是想确保 mcu1_0可以正确读取 a72写入 DDR 的数据。
如何确保写入 A72的存储器为缓存?
我不能使用接口 appMemCacheInv 和 appMemCacheWb?
Fullscreen123456789101112131415161718192021void 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);}}}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid 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。
此致。
尊敬的 xie JC:
好的、我看到它在 QNX 上受支持、但在 Linux 上不受支持。 因此、如果您不调用 cacheWb、您就不会 在 mcu1_0上看到内存更新?
此致、
Brijesh
尊敬的 Brijesh:
实际上、mcu1_0上的存储器已更新、但数据不符合预期。 在操作存储器时、MCU1_0称为接口高速缓存 Wb 和高速缓存 Inv。 我们要在 A72上调用类似的接口、以便在同一个块上运行。
此致。
尊敬的 xie JC:
但是、如果内存未映射为在 A72上缓存、则无需调用缓存操作。
现在、如果此存储器缓存在 mcu1_0上、则是、您需要在 mcu1_0上调用缓存操作。 如果 不想对 mcu1_0调用缓存操作、则 即使在 mcu1_0上也将此存储器映射为缓存。
此致、
Brijesh
尊敬的 Brijesh:
但如果内存未映射为 A72上的缓存,则无需调用缓存操作
是的、但现在我们需要 映射在 A72上缓存的存储器。我需要确保 A72将数据写入存储器、mcu1_ 0可以读取一致的数据。
我看到过 mcu1_0的代码、它们没有将存储器映射为缓存。
此致。
尊敬的 xie JC:
在 mcu1_0上、您能否检查 MPU 配置? MPU 将存储器映射为缓存或非缓存。
此致、
Brijesh
尊敬的 Brijesh:
从何处检查 MPU 配置? DT 或 SBL?
此致。
尊敬的 xie JC:
您在 mcu1_0上使用什么应用来检查此存储器?
请注意、SBL 不使用 DT 进行 MPU 配置。 它(在常规 PDK 应用中)有自己的方式来配置 MPU 配置。
此致、
Brijesh
一些提示:
SCTLR_EL1.UCI
设置为1) 尊敬的 xie JC:
此 TT 有任何进一步的更新?
此致、
Brijesh