实时性要求和网络要求很高,又不想上VxWorks,毕竟比较贵。
所以打算上一个双核的A9,一个核跑Linux,负责网络、文件这些,一个核裸奔,处理实时数据。
裸奔核对外设要求很低,就串口和GPMC。
但是,需要裸奔的核能够访问外部的DDR3,以便和Linux核交换数据。不知道飞思卡尔官方这方面的技术支持么?
就我粗读手册来看,DDR控制器和两个A9都挂在AHB上,
那么一个A9初始化完成控制器,在MMU中把部分DDR设置成不映射,那么另外一个A9应该可以通过读写这块内存来实现双核之间的数据交换?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
完成基本初始化之后,主要InterConnect的Master对外设(所有外设,内存,etc)的访问是等地位的;除非使用到了Secure等特殊的设置。这个涉及到ARM内部的AMBA总线架构,找点资料看一下就十分清晰明了了;FSL或者TI的手册在这方便的信息偏少。
即如你指出的,初始化DDR完成之后,两个Core、DMA控制器,对DDR内存的访问是等地位的;谁都可以直接读写物理内存地址,基本没啥限制。
L2近似认为裸核的不能开,这样省事儿;否则invalidate等操作就要小心。
中断控制器尽量不要动共享中断,只用独享中断,etc,GIC这边问题会比较复杂,最好有Kernel的技术支持,会比较稳妥。
Zynq下的大致的系统启动流程大致如下,如果方案不依赖Linux的RemoteProc机制,其它ARM多核的启动流程也会类似:
系统启动 -> 所有核都会启动,都运行芯片内置的BootROM -> 主核(CPU0)运行BootROM的核心代码,其他核(CPU1-N)由BootROM放入休眠状态 -> BootROM Load 第一级用户BootLoader到CPU0并运行;
第一级用户BSL初始化DDR内存控制器等 -> 第一级用户BSL加载UBoot (或者UBoot就是第一级BSL,他来初始化DDR。);
UBoot加载Linux相关物资到内存;UBoot与BootROM互动,为裸奔核加载相关二进制代码,启动裸奔核或者继续休眠之;
Kernel启动,用户通过参数告诉内核,只能用哪些内存区域;剩余内存就是裸奔核/Linux和裸奔核通信所使用的了。
当Kernel启动完成之后,在特定内存地址放特定的数据,然后裸奔核才好完全正常的执行代码,这里是因为要等Kernel初始化MPCore等等货 {MOD}。
# 流程上的细节跟据系统设计会有所出入,但是大体上就这样了。
# Kernel是用户指明用哪些内存才会去使用,所以预加载裸核的代码到保留内存区是没问题的。
# 裸核一般是编号最大的那个,比如3+1,裸核就是CPU3,Kernel初始化0-2,Kernel决定的。
# 裸奔核的代码可以在Kernel启动之后,由Kernel驱动来加载,参考RemoteProc的实现,这个更高端一些,当然也会有更复杂的要求。
如果有对MPCore和Kernel都非常熟悉的技术支持,这个不是复杂的命题。
一周热门 更多>