This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

K2H EVM ARM多核程序执行异常



各位技术支持好:

我用一个程序在四个ARM核上同时启动执行,则一个核执行完了会导致其他核抛出未定义异常,如附件图所示。

我尝试了一下每个核依次执行,一个核执行完了再启动另一个核的执行,仍然会出现上述异常,只有将前面一个核复位后面的核才能正常执行。

请问这是什么原因?

  • 是不是有内存改写?

  • 最好看一看内存方面的配置,MMU这些,看是不是有内存覆盖改写方面的问题

  • 你好:

           我原先的代码里确实有内存改写方面的问题,但是应用里边内存改写是必须的。于是我进一步做了如下测试:

           1、不使能MMU。直接使用物理地址写内存(如 *(unsigned int *)0x0c008800 = 0x55555555),四个核能正常工作。

           2、在1的基础上,加入printf语句,则程序仍然会发生未定义指令异常。单步调试发现是在程序退出时发生的异常。

           3、使能MMU,并且在每个核的MMU配置中将相同虚拟地址映射到不同物理地址(如0核的虚拟地址0x0c000000映射到物理地址0x0c000000,1核的虚拟地址0x0c000000映射到物理地址0x0c300000),然后1核程序死在MMU配置函数里边(配置函数使用的是ARM裸跑例程里边的例子)。

           问题:

          1、测试2和测试3出现问题的可能原因是什么?

           2、不使能MMU时,ARM内存访问的过程是怎样的?是直接使用物理地址还是有一种默认映射关系?这个时候的内存属性(内存类型、缓存特性)是什么?

          3、使能MMU时,多个核的MMU该如何配置?有没有在多个ARM核上同时跑程序的示例代码?

  • 目前没有多核ARM的Bare-mental实例,看你的现象像是内存有重叠,把map文件都调出来看看;

    MMU的配置建议先看ARM cortex-A15的手册

  • Hi Allen,

            指令异常的问题解决了,不是MMU配置的问题,而是链接脚本的问题,链接脚本里边把程序的所有段都映射到了同一段MSRAM里边,包括栈之类的私有数据。

           我现在的解决方法是为每个核单独建一个工程,所有工程公用同样的资源文件,唯一不同就是每个工程的lds文件使用的MSRAM地址空间。对此我有两个小问题:

    1、ARM的哪些程序段是私有的,必须使用单独的地址空间?(目前我使用的方法是不加区别的将每个核所有程序段都分别存储,比较浪费存储空间)

    2、有没有什么比较好的方法配置lds文件,让多个ARM核可以像多个DSP核那样使用同一个链接脚本?(貌似DSP是将私有数据段映射到了各自的L2RAM里边,从而保证了独立性)

  • 另外还有一个比较紧迫的问题,麻烦帮忙分析一下。

    我现在想用四个核之间的IPC来实现同步,设计思路是这样的:首先让0核初始化GIC中断控制器等,将IPCGR8-11中断事件分别映射到0-3核的Group0(FIQ)中断,然后等待其他核触发中断,然后让1-3核依次触发IPCGR8中断事件。0核收到3个核的中断后,依次触发IPCGR9-11中断事件实现同步。

    问题:每个核写自己的IPCGR从而中断自己的核没问题,但写其他核的IPCGR,目标核却无法收到中断信号。比如1核写IPCGR8,0核没有响应。我查看了寄存器状态,当1核写完IPCGR8后,0核的IPCGR8变成了Active状态,Running Priority也是IPCGR8的Priority,说明0核收到了该中断,但就是没有响应,不知道这是什么原因?