Raspberry Pi 2'de çekirdek 1,2,3'ü başlatma


10

Çıplak metal çok çekirdekli bir örnek yazdım.

Kod, devre şeması burada - https://github.com/jeffreyantony/multipi/tree/master/Example_01

Örneğimde, ahududu Pi'nin GPIO pinlerine bağlı 3 LED var. Raspberry Pi 2'de toplam 4 çekirdek vardır. Her çekirdek ilgili LED'ini yanıp sönmeye atanmıştır.

Her bir çekirdek tarafından yürütülecek kodun adresini aşağıdaki adreslerde yazdım: çekirdek 1 için 0x4000009C çekirdek 2 için 0x400000AC çekirdek 3 için 0x400000BC

Kodu derledikten sonra, yalnızca çekirdek 1'e atanan LED yanıp söner (bu örneğe göre sarı LED). Diğerleri değildir.

Bu, Core 2 ve 3 kodunun çalışmadığı anlamına gelir (diğer LED'ler yanıp sönmediğinden). Ayrıca tüm çekirdekleri başlattıktan sonra kodun da core0_submain () yani çalışmıyor olduğunu buldum - bu fonksiyon Raspberry Pi üzerindeki ACT LED'i yanıp sönmelidir

Sorunun ne olduğunu bilen var mı? Çünkü 4 çekirdeğin tümü aynı GPIO kaydına yazmaya çalışıyor ve yazmada sadece Core 1 kazanıyor mu?

" Özellik ((çıplak));" core0_submain () için kullanmanın bir faydası yoktu.

Https://launchpad.net/gcc-arm-embedded adresinden toolchain kullanıyorum

bir kez daha kod - https://github.com/jeffreyantony/multipi/blob/master/Example_01/main.c

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

Güncelleme 20 Ekim 2015 : JTAG için destek ekledim. Ancak hata ayıklama arabirimini almak başarılı değil
Güncelleme 25 Ekim 2015 : Sorun düzeltildi. Cevaba bakınız.

Devre şeması resim açıklamasını buraya girin


Bu gerçekten harika görünüyor. Ben bakacağım. Demek istediğim, raspbian'da başkalarının enerji tasarrufu yapmak için bir şey gerekmedikçe sadece 1 çekirdeği kullanan bazı yazılımlar olabilir ...
Kachamenus

Yanıtlar:


6

Güncelleme 25 Ekim 2015:

Raspberry Pi forumu bana cevap verdi .

  1. -Nostdlib kullanılırken _start kavramı yoktur

  2. önce yürütülecek kod, bağlayıcıya iletilecek ilk dosya olmalıdır.

  3. Daha iyi bir kontrol gerekiyorsa, kodun bir başlatma bölümüne yerleştirilmesi ve bağlayıcıdan bu bölümü 0x8000

Desteğiniz için teşekkürler. GNU C Derleyicisi hakkında çok şey öğrendim.

Güncelleme 24 Ekim 2015:

Makefile'de derleme için verilen dosyaların sırasını değiştirdiğimde, doğru sıralamayı (yani fonksiyona 0x8000sahibiz _start) -O2optimizasyonla aldım . Ama yine de _startsembolle ilgili yığın akışı sorusu henüz çözülmedi. Yeni kod iade edildi.

Biraz başarılı oldum. Yeni kod github olarak kontrol edilir .

Örnek tamamen çalışmıyor. Derlemeyle ilgili bazı sorunlar var. Her birini açıklayacağım:

  1. Aslında _startbenim özel başlangıcımdaki sembolün alınmasını bekliyordum . Ancak durum böyle değildi. Bu nedenle, yığın işaretçisi yapılandırılmadı ve ana atlama gerçekleşmedi.

Bu konuda zaten bir soru sordum . Ama pek ilerlemedim. Bu yüzden ana fonksiyonda yığın işaretçisini yüklemek için bir satır içi montaj ekledim.

  1. Ama yine de kod çalışmadı. Montaj listesini kontrol ettiğimde 0x8000, Raspberry Pi'nin adresinde (yürütmenin başladığı yer) Core 1 - için kod olduğunu buldum void core1_main(void). Benim varsayım 0x8000orada _start(ki başlangıç.S dosyası derleme için alınmaz) ya da en azından geçersiz ana (void) işlevi olacaktır. Bu -O2, GCC'nin optimizasyonu nedeniyle olur . GCC'de, daha yüksek optimizasyon seviyeleri ile, fonksiyonlar yeniden sıralanır. Optimizasyonu ( -O0) kapattığımda , o zaman adreste 0x8000ana mevcuttu.

Yeniden sıralama işlevi hakkında buradan bilgi edinebilirsiniz

Özet: Geçerli kod sadece bir düzeltmedir. Çözülmesi gereken ana sorun - Neden _start başlangıçtan itibaren çağrılmıyor? Bu düzeltilirse, adres 0x8000 _startgelirdi. Bununla, daha yüksek optimizasyon sırasında GCC tarafından yapılan fonksiyon sırasını önemsemek zorunda değiliz.

Kanıt olarak benim tarafımdan bir demo video da var . LED yanıp sönme oranları kodda farklı ve periyodik olmasına rağmen, tüm çekirdekler aynı GPIO kayıtlarına yazmaya çalıştığından, LED'lerin rastgele aralıklarla yanıp sönmesine neden olan bazı çakışmalar vardır.


Çok çekirdekli verileri ekrana göstermek için htop kaynak kodunu nasıl yaptıklarına bakın.
Piotr Kula

3
@ppumkin Bu anlamsız. htop* nix tabanlı bir kullanıcı alanı aracıdır. Linux üzerinde bilgilerini sadece çekirdekten alır /proc. Bu çıplak metal şeyler. Sorgulanacak çekirdek yok.
goldilocks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.