【发布时间】:2014-06-26 15:19:01
【问题描述】:
我正在尝试在 ZedBoard 的 Zynq 平台上为嵌入式操作系统 (DNA-OS) 添加多处理器支持。 该操作系统实际上与 CPU_0 单独完美运行。操作系统架构需要实现一个 cpu_send_ipi 函数来激活多处理支持:基本上,这个函数会中断一个处理器并给他一个新的线程来处理。
我在ug585(Zynq 技术参考手册)中查找了 IPI 寄存器,但没有找到。
我尝试在 Cortex-A9 规范中进一步挖掘 IPI 寄存器,发现软件生成的中断可以用作 IPI。
给我的操作系统添加软件中断支持后,问题是CPU_0可以自己中断,但不能中断CPU_1!
PS:为了让我的操作系统处理 SGI,我使用了第 1486 页中 ug585 中的寄存器规范:
那么有没有其他特殊的配置可以让 CPU 互相中断呢?或任何其他实现 IPI 的方式?
问候,
【问题讨论】:
-
查看类似ARM bring up other CPU cores的问题。不清楚第二个 CPU 是否正常工作?我假设你在我的回答中做到了。
-
How to write a Linux SGI handler 有一些指向不同 Linux 源代码的指针,您可以查看它们。
-
我没有放置任何代码来启动任何一个 CPU。我实际上编译了操作系统以及应用程序,以获得一个 ~0.5MB 的 elf 文件;我使用 bootgen 从 FSBL、我的 ELF 文件和我的比特流生成一个 bin 文件。我想 FSBL 将我的比特流加载到 FPGA 中,我的精灵加载到内存中,然后将 CPU_0 的 PC 指向我的操作系统入口点。现在,在阅读了您的 cmets 和您的答案之后,我之前不理解的一些代码部分变得有意义。我将尝试调整 FSBL 代码以在两个 CPU 上加载操作系统
-
在 OS kickstart 模块中有一个控制测试,可以让 CPU_0 继续加载 OS 内核,同时阻止任何其他 CPU 等待中断。感谢您的提示,一旦我做出这些更改,我会及时通知您
标签: arm interrupt cpu-registers armv7 cortex-a