一,CPU0和CPU1上分别跑了自己的程序。这篇文章中我们需要让两个CPU之间能够进行通信,传递数据可以采用DDR或OCM。OCM是一个单端口的存储空间,但是你可以利用ZynqSoC的DMA并行访问OCM其他的交换资源模拟出一个双端口的存储空间。要实现这个机制,访问必须是128位数据对齐,不管在任何情况下都要满足。这个方式能够实现较高的吞吐量,因为DMA可以实现高效的传输大量数据。

二,Key features of the OCM include:

• On-chip 256 KB RAM
• On-chip 128 KB BootROM (not user visible)
• Two AXI 3.0, 64-bit slave interfaces
• Low latency path for CPU/ACP reads to OCM (CPU at 667 MHz – minimum 23 cycles)
• Round-robin pre-arbitration between read and write AXI channels on OCM-interconnect port
(non-CPU port)
• Fixed priority arbitration between the CPU/ACP (via SCU) and OCM-interconnect AXI ports
• Supports full AXI 64-bit bandwidth of simultaneous read and write commands (with optimal
alignment restrictions) on the OCM interconnect port
• Random access supported to RAM from AXI masters

• TrustZone support for on-chip RAM with 4 KB page granularity
• Flexible address mapping capability
• RAM byte-wise parity generation, checking, and interrupt support
• Support for the following non-AXI features on the CPU (SCU) port:
Zero line fill,Pre-fetch hint,Early BRESP,Speculative line pre-fetch

OCM共256KB按照64KB分为4块,其中前三块在SDK中表述为RAM0占192KB处于地址空间的最开头和DDR共用地址空间,最后一块64KB处于地址空间的最后。OCM可以组织成128位的字存储空间,根据PS部分定义的地址空间OCM存储空间可以划分为四块64k字节的不同位置的存储区域。初始配置是将前三个64k字节的存储块映射到PS部分起始的地址空间,最后一个64K字节存储块映射到PS部分的末端的地址空间,你可以查看下图中链接文件的地址空间的定义(上图为Core 0的地址空间映射,下图为Core 1 的地址空间映射):

ps7_ram_0与ps7_ram_1映射到内存的区域0和区域1,不是Core 0 与Core 1的地址空间。

OCM存储空间的地址映射图是能够重写规划的,所以是完全连续的,可以映射到地址空间的末端。可以利用系统级控制寄存器和OCM配置寄存器,通过设置合适的RAM 高位的每个比特位的值完成对OCM存储地址映射空间的配置。

初始化寄存器设置:

寄存器配置:

三,以下片上资源可以访问OCM:
1.通过SCU(监听控制单元)片上的两个ARM Cortex-A9 MPcore处理器都可以访问OCM
2.通过SCU(监听控制单元)PL(可编程逻辑)部分利用AXI ACP接口可以访问OCM
3.通过OCM interconnect结构PL部分利用AXI High Performance接口可以访问OCM
4.通过OCM interconnect结构,Central Interconnect可以访问OCM

四,SDK双核配置

1,在CPU0和CPU1的C源文件中均在相同的地址定义OCM的8字节为显示缓冲区:

#define DISPLAY_BUF             ((volatile unsigned char *)(0xFFFF0000U))
//显示缓冲区按字节访问限定为8字节该定义应在两个CPU的源文件中均定义

2,CPU0中唤醒CPU1的地址定义

#define CPU1STARTADR            0x20000000U//CPU1的DDR起始地址从512MB字节开始
#define CPU1_START_UP_REG       0xFFFFFFF0U//用来存储上面地址的指针地址

3,CPU0中禁止OCM的Cache属性和唤醒CPU1的代码

//Disable cache on OCM
    Xil_SetTlbAttributes(0xFFFF0000,0x14de2);  
    // S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
    print("CPU0: writing startaddress for cpu1\n\r");
    Xil_Out32(CPU1_START_UP_REG, CPU1STARTADR);
    //该函数需包含xil_io.h
    //CPU1STARTADR=0xFFFFFFF0, CPU1STARTADR=0x20000000);
    dmb(); //waits until write has finished
    print("CPU0: sending the SEV to wake up CPU1\n\r");
    sev();
    dmb();

4,CPU1中禁止OCM的Cache属性

//Disable cache on OCM
    Xil_SetTlbAttributes(0xFFFF0000,0x14de2);           
    // S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0

5,CPU1扫描到按键后填充显示缓冲区的代码

TimerExpired=(TimerExpired+1)%BUF_SIZE;
   //循环移动显示缓冲区的写入指针
   DISPLAY_BUF[TimerExpired]=Display_Code[KEY_Value-1];
   //在指针位置写入键值
   DISPLAY_BUF[BUF_SIZE]=TimerExpired;
   //记录新按键键值的指针位置
   xil_printf("CPU1: New key has been pushed ,update the display buffer.\r\n");

6,CPU0在定时器中断中读取显示缓冲刷新显示的代码

