ZYNQ中,基于双核通信的共享内存,可以选择DDR或者OCM。我当前能够实现Linux+裸核的双核通信,采用的是OCM3,也就是最后的64KB。由于我想实现全双工的数据交互,所以想再开一片共享内存。第一片共享内存是OCM3,现在我想采用DDR的一部分来作为共享内存。在DDR的分配上,我给Linux核384MB,裸核120MB,DDR共享内存4MB【内核设备树中设置了memory是<0x0,0x17FFFFFF>。在裸核端的lscript.ld中设置的ps7_ddr_0 Base_Address[0x18000000] Size[0x77FFFFF],然后#define DDR_SHARE 0x1FA00000 占据4mb。】。我严格审视过,以上地址完全相互独立。虽然我是512MB的7010,但是我这么分配的话原则上不会有问题才对。DDR不行我就试了下开头的192KB的OCM,仍旧显示报错: Failed to map shared memory,probe of zynq_amp failed with error -12。报错的代码部分是 - static int zynq_amp_probe(struct platform_device *pdev)
- {
- // 将共享内存物理地址映射到虚拟地址
- ocm_phy_addr = ioremap(OCM_PHYS_ADDR, OCM_PHYS_SIZE);
- ddr_phy_addr = ioremap(DDR_PHYS_ADDR, DDR_PHYS_SIZE);
- if ((!ocm_phy_addr) || (!ddr_phy_addr))
- // if (!ddr_phy_addr)
- {
- printk(KERN_ALERT "Failed to map shared memory\n"); // 映射失败,打印错误信息
- return -ENOMEM; // 返回内存不足错误
- }
复制代码 于是我在linux中查看了实际的内存占据:
- root@LinuxICOS:~# dmesg | grep Memory
- Memory policy: Data cache writealloc
- Memory: 493128K/524288K available (6144K kernel code, 195K rwdata, 1808K rodata, 1024K init, 130K bss, 14776K reserved, 16384K cma-reserved, 0K highmem)
复制代码发现实际占据498MB。我是按照教程来搭建的双核系统,不明白为什么这里是498MB,明明设备树已经规定了。
求助大佬指点一下
|