Zynq双核通信和中断小结
最佳答案 问答题库608位专家为你答疑解惑
实现Zynq的AMP,即两个内核的通信,主要包含以下主要内容:
1.通信的实现手段,比较好的是通过共享地址来实现通信,比如XAPP1079中就设置了一个:
#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))
让运行在两个CPU中的程序去读取这个地址的数据,从而实现通信。但这里需要注意,程序把内容写进DDR里是会通过cache的,为了解决一致性的问题可以通过:
Xil_SetTlbAttributes(share_addr,0x14de2);
关闭Cache来解决。
2.Zynq的启动顺序是:boot——fsbl——ssbl。其中fsbl包含着bit,elf和fsbl本身的引导fsbl,我们希望固化并且实现双核通信,需要通过函数:
Xil_Out32(CPU1STARTADR, CPU1STARTMEM)
向Zynq中规定的fsbl读取的起始地址CPU1STARTADR中写入cpu1的程序地址CPU1STARTMEM。CPU1STARTMEM可以在vitis中的lsript文件里配置,这里需要注意配置程序所占的长度。
3.核间中断依赖XScuGic_SoftwareIntr函数,核间中断是通过SGI实现的,这个函数可以实现对指定CPU的指定中断源的中断产生。
可参考的内容和引用:
【正点原子FPGA连载】第十三章双核AMP实验-领航者 ZYNQ 之嵌入式开发指南 - 知乎 (zhihu.com)ZYNQ-双核通信 | 电子创新网赛灵思社区 (eetrend.com)
ZYNQ的程序固化_NoNoUnknow的博客-CSDN博客
XAPP1079:示例包含:
双核通信和程序固化的实例。
通过参考:ZYNQ的程序固化_NoNoUnknow的博客-CSDN博客
可知:完成程序固化同时双核通信,我们需要配置自己的FSBL文件(第一阶段引导程序),所以需要在配置文件的时候通过函数:
Xil_Out32(CPU1STARTADR, CPU1STARTMEM)来使加载boot镜像以后去跳转到CPU1程序的地址,并且发送事件代码sev()来进行唤醒。
其次,在编写elf文件的时候,需要通过配置lscript.ld来规定程序的起始位置和长度。CPU1的文件起始位置为CPU1STARTMEM;
XAPP1079 Latest Information - Xilinx Wiki - Confluence (atlassian.net)NoNoUnknow_FPGA学习,ZYNQ裸机开发,随想随记-CSDN博客
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Zynq双核通信和中断小结":http://eshow365.cn/6-18664-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!