嵌入式开发者社区

标题: Resource_physToVirt失败问题 [打印本页]

作者: beying    时间: 2019-8-9 15:08
标题: Resource_physToVirt失败问题
arm两个线程分别open两个dsp的消息队列,两个线程各自申请一个共享内存,然后各自将共享内存地址发消息给dsp(线程1将cmem1地址发给dsp1;线程2将cmem2地址发给dsp2),dsp调用Resource_physToVirt做地址转换,始终出现某个dsp调用Resource_physToVirt失败(dsp1和dsp2都有失败可能),我排查了很久无果,请教研发这个问题的定位排查思路,估计是哪里配置出错了?

代码和我之前给梁工的代码一致。
作者: 梁淑怡-Tronlong    时间: 2019-8-12 09:49
您好,
1.由于测试方法不同,这边无法编译您的程序测试,所以这边基于ex02_message的例程修改了一个双线程程序测试;
2.关于启动问题,这边测试了近500次软重启,没有出现启动卡死的问题;
[attach]5447[/attach]
3.请联系技术支持拿取测试软件包对比测试,谢谢。



作者: beying    时间: 2019-8-12 11:19
梁工,这个帖子是问Resource_physToVirt失败问题,你回的是另一个启动卡死的问题。
作者: 梁淑怡-Tronlong    时间: 2019-8-12 17:22
beying 发表于 2019-8-12 11:19
梁工,这个帖子是问Resource_physToVirt失败问题,你回的是另一个启动卡死的问题。 ...

失败是指卡死还是转换不成功?工程师修改的基于ex02_message的双线程案例没有此问题,您可以对比一下看看。
作者: beying    时间: 2019-8-12 17:42
失败的意思是函数从返回值判断函数执行失败了,
见如下代码:
iRet = Resource_physToVirt(v_pmsg->dataInPhys, &virtualAddrIn);
    if( iRet != Resource_S_SUCCESS)

“工程师修改的基于ex02_message的双线程案例没有此问题”,你给的示例代码中就没用到Resource_physToVirt函数,肯定不会有此问题。
作者: 12345    时间: 2019-8-13 18:40
beying 发表于 2019-8-12 17:42
失败的意思是函数从返回值判断函数执行失败了,
见如下代码:
iRet = Resource_physToVirt(v_pmsg->dataInP ...

你好,    Resource_physToVirt只是实现了物理地址到虚拟地址的转换关系,建议先确认内存映射表中是否有存在对应正确的物理至虚拟的映射关系。
    文件系统内查看内存映射关系的命令可参考:
    DSP1:(默认配置mmu1的配置与mmu2的配置是一样的)
cat /sys/kernel/debug/omap_iommu/40d01000.mmu/pagetable
cat /sys/kernel/debug/omap_iommu/40d02000.mmu/pagetable

DSP2:(默认配置mmu1的配置与mmu2的配置是一样的)
cat /sys/kernel/debug/omap_iommu/41501000.mmu/pagetable
cat /sys/kernel/debug/omap_iommu/41502000.mmu/pagetable
[attach]5469[/attach]


作者: beying    时间: 2019-8-14 16:35
非常感谢12345,我顺着你的思路去排查,发现:
arm线程1调用CMEM_allocPool的地址0xad000000  然后CMEM_getPhys转换为0xba600000传给dsp1 dsp1调用Resource_physToVirt得到0x80300000
arm线程2调用CMEM_allocPool的地址0xa7600000  然后CMEM_getPhys转换为0xb4c00000传给dsp1 dsp1调用Resource_physToVirt失败
然后查你说的映射表,找失败的地址没找到
root@AM57xx-Tronlong:~/bin# cat /sys/kernel/debug/omap_iommu/40d01000.mmu/pagetable | grep 0xb4c
root@AM57xx-Tronlong:~/bin# cat /sys/kernel/debug/omap_iommu/40d02000.mmu/pagetable | grep 0xb4c
root@AM57xx-Tronlong:~/bin# cat /sys/kernel/debug/omap_iommu/41501000.mmu/pagetable | grep 0xb4c
root@AM57xx-Tronlong:~/bin# cat /sys/kernel/debug/omap_iommu/41502000.mmu/pagetable | grep 0xb4c
找成功的地址
root@AM57xx-Tronlong:~/bin# cat /sys/kernel/debug/omap_iommu/41501000.mmu/pagetable | grep 0xba600
1: 0x80300000 0xba600002

然后我 cat /proc/cmem
Block 0: Pool 0: 2 bufs size 0x5a00000 (0x5a00000 requested)

Pool 0 busy bufs:

Pool 0 free bufs:
id 0: phys addr 0xba600000
id 1: phys addr 0xb4c00000

说明CMEM_allocPool分配这两个地址是从共享内存配置来的,像是分配就分配出问题了,看来只有改分配了。
之前分配的是0x5a00000 (分了2个90M的cmem)

现在改为0x1400000  20M
重启(第一次重启又狂打日志卡死)之后
root@AM57xx-Tronlong:/home/ByBox# cat /proc/cmem

Block 0: Pool 0: 2 bufs size 0x1400000 (0x1400000 requested)

Pool 0 busy bufs:

Pool 0 free bufs:
id 0: phys addr 0xbec00000
id 1: phys addr 0xbd800000

0xbec00000和0xbd800000我查了pagetable,找得到
root@AM57xx-Tronlong:~# cat /sys/kernel/debug/omap_iommu/41501000.mmu/pagetable | grep 0xbec
1: 0x84900000 0xbec00002
root@AM57xx-Tronlong:~# cat /sys/kernel/debug/omap_iommu/41501000.mmu/pagetable | grep 0xbd8
1: 0x83500000 0xbd800002
这下心里感觉要成功了。

运行程序,果然Resource_physToVirt不报错了,并且成功转换为0x83500000和0x84900000。

这里有点疑问再请教下12345: CMEM第一次分了2个90M是我分大了,超出范围了吧?CMEM最大能分多少M?
作者: 12345    时间: 2019-8-15 08:34
beying 发表于 2019-8-14 16:35
非常感谢12345,我顺着你的思路去排查,发现:
arm线程1调用CMEM_allocPool的地址0xad000000  然后CMEM_get ...

你好,
      1.默认内核配置应该是一个192M的共享区间,您这边应该是有改动过默认的配置。请确认下内核设备树配置是否正确
         arch/arm/boot/dts/am57xx-evm-cmem.dtsi
[attach]5484[/attach]

     2.对于DSP而言,内存映射默认是依赖于IPC工程中的src/dsp1/rsc_table_dsp1.h配置,请确认下该文件是否配置正确。
[attach]5485[/attach]

作者: 山药蛋子    时间: 2021-5-31 18:03
请问楼主是修改哪个地方,我也遇到了相同的问题




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4