想在AM3358的PRU上操作DDR和GPMC设备,GPMC挂一个SRAM,需要在PRU上读取SRAM数据然后搬到DDR上做缓存。
没有在官方上找到相关例子说明,在https://github.com/beagleboard/am335x_pru_package倒找到一些相关例子“PRU_memAccess_DDR_PRUsharedRAM”,但它使用的是比较旧的,譬如使用了接口(prussdrv_init和prussdrv_map_prumem等等),请问在最新的SDK中还能使用这样的例子吗?
Steven Liu1:
没太明白你要做的应用是怎样。
DDR是挂在L3上的,就是A8可以直接访问,SRAM是挂在GPMC总线上的,A8直接把数据从GPMC读出来放在DDR上就可以了。这里面再用PRU做什么?
PRU读取SRAM的数据的意思,是指PRU先去访问GPMC的总线,拿到数据,再搬运到DDR上吗?目的是什么呢?
然后你找到那个例子,应该指的是PRU内部的share RAM和DDR如何进行数据交换的方式,和SRAM没什么关系。
Steven Liu1:
类似问题:http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/124742.aspx
用另一个track就可以了。
tao li89:
我想使用AM3358的PRU来将挂在GPMC上的器件(在ARM看到的是一个SRAM存储器)的数据搬到分配的DDR内存空间上做缓存,但没找到官方这方面的例子
网上(https://github.com/beagleboard/am335x_pru_package)找到这样的例子“PRU_memAccess_DDR_PRUsharedRAM”但是比较旧的,因为里面用到了prussdrv_open(),prussdrv_map_prumem()这些接口,在app_loader文件夹下找到,但在最新的SDK上没有找不到这些接口和例子,不知还能不能在最新SDK上加载运行这些PRU固件?
tao li89:
回复 Steven Liu1:
你好,缘由是这样的:这里的SRAM其实是FPGA模拟出来的,FPGA有数据给ARM时,只能通过中断方式,在linux下直接使用外部中断方式来响应时间比较慢,所以我想到了使用PRU来进行实时捕获中断,此时将数据拷贝到DDR中,但由于PRU看到的是物理地址,所以我想在DDR最高位置留一段空间做FIFO,该空间Linux访问不了,不能让linux的进程破坏掉该空间或者读写该空间破坏掉linux进程数据,linux必须通过驱动才能访问这个最高区域,此时就可以在linux下通过异步读取FIFO来读取FPGA的数据。
Steven Liu1:
回复 tao li89:
你要的那个例子,没有直接这样的例程。
但是对于PRU loader的资料现在还是比较完善的,当然可以在processor SDK,做固件加载等事情,仔细读读developer guide中PRU-ICSS的使用部分吧:
http://processors.wiki.ti.com/index.php/PRU-ICSS_Getting_Started_Guide
更多的PRU的资料和培训教程在这里:
http://processors.wiki.ti.com/index.php/PRU-ICSS
Eggsy Pang:
回复 tao li89:
按照你的意思是说,你想要的这个过程,包括中断、’数据从GPMC到DDR的搬运过程,都是通过PRU来完成吗?ARM完全不介入?
如果不是,您所说的:FPGA有数据给ARM时,只能通过中断方式,在linux下直接使用外部中断方式来响应时间比较慢,这个结论未必正确。
因为如果用PRU来响应中断,你还是得把PRU的中断的信息告诉ARM,ARM再来处理数据搬运,整体的时间未必比linux下直接使用外部中断方式来响应时间快得多。
tao li89:
回复 Eggsy Pang:
嗯,我打算ARM完全不介入,PRU作为协处理器直接轮询引脚电平来检测FPGA的中断信号,然后数据从GPMC搬运到DDR的物理地址,ARM则主要跟那段DDR空间进行(通信)交互。
Eggsy Pang:
回复 tao li89:
可以参考这个link
http://processors.wiki.ti.com/index.php/PRU_Linux-based_Example_Code
GPMC不在PRU的constant table里面,DDR在PRU的constant table里面,估计PRU直接访问GPMC,速度没有ARM快,所以这点需要考量一下整体的速度。