Part Number:AM5718
TI的工程师,你们好!
我在使用共享内存API msg->dataIn = CMEM_allocPool(CMEM_getPool(PAYLOADSIZE), &cmemAttrs);申请共享内存时,第一次调用没有问题,但是第二次调用就无法分配了,运行结果如下:
<– App_create:
–> App_exec:
CMEM_init success
user: 0xa9bbf000 phys: 0xa0000000 //第一次分配成功
CMEM Error: allocPool: ioctl CMEM_IOCALLOC failed from pool 0: -1 //第二次分配失败
CMEM_alloc() failed (returned NULL)
并且运行了:
pkill ti-mctd
rmmod cmemk
modprobe cmemk phys_start=0xa0000000 phys_end=0xa0100000 pools=2×524288
使用cat /proc/cmem看到的仍然是默认的配置,但是/sys/module/cmemk/parameters/下的各个文件都已经被修改,cat /proc/cmem结果如下:
Block 0: Pool 0: 1 bufs size 0xc000000 (0xc000000 requested)
Pool 0 busy bufs:
Pool 0 free bufs:
id 0: phys addr 0xa0000000
问题:
1、是否运行n次CMEM_allocPool就需要pools分为n个区间?
2、除了修改dtsi的方式,是否modprobe没有作用?
参考帖子:
https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_DSP_linux-am5728-cmem-error
谢谢!
Nancy Wang:
hongyou lu 说:1、是否运行n次CMEM_allocPool就需要pools分为n个区间?
我需要确认一下,可以先尝试分区间。
hongyou lu 说:2、除了修改dtsi的方式,是否modprobe没有作用?
参考以下链接看一下:
https://software-dl.ti.com/processor-sdk-linux/esd/docs/06_03_00_106/linux/Foundational_Components_CMEM.html
https://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/linuxutils/latest/docs/html/cmem_8h.html
,
hongyou lu:
谢谢你的回复,Nancy。
这两个链接我都看过,按照上面的操作并没有实现分区间,目前来说只能通过修改dtsi文件了,但这种方式相对来说由于要修改内核的内容会比较麻烦。
我找到另外一种方式,只申请一次共享内存,在多个进程中使用CMEM_registerAlloc重新映射,可实现自定义共享内存区间的规则。
,
Nancy Wang:
好的,感谢分享!