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.
sumber
Jawaban:
Pembaruan 25 Okt 2015:
Forum Raspberry Pi memberikan jawaban kepada saya .
Tidak ada konsep _start saat menggunakan -nostdlib
kode yang akan dieksekusi terlebih dahulu harus menjadi file pertama yang diteruskan ke linker.
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
0x8000
kita memiliki_start
fungsi) dengan-O2
optimasi. Tapi masih pertanyaan stackoverflow saya di bawah ini mengenai_start
simbol 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:
_start
simbol 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.
0x8000
(tempat eksekusi dimulai) dari Raspberry Pi adalah kode untuk Core 1 -void core1_main(void)
. Asumsi saya adalah bahwa di0x8000
sana akan ada_start
(yang tidak sejak awal. File tidak diambil untuk kompilasi) atau setidaknya fungsi void main (void). Ini terjadi karena-O2
optimalisasi GCC. Di GCC, dengan tingkat optimisasi yang lebih tinggi, fungsinya disusun ulang .. Ketika saya mematikan optimisasi (-O0
), lalu pada alamat0x8000
, 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 _start
akan 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.
sumber
htop
adalah alat userland berbasis * nix. Di linux hanya mendapatkan informasinya dari kernel via/proc
. Ini barang-barang dari logam. Tidak ada kernel untuk di-query.