XScuTimer_ClearInterruptStatus(TimerInstancePtr);
   //清除定时器中断标志
   TimerExpired=(TimerExpired+1)%4;
   //循环移动显示缓冲区读取指针
   XGpio_DiscreteWrite(&Gpio_LEDS, SEG_CHANNEL,
    emerge_ledbus(DISPLAY_BUF[TimerExpired],
    DISPLAY_BUF[TimerExpired+4],Selected_Code[TimerExpired]));
   //将对应缓冲区内容送到7段数码管上
   XGpio_DiscreteWrite(&Gpio_LEDS, LED_CHANNEL, DISPLAY_BUF[DISPLAY_BUF[BUF_SIZE]]);
   //将最新一个按键的键值送到LED灯上

ZYNQ OCM地址分配和双核使用配置相关推荐

  1. ZYNQ linux环境下PS I2C配置OV5640

    平台:ubuntu虚拟机 ZYNQ7035 1.vivado编辑BD文件,设置两个IIC接口 2.设备树搭建,应用petalinux调用hdf直接生成 在Ubuntu虚拟机内搭建工程 source / ...

  2. ZYNQ - 嵌入式Linux开发 -07- petalinux工程配置解析

    写在前面 前文实现了对一个工程进行了petalinux的镜像制作,对于中间过程的具体配置没有做过多讲解,本文将针对petalinux的配置做进一步的解析. 字符图形界面配置解析 图像界面操作 打开之前 ...

  3. MPC5746C双核启动配置分析

    MPC5746C内部集成了一个BAF(Boot Assist Flash)小工具(代码)(这个有点像Bootloader),BAF主要用于管理多核CPU的启动,其原理是寻找特定地址的启动头,查看并根据 ...

  4. 计算机网络之IP地址分配及静态路由配置

    Packet Tracer介绍: 1.Packet Tracer是Cisco公司针对CCNA认证开发的一个用来设计.配置和故障排除网络的模拟软件. 2.Packet Tracer模拟器中可以搭建各种网 ...

  5. Linux iNode 双网卡,已解决: Zynq 7000 双网卡配置-内核DTS该如何配置 - Community Forums...

    问题:ETH0是通的,ETH1找不到PHY(连接到GMII2RGMII转换器时,找不到该设备),dts和vivado该如何配置? 系统:Zynq 7Z015 Vivado:2018.3 内核:4.6 ...

  6. OCM备考 一、Server config 之网络配置

    OCM考试大纲关于network配置的要求 一 Server Configuration ﹡ Create and manage multiple network configuration file ...

  7. 飞凌嵌入式AM62x系列核心板配置新增,单核/双核/四核随心选

    新时代,工业.电力.交通.医疗等众多行业纷纷从信息化向着智能化转型,这就对主控的综合性能提出了全新的要求.在这样的背景下 TI AM62x Sitara™处理器应运而生,为AIoT时代带来了新的突破可 ...

  8. 4款超值4500元配置推荐:双核/游戏/大屏[图]

    通过我们针对攒机用户的网上调查,目前4500元价位聚集了大量攒机用户,主要由于4500元价位在5000元以内,在大部分用户可接受范围之内,另外一方面则是由于这个价位的配置应用领域很多,例如:双核配置. ...

  9. ZYNQ上无DDR加载应用

    1.背景介绍 为了节约成本和降低功耗,现在板载BMC全部选择了ZYNQ7010,无外挂DDR,存储空间使用QSPI,借助板载OCM执行应用程序. xilinx网站上提供了一种解决方案,链接如下: ht ...

最新文章

  1. 未来的计算机老素描画,考试这么无聊?学生把手画成“平面”,老师:未来的“美术大师”...
  2. 【LeetCode每周算法】零钱兑换
  3. 从好买辞职后,为什么我会加入一家开源创业公司?
  4. 前端学习(1756):前端调试值之如何监控页面的动画
  5. RSA 前段加密 java 后台解密 已调试通过
  6. ad中电容用什么封装_图文并茂用最通俗易懂的对话为你讲解电子技术知识- C什么是电容?...
  7. python爬取知乎页面的LaTeX公式
  8. smarty foreach 最全用法
  9. 什么是虚拟DOM(React16源码分析)
  10. mysql并发参数查看_MySQL Innodb 并发涉及参数
  11. 分页插件pagehelper ,在sql server 中是怎么配置的
  12. Python 爬虫常用代码
  13. Python初学者必须吃透的69个内置函数
  14. 计算机专业我的工匠梦作文,【推荐】我的科技梦作文7篇
  15. firefly-rk3288开发板Linux驱动——AT24C02 E2PROM驱动
  16. 别当工具人了,手摸手教会你 Jenkins !
  17. inetd和xinetd的区别 (ZT)
  18. http.ListenAndServe
  19. 改变命运的早上三分钟 之 二
  20. Leetcode 组合总和II

热门文章

  1. 最新的一台联想式台式主机如何检查型号信息
  2. Windows TLS原理
  3. 点石互动--石头之:石头论seo:网站被删与seo本质
  4. ThreadPool学习笔记
  5. python报考软考哪个比较好_软考高级考哪个好?
  6. 10万+QPS秒杀限流组件设计与实现
  7. python print影响速度_为什么打印到标准输出这么慢?可以加快速度吗?
  8. 201671010438王奕晗 实验三 作业互评与改进
  9. 爱立信的5G设备订单继续激增,年内或超越华为成为第一大设备商
  10. django ForeignKey参数