Derleme Ortamını Ayarlama

Kaynağı GitHub'da görüntüle

OpenThread, ücretsiz ve açık geliştirmeyi tanıtmak için şurada CMake'i kullanır: çok basit bir örneğidir. Şu anda, bu araç zincirini bağımsız bir biçimde OpenThread'i yeni bir donanım platformuna taşıyın.

Diğer derleme araç zincirleri gelecekte desteklenebilir ancak konusunu ele alalım.

Yeni depo oluşturma

İlk adım, donanım platformunuz için yeni bir ev oluşturmaktır. Bu kılavuzda platform soyutlama katmanını, donanım platformunun SDK'sını ve birkaç kullanışlı komut dosyasını içeren ot-efr32 adlı yeni bir depo oluşturacağız.

Bu örnekte, GitHub'da SiliconLabs/ot-efr32 deposunu oluşturup ~/repos/ot-efr32 hizmetine klonladık.

mkdir -p ~/repos
cd ~/repos
git clone git@github.com:SiliconLabs/ot-efr32.git
Cloning into 'ot-efr32'...
remote: Enumerating objects: 99, done.
remote: Counting objects: 100% (99/99), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 333 (delta 65), reused 39 (delta 39), pack-reused 234
Receiving objects: 100% (333/333), 170.78 KiB | 5.69 MiB/s, done.
Resolving deltas: 100% (194/194), done.
git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

Depo yapısı

OpenThread GitHub kuruluşunda mevcut platform depoları ile tutarlılığı korumaya yardımcı olması için deponuzu aşağıdaki gibi yapılandırmak isteyebilirsiniz:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Klasör Açıklama
examples isteğe bağlı Örnek uygulamalar
openthread Alt modül olarak openthread deposu
script Oluşturma, test etme ve hata analizi için komut dosyaları
src Platform soyutlama katmanı uygulaması
third_party Üçüncü taraf kaynakların konumu

Alt modül ekle

Bir sonraki adımda openthread ve gerekli diğer depoları alt modül olarak ekleyin

git submodule add git@github.com:openthread/openthread.git
Cloning into '/home/user/repos/ot-efr32/openthread'...
remote: Enumerating objects: 78281, done.
remote: Counting objects: 100% (1056/1056), done.
remote: Compressing objects: 100% (488/488), done.
remote: Total 78281 (delta 639), reused 864 (delta 556), pack-reused 77225
Receiving objects: 100% (78281/78281), 76.62 MiB | 35.24 MiB/s, done.
Resolving deltas: 100% (61292/61292), done.

Bu örnekte, Silicon Labs Gecko SDK'sının basit bir sürümünü third_party ürününe alt modül olarak ekleyeceğiz.

cd third_party
git submodule add git@github.com:SiliconLabs/sdk_support.git
Cloning into '/home/user/repos/ot-efr32/third_party/sdk_support'...
remote: Enumerating objects: 32867, done.
remote: Counting objects: 100% (8181/8181), done.
remote: Compressing objects: 100% (3098/3098), done.
remote: Total 32867 (delta 4945), reused 7469 (delta 4732), pack-reused 24686
Receiving objects: 100% (32867/32867), 128.83 MiB | 30.91 MiB/s, done.
Resolving deltas: 100% (19797/19797), done.

Komut Dosyaları

Genel görevleri kolaylaştırmak için script klasöründe bazı komut dosyaları oluşturabilirsiniz. Bu komut dosyaları arasında önyükleme, derleme, kod inceleyici çalıştırma ve GitHub CI kontrolleri için test komut dosyası gibi görevler yer alabilir.

Aşağıda, mevcut platform depolarının çoğu için standart olan komut dosyası örnekleri verilmiştir.

bootstrap

Bu komut dosyası, donanım platformunuz için gereken tüm araçları ve paketleri yüklemelidir. Ayrıca kullanıcının OpenThread yığınını oluşturmak için gereken her şeye sahip olduğundan emin olmak amacıyla openthread önyükleme komut dosyasını da yürütmelidir.

