如何在Raspberry Pi 2中启动核心1,2,3


10

我写了一个裸机多核示例。

代码,电路图在这里-https://github.com/jeffreyantony/multipi/tree/master/Example_01

在我的示例中,树莓派的GPIO引脚连接了3个LED。Raspberry Pi 2中总共有4个内核。每个内核都被分配为闪烁其相应的LED。

我在下面的地址中写了每个内核要执行的代码的地址:内核1 0x4000009C内核2 0x400000AC内核3 0x400000BC

编译代码后,仅分配给内核1的LED闪烁(在此示例中为黄色LED)。其他不是。

这意味着核心2和核心3的代码未运行(因为其他指示灯未闪烁)。我也发现启动所有内核后的代码也没有运行,即core0_submain()-此功能应使Raspberry Pi上的ACT LED闪烁

谁能让我知道是什么问题?是因为所有4个内核都试图写入同一GPIO寄存器,而只有Core 1在写操作中获胜?

我尝试添加“ 属性((裸));” 对于core0_submain(),但没有用。

我正在使用https://launchpad.net/gcc-arm-embedded中的工具链

再次代码-https://github.com/jeffreyantony/multipi/blob/master/Example_01/main.c

生成文件-https: //github.com/jeffreyantony/multipi/blob/master/Example_01/Makefile

2015年10月20日更新:我添加了对JTAG的支持。但未成功获得调试接口
2015年10月25日更新:问题已修复。查看答案。

电路原理图 在此处输入图片说明


这看起来真的很酷。我会调查一下。我的意思是,raspbian中可能有一些软件仅使用1个内核,除非需要其他软件来节省能源或其他东西……
Kachamenus 2015年

Answers:


6

2015年10月25日更新:

Raspberry Pi论坛给了我答案

  1. 使用-nostdlib时没有_start的概念

  2. 首先执行的代码应该是要传递给链接器的第一个文件。

  3. 如果需要更好的控制,则需要将代码放在init部分中,并要求链接程序将此部分复制到 0x8000

谢谢大家的支持。了解了很多有关GNU C编译器的知识。

2015年10月24日更新:

当我更改Makefile中用于编译的文件的顺序时,我得到了正确的优化顺序(即0x8000具有_start功能)-O2。但是关于_start符号的我下面的stackoverflow问题仍然没有解决。新代码已签入。

我取得了一些成功。新代码将检入github

该示例未完全运行。编译存在一些问题。我将解释每个:

  1. 实际上,我期望_start从我的自定义开始的符号开始。但事实并非如此。因此,未配置堆栈指针,也没有发生向main的跳转。

我已经问过一个问题。但是我进步不大。因此,我添加了一个内联程序集以将堆栈指针加载到main函数中。

  1. 但是代码仍然没有运行。当我检查程序集清单时,我发现0x8000Raspberry Pi的地址(执行开始的地方)是Core 1-的代码void core1_main(void)。我的假设是,在0x8000那里将是_start(是不是因为start.S中的文件不被编译)或至少是无效的主要(无效)功能。发生这种情况是由于-O2GCC 的优化。在GCC中,具有更高的优化级别,这些函数将重新排序。当我关闭优化(-O0)时,则在address处显示0x8000了main。

您可以在此处阅读有关功能重新排序的信息

摘要:当前代码只是一个修复。要解决的主要问题-为什么不从start.S调用_start?如果这是固定的,则地址为0x8000 _start。这样,我们就不必在意高级优化过程中由GCC完成的功能顺序了。

我身边还有一个演示视频作为证明。尽管代码中的LED闪烁速率是不同的并且是周期性的,但是由于所有内核都试图写入相同的GPIO寄存器,因此存在一些冲突,导致LED以随机间隔闪烁。


尝试查看htop源代码,了解它们如何执行以将多核数据显示在屏幕上。
Piotr Kula 2015年

3
@ppumkin这毫无意义。 htop是基于* nix的用户界面工具。在Linux上,它只是通过内核从内核获取信息/proc。这是裸露的东西。没有要查询的内核。
goldilocks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.