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.

AM5728: AM5728的配置

Part Number: AM5728

您好,

我的GPMC内存空间,用单独的EDMA访问,DSP可以读写成功0x1000000区域。

现在把GPMC读写,整合到我的应用程序里,用到了CMEM,为了通过DSP读取数据上传到ARM,(但没有映射0x1000000的64MB区域位Share memory)

用同样的EDMA再做读取GPMC动作,不成功,单独的内存读取,*(unsigned int*)(0x1000000), 也不行,

唯独,只有在ARM端 用devmem2 0x1000000命令,是可以读取访问。

想咨询一下,是不是这种情况下,我也得把GPMC的空间初始化成CMEM,那样的话,DSP才可以也读写GPMC?

另外,CMEM,分配好了后, 是不是只有memssage put get后,谁拥有这块内存的,谁才可以访问?还是ARM,DSP都可以访问,不论谁拥有内存区域?

谢谢!

董峰

  • 您好,

    在这种情况下,您需要确保GPMC的空间在DSP和ARM之间是可访问的。如果您的应用程序使用CMEM来管理内存,并且希望DSP和ARM都可以访问GPMC的空间,那么您需要确保GPMC的空间在CMEM中是可用的。

    您可以通过CMEM的API来分配一块内存区域,并将GPMC的空间初始化为这块内存区域。这样,DSP和ARM都可以通过CMEM来访问GPMC的空间。

    关于CMEM的使用,一般情况下,分配好的内存区域在message put/get之后,只有拥有这块内存的一方才能访问。这意味着如果ARM分配了一块内存区域,并且通过message put将其发送给DSP,那么只有DSP才能访问这块内存区域。同样地,如果DSP分配了一块内存区域并通过message put将其发送给ARM,那么只有ARM才能访问这块内存区域。

    如果您希望ARM和DSP都能访问某块内存区域,您可以考虑使用共享内存机制,比如将内存区域初始化为共享内存,这样ARM和DSP都可以访问这块内存区域。但是在这种情况下,您需要特别注意对内存的访问控制,以避免出现竞争条件和数据一致性问题。

  • 谢谢Gary,

    我现在是使用CMEM来管理内存, ARM通过DTS初始化GPMC,所以是ARM拥有GPMC空间,对吧?

    要是只需要DSP访问GPMC,CMEM又不分配内存区域给GPMC,是不是只能DSP自己初始化GPMC,自己访问GPMC?

  • Gary,

    我在DTS里加入0x1000000,as GPMC reserved-memory,ARM linux下,执行如下命令,不能成功。

    modprobe cmemk phys_start=0xa0000000 phys_end=0xac000000 pools=24x8388608 phys_start_1=0x01000000 phys_end_1=0x01000500 pools_1=1x1024,1x256

    问题1:DTS reserved-memory 跟 “modprobe cmemk”是二选一呢,还是先后串行执行?

    问题2:就是“modprobe cmemk”命令,create两个不同地址的区域的,命令是怎样的?如上,我试过,不行。

    问题3:CMEM跟共享内存机制,工作的performance,哪个更好些,前提是访问有序,数据一致?

    谢谢!

  • 我试过几种命令组合,本意是定义两块CMEM,一块是ARM/DSP share用,一块是DSP访问GPMC,(不知道合理不合理)。

    我的应用本意是,DSP独享GPMC读写(配置在ARM DTS, 曾尝试在DSP配置GPMC寄存器,map to virtual,失败)

    之后,数据写入CMEM 共享内存,ARM来读取。不知道这样有什么问题,求建议,谢谢!

    root@xivi:/lib/firmware# pkill ti-mctd
    root@xivi:/lib/firmware# rmmod cmemk
    [ 315.523888] cmemk unregistered
    root@xivi:/lib/firmware# modprobe cmemk phys_start=0xa0000000 phys_end=0xac000000 pools=24x8388608 phys_start_1=0x01000000 phys_end_1=0x01100000 pools_1=2x1024
    [ 318.506053] CMEMK module: reference Linux version 4.9.65
    [ 318.512165] allocated heap buffer 0x1000000 of size 0xfe000

  • 您好,

    是的,一般情况下,如果你使用CMEM来管理内存并且ARM通过DTS(设备树)初始化了GPMC(General-Purpose Memory Controller),那么ARM会拥有对GPMC空间的访问权限。这意味着ARM可以控制GPMC并分配内存区域给GPMC。如果你只需要DSP访问GPMC,而CMEM并没有分配内存区域给GPMC,那么你可能需要DSP自己初始化GPMC并自己访问GPMC。你需要确保在DSP代码中正确地初始化GPMC并进行内存访问,以确保正确的数据传输和存储。这可能需要对DSP的硬件访问和初始化有一定的了解和技能。

  • 问题1:DTS reserved-memory 跟 “modprobe cmemk”是二选一呢,还是先后串行执行?

    DTS reserved-memory 和 "modprobe cmemk" 不是二选一的关系,而是可以一起使用的。DTS reserved-memory 可以在设备树中指定内存区域的分配,而 "modprobe cmemk" 可以在运行时动态地分配内存区域。如果你在设备树中指定了内存区域的分配,那么 "modprobe cmemk" 会使用设备树中指定的内存区域,如果没有指定,则会使用默认的内存区域。

    问题2:就是“modprobe cmemk”命令,create两个不同地址的区域的,命令是怎样的?如上,我试过,不行。

    如果你想在 "modprobe cmemk" 命令中创建两个不同地址的内存区域,你可以使用以下命令:

    modprobe cmemk phys_start=0xa0000000 phys_end=0xac000000 pools=24x8388608 phys_start_1=0x01000000 phys_end_1=0x01000500 pools_1=1x1024,1x256

    其中,phys_start_1 和 phys_end_1 指定了第二个内存区域的起始地址和结束地址,pools_1 指定了第二个内存区域的内存池大小和数量。

    问题3:CMEM跟共享内存机制,工作的performance,哪个更好些,前提是访问有序,数据一致?

    CMEM 和共享内存机制都可以用于在不同的处理器之间共享内存。它们的性能取决于具体的应用场景和实现方式。如果访问有序,数据一致,那么两种机制都可以提供高效的内存共享。CMEM 通常用于在 DSP 和 ARM 之间共享内存,而共享内存机制可以在多个 ARM 处理器之间共享内存。

  • 您好,

    这个设想是合理的,并且可以实现。在这种情况下,你需要确保以下几点:

    1. DSP独享GPMC读写:你需要在ARM的设备树中配置GPMC,确保ARM不会使用GPMC,而是留给DSP独享。同时,你需要在DSP代码中正确配置GPMC寄存器,确保DSP可以独享GPMC进行读写操作。

    2. 数据写入CMEM共享内存:确保DSP可以将数据写入CMEM共享内存,这可能需要在DSP代码中进行特定的内存映射和写入操作。

    3. ARM读取共享内存:ARM需要能够访问CMEM共享内存,确保ARM可以正确读取DSP写入的数据。

    根据你提供的命令输出,看起来你已经成功加载了CMEMK模块并分配了两块不同的CMEM内存区域。接下来,你需要确保DSP和ARM的代码正确实现了上述三点,以实现你的应用场景。

    如果你在DSP配置GPMC寄存器的过程中遇到了问题,可能需要进一步调试和分析。同样,确保ARM可以正确读取CMEM共享内存中的数据也是非常重要的。

    总的来说,你的设想是合理的,但需要确保在硬件和软件层面都正确实现了相应的配置和操作。

  • 您好Gary,

    谢谢您的回复,我基本理解,但是我还有几个问题,想知道答案。

    https://e2echina.ti.com/support/processors/f/processors-forum/790388/am5728-am5728-cmem-gpmc-dsp

    我在以上连接提了几个问题,这个ticket,我会关掉,谢谢!

  • 好的,不客气,我将关闭此贴,谢谢!