Örnek için ot-efr32 konumundaki önyükleme komut dosyası bölümüne bakın.

build

CMake derleme komut dosyası, kullanıcıların platformunuz için OpenThread yığınını oluşturmasına olanak tanımalıdır. Kod deponuz herhangi bir örnek uygulama tanımlıyorsa bu komut dosyasının onu da derlemesi gerekir. Bu komut dosyası, platforma özel makro tanımları da dahil olmak üzere temel sistem yapılandırma seçeneklerini içermelidir.

Örnek için ot-efr32 bölümündeki derleme komut dosyası bölümüne bakın.

test

Test komut dosyası, kullanıcıların tanımladığınız testleri kullanarak değişiklikleri test etmesi için yararlı olabilir. Bu, sağlamlık kontrolü derlemeleri çalıştırmak kadar basit veya birim test paketi başlatmak kadar karmaşık bir şey olabilir.

ot-efr32 ürününde komut dosyası, efr32 platformlarının her birinde desteklenen her pano için build komut dosyasını yürütür.

Örnek için ot-efr32 dilindeki test komut dosyasına bakın.

make-pretty

Bu komut dosyası, stilin tutarlı olmasını sağlamak için kodu, komut dosyalarını ve Markdown dosyalarını biçimlendirmelidir.

Bu komut dosyasını kendiniz tanımlayabilirsiniz ancak mevcut platform havuzlarında kullanılan make-pretty komut dosyasını kullanmak sizin için en kolay yöntem olabilir. Komut dosyası, openthread stil komut dosyalarını çağırır ve tüm OpenThread depolarında stilin tutarlı olmasına yardımcı olur.

Bağlayıcı komut dosyası yapılandırması

GNU Bağlayıcı komut dosyası giriş dosyalarındaki tüm bölümlerin nasıl eşleneceğini açıklar (.o "nesne" dosyaları) GNU Derleyici Koleksiyonu (GCC) tarafından oluşturulan son çıkış dosyasına ( örnek, .elf). Ayrıca, bir veri kümesindeki her bir segmentin depolama konumunu ve giriş adresini de içermelidir. Platforma özel bağlayıcı komut dosyası genellikle platformun BSP'si ile birlikte sağlanır.

ld aracını, aşağıdakileri kullanarak platforma özgü bağlayıcı komut dosyasına işaret edecek şekilde yapılandırın: Platformunuzda target_link_libraries src/CMakeLists.txt için hedef oluşturun:

set(LD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/efr32mg12.ld")

target_link_libraries(openthread-efr32mg12
    PRIVATE
        ot-config
    PUBLIC
        -T${LD_FILE}
        -Wl,--gc-sections -Wl,-Map=$.map
)

Araç zinciri başlangıç kodu

Araç zinciri başlangıç kodu, genellikle platformun BSP'siyle birlikte sağlanır. Bu kodunu genellikle:

  1. Yürütülebilir programın giriş işlevini (Reset_Handler) uygular
  2. Kesme vektör tablosunu tanımlar
  3. Yığın ve Yığını başlatır
  4. .data bölümünü kalıcı olmayan bellekten RAM'e kopyalar
  5. Uygulama mantığını yürütmek için uygulama ana işlevine atlar

Başlangıç kodu (C veya assembly kaynak kodu), platformunuzun openthread-platform-name kitaplığı, aksi takdirde bağlayıcıda kullanılan bazı anahtar değişkenler komut dosyası doğru şekilde alıntılanamıyor:

  • src/CMakeLists.txt

Örnek: startup-gcc.c adlı yerde ot-cc2538 - src/CMakeLists.txt

add_library(openthread-cc2538
    alarm.c
...
    startup-gcc.c
...
    system.c
    logging.c
    uart.c
    $
)