Raspberry Pi 2でコア1、2、3を起動する方法


10

ベアメタルマルチコアの例を書きました。

コード、回路図はこちら-https://github.com/jeffreyantony/multipi/tree/master/Example_01

私の例では、3つのLEDがラズベリーPiのGPIOピンに接続されています。Raspberry Pi 2には合計4つのコアがあります。各コアは、対応するLEDを点滅させるために割り当てられています。

各コアが実行するコードのアドレスを以下のアドレスに書きました。コア1の場合は0x4000009Cコア2の場合は0x400000ACコア3の場合は0x400000BC

コードをコンパイルすると、コア1に割り当てられたLEDのみが点滅します(この例では、黄色のLED)。他はそうではありません。

これは、コア2および3のコードが実行されていないことを意味します(他のLEDが点滅していないため)。また、すべてのコアを起動した後にコードが実行されていないこともわかりました。つまり、core0_submain()-この関数は、Raspberry PiのACT LEDを点滅させる必要があります

誰も私に問題が何であるかを知らせてもらえますか?4つのコアすべてが同じGPIOレジスタに書き込みを試み、コア1のみが書き込みで勝っているからですか?

属性((裸));」を追加してみました core0_submain()では使用されませんでした。

https://launchpad.net/gcc-arm-embeddedのツールチェーンを使用しています

もう一度コード-https://github.com/jeffreyantony/multipi/blob/master/Example_01/main.c

makefile- https://github.com/jeffreyantony/multipi/blob/master/Example_01/Makefile

2015年10月20日更新:JTAGのサポートを追加しました。しかし、デバッグインターフェイスを取得できませんでした。
2015年10月25日更新:問題は修正されました。答えを見てください。

回路図 ここに画像の説明を入力してください


これは本当にクールに見えます。調べてみます。つまり、他の人がエネルギーや何かを節約する必要がない限り、1つのコアのみを使用するソフトウェアがraspbianにあるかもしれません...
Kachamenus

回答:


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カスタムスタートからのシンボルを期待していた。しかし、そうではありませんでした。このため、スタックポインターは構成されておらず、メインへのジャンプは行われませんでした。

これについてはすでに質問しました。しかし、私はあまり進歩していません。そのため、メイン関数にスタックポインターを読み込むインラインアセンブリを追加しました。

  1. しかし、それでもコードは実行されませんでした。アセンブリリストを確認した0x8000ところ、Raspberry Piのアドレス(実行が開始される場所)にCore 1-のコードがあることがわかりましたvoid core1_main(void)。私の想定では0x8000_start(start.Sファイルはコンパイルに使用されていないため)ではなく、少なくともvoid main(void)関数が存在することになります。これは、-O2GCC の最適化が原因で発生します。GCCでは、最適化レベルが高くなると、関数の順序が変更されます。最適化(-O0)をオフにすると、アドレス0x8000にメインが表示されました。

ここで関数の並べ替えについて読むことができます

概要:現在のコードは単なる修正です。解決すべき主な問題-_startがstart.Sから呼び出されないのはなぜですか?これが修正されれば、アドレス0x8000 _startが来るでしょう。これにより、高度な最適化中にGCCによって実行される関数の順序を気にする必要がなくなります。

証拠として私の側からのデモビデオもあります。コードではLEDの点滅速度が異なり、周期的ですが、すべてのコアが同じGPIOレジスタに書き込もうとするため、ランダムな間隔でLEDを点滅させるいくつかの競合があります。


マルチコアデータを画面に表示する方法をhtopソースコードで確認してください。
Piotr Kula

3
@ppumkinそれは無意味です。 htop* nixベースのユーザーランドツールです。Linuxでは、カーネルから情報を取得するだけ/procです。これはベアメタルの物です。照会するカーネルはありません。
ゴルディロックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.