Cara memulai core 1,2,3 di Raspberry Pi 2


10

Saya telah menulis contoh multi core bare metal.

Kode, diagram sirkuit ada di sini - https://github.com/jeffreyantony/multipi/tree/master/Example_01

Dalam contoh saya, ada 3 LED yang terhubung ke pin GPIO dari raspberry Pi. Ada benar-benar 4 inti dalam Raspberry Pi 2. Setiap inti ditugaskan untuk berkedip LED yang sesuai.

Saya menulis alamat kode yang akan dieksekusi oleh setiap inti di alamat di bawah ini 0x4000009C untuk inti 1 0x400000AC untuk inti 2 0x400000BC untuk inti 3

Setelah mengkompilasi kode, hanya LED yang ditugaskan ke inti 1 yang berkedip (seperti contoh ini, LED kuning). Yang lainnya tidak.

Ini berarti kode untuk Core 2 dan 3 tidak berjalan (karena LED lain tidak berkedip). Saya juga menemukan bahwa kode setelah memulai semua core juga tidak berjalan yaitu core0_submain () - fungsi ini harus berkedip LED ACT pada Raspberry Pi

Adakah yang bisa memberi tahu saya apa masalahnya? Apakah karena semua 4 core mencoba menulis ke register GPIO yang sama dan hanya Core 1 yang menang dalam penulisan?

Saya mencoba menambahkan " atribut ((telanjang));" untuk core0_submain () tetapi tidak ada gunanya.

Saya menggunakan toolchain dari https://launchpad.net/gcc-arm-embedded

sekali lagi kode - https://github.com/jeffreyantony/multipi/blob/master/Example_01/main.c

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

Pembaruan 20 Okt 2015 : Saya telah menambahkan dukungan untuk JTAG. Tetapi tidak berhasil untuk mendapatkan antarmuka debug
Pembaruan 25 Okt 2015 : Masalah diperbaiki. Lihat jawaban.

Diagram sirkuit masukkan deskripsi gambar di sini


Ini sepertinya sangat keren. Saya akan memeriksanya. Maksud saya, mungkin ada beberapa perangkat lunak dalam raspbian yang hanya menggunakan 1 inti kecuali yang lain diperlukan untuk menghemat energi atau sesuatu ...
Kachamenus

Jawaban:


6

Pembaruan 25 Okt 2015:

Forum Raspberry Pi memberikan jawaban kepada saya .

  1. Tidak ada konsep _start saat menggunakan -nostdlib

  2. kode yang akan dieksekusi terlebih dahulu harus menjadi file pertama yang diteruskan ke linker.

  3. Jika kontrol yang lebih baik diperlukan, kode harus ditempatkan di bagian init dan minta tautan untuk menyalin bagian ini 0x8000

Terima kasih semua atas dukungannya. Belajar banyak tentang Kompiler GNU C.

Pembaruan 24 Okt 2015:

Ketika saya mengubah urutan file yang diberikan untuk kompilasi di Makefile, saya mendapatkan urutan yang benar (yaitu 0x8000kita memiliki _startfungsi) dengan -O2optimasi. Tapi masih pertanyaan stackoverflow saya di bawah ini mengenai _startsimbol belum terpecahkan. Kode baru masuk.

Saya telah mendapatkan beberapa kesuksesan. Kode baru diperiksa ke github .

Contohnya tidak sepenuhnya berjalan. Ada beberapa masalah dengan kompilasi. Saya akan menjelaskan masing-masing:

  1. Sebenarnya saya mengharapkan bahwa _startsimbol dari awal kebiasaan saya akan diambil. Tapi bukan itu masalahnya. Karena hal ini penunjuk tumpukan tidak dikonfigurasikan dan lompatan ke main tidak terjadi.

Saya sudah mengajukan pertanyaan tentang ini. Tapi saya belum banyak berkembang. Jadi saya menambahkan perakitan inline untuk memuat stack pointer di fungsi utama.

  1. Tapi tetap saja kodenya tidak berjalan. Ketika saya memeriksa daftar perakitan, saya menemukan bahwa di alamat 0x8000(tempat eksekusi dimulai) dari Raspberry Pi adalah kode untuk Core 1 - void core1_main(void). Asumsi saya adalah bahwa di 0x8000sana akan ada _start(yang tidak sejak awal. File tidak diambil untuk kompilasi) atau setidaknya fungsi void main (void). Ini terjadi karena -O2optimalisasi GCC. Di GCC, dengan tingkat optimisasi yang lebih tinggi, fungsinya disusun ulang .. Ketika saya mematikan optimisasi ( -O0), lalu pada alamat 0x8000, yang utama ada.

Anda dapat membaca tentang fungsi pemesanan ulang di sini

Rangkuman: Kode saat ini hanyalah perbaikan. Masalah utama yang harus dipecahkan - Mengapa _start tidak dipanggil dari awal. Jika ini diperbaiki, di alamat 0x8000 _startakan datang. Dengan ini kita tidak perlu peduli dengan urutan fungsi yang dilakukan oleh GCC selama optimasi yang lebih tinggi.

Ada juga video demo dari pihak saya sebagai bukti. Meskipun tingkat kedipan LED berbeda dan periodik dalam kode, karena semua inti mencoba menulis ke register GPIO yang sama, ada beberapa konflik yang menyebabkan LED berkedip secara acak.


Coba dan lihat kode sumber htop pada bagaimana mereka melakukannya untuk menampilkan data multi-core ke layar.
Piotr Kula

3
@pumkin Itu tidak ada gunanya. htopadalah alat userland berbasis * nix. Di linux hanya mendapatkan informasinya dari kernel via /proc. Ini barang-barang dari logam. Tidak ada kernel untuk di-query.
goldilocks
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.