Sıfırlama ve Önyükleme Dizisi

MicroPython çalıştıran bir cihaz, bir sıfırlamadan sonra başlatılıp kendini ilklendirmek için belirli bir önyükleme dizisini izler.

Not

Aşağıda açıklanan _boot.pyboot.pymain.py → REPL dizisi, nasıl bağlandığınızdan bağımsız olarak aygıt yazılımının her sıfırlamada çalıştırdığı şeydir — bu yüzden her zaman geçerlidir. OpenMV IDE‘den bir betik çalıştırdığınızda, IDE o anda çalışan main.py‘yi keser ve düzenleyicide açık olan betiği kendi hata ayıklama protokolü üzerinden onun yerine çalıştırır. Cihaz üzerindeki REPL kullanılmadığı için, bu sayfadaki REPL’e özgü referanslar (etkileşimli komut istemi, bir seri terminalde Ctrl-D / Ctrl-C gibi) bağımsız çalışma ve doğrudan seri terminal oturumları için geçerlidir — ancak önyükleme dizisinin kendisi tüm durumlarda geçerlidir.

Donanımsal sıfırlama

Donanımsal sıfırlamadan önyükleme, bir kart ilk kez güç verildiğinde, yani soğuk önyüklemede gerçekleşen şeydir. Bu, MCU donanımının tam bir sıfırlamasıdır.

MicroPython port kodu tüm temel donanımı (gömülü saatler ve güç regülatörleri, dahili seri UART vb. dâhil) ilklendirir ve ardından MicroPython ortamını başlatır. Mevcut RTC yapılandırması donanımsal sıfırlamadan sonra korunabilir, ancak diğer tüm donanım durumu temizlenir.

Aynı donanımsal sıfırlama önyükleme dizisi şunlar gibi çeşitli olaylarla tetiklenebilir:

  • machine.reset() çalıştıran Python kodu.

  • Kullanıcının kart üzerindeki fiziksel bir Sıfırlama düğmesine basması (uygulanabilir olduğunda).

  • Derin uykudan uyanma (çoğu portta).

  • MCU donanım gözcü (watchdog) sıfırlaması.

  • MCU donanım düşük gerilim (brown out) algılayıcısı.

Donanıma özgü sıfırlama tetikleyicilerinin ayrıntıları porta ve ilişkili donanıma bağlıdır. machine.reset_cause() fonksiyonu, bir sıfırlamanın nedenini daha ayrıntılı belirlemek için kullanılabilir.

Yazılımsal Sıfırlama

MicroPython zaten çalışırken, REPL’de Ctrl-D yazarak veya machine.soft_reset() çalıştırarak bir yazılımsal sıfırlama tetiklemek mümkündür.

Bir yazılımsal sıfırlama, Python yorumlayıcısını temizler, tüm Python belleğini boşaltır ve MicroPython ortamını yeniden başlatır.

Bir yazılımsal sıfırlama ile temizlenen durumlar şunları içerir:

  • Tüm Python değişkenleri, nesneleri, içe aktarılmış modüller vb.

  • machine modülü kullanılarak yapılandırılan çoğu çevre birimi. Çok sınırlı istisnalar vardır; örneğin machine.Pin modları (yani bir pinin giriş mi çıkış mı, yüksek mi alçak mı olduğu) çoğu portta sıfırlanmaz. Pin.irq() gibi daha gelişmiş yapılandırmalar her zaman sıfırlanır.

  • Bluetooth.

  • Ağ soketleri. Açık TCP soketleri, karşı tarafa göre düzgün bir şekilde kapatılır.

  • Açık dosyalar. Dosya sistemi geçerli bir durumda bırakılır.

Bazı sistem durumları, bir yazılımsal sıfırlamadan sonra aynı kalır; bunlar şunları içerir:

  • Mevcut ağ bağlantıları (Ethernet, Wi-Fi vb.) IP Ağı katmanında etkin kalır. Koddan ağ arabirimini sorgulamak, ağ arabiriminin yapılandırılmış bir IP adresiyle vb. hâlâ etkin olduğunu gösterebilir.

  • Etkin bir REPL, bazı olağandışı durumlar dışında yazılımsal sıfırlamadan önce ve sonra kesintisiz görünür:

    • Bir seri UART REPL, varsayılan donanım yapılandırmasını (baud hızı vb.) geri yükler.

  • CPU saat hızı genellikle bir yazılımsal sıfırlama ile değişmez.

  • RTC yapılandırması (yani geçerli saatin ayarlanması) yazılımsal sıfırlama ile değişmez.

Önyükleme Dizisi

MicroPython, bir donanımsal veya yazılımsal sıfırlamanın ardından önyüklendiğinde, bu önyükleme dizisini sırayla izler:

_boot.py

Bu, MicroPython aygıt yazılımına gömülü dahili bir betiktir. Temel ilklendirmeyi yapmak için birçok portta MicroPython tarafından sağlanır.

Örneğin, çoğu portta _boot.py, yeni bir cihazın ilk önyüklemesini algılar ve dahili flash dosya sistemini kullanıma hazır olacak şekilde biçimlendirir.

Özel bir MicroPython derlemesi oluşturmuyor veya yeni bir port eklemiyorsanız muhtemelen _boot.py ile ilgilenmenize gerek yoktur. Gerçekten ne yaptığınızı bilmiyorsanız içeriğini değiştirmemek en iyisidir.

boot.py

boot.py adlı bir dosya, mpremote kullanılarak kartın dahili dosya sistemine kopyalanabilir.

boot.py bulunursa çalıştırılır. Özel, tek seferlik ilklendirme gerçekleştirmek için (örneğin, kartın donanımını yapılandırmak için) boot.py içine kod ekleyebilirsiniz.

Yaygın bir uygulama, kartın ağ bağlantısını boot.py içinde yapılandırmaktır; böylece sıfırlamadan sonra REPL, mpremote vb. ile kullanılmak üzere her zaman kullanılabilir olur.

Uyarı

boot.py her zaman çıkış yapmalı ve süresiz olarak çalışmamalıdır.

Karta bağlı olarak, bazı donanım ilklendirmeleri boot.py çıkış yapana kadar ertelenir. Buna STM32 tabanlı OpenMV Cam’lerde USB’nin ilklendirilmesi de dâhildir. Bu kartlarda, boot.py‘den yazdırılan çıktı, boot.py çalışmayı bitirene kadar yerleşik USB seri portunda görünmeyebilir.

Bu geç ilklendirmenin amacı, belirli donanımın boot.py içinde önceden yapılandırılabilmesi ve ardından doğru yapılandırmayla başlatılabilmesidir.

Not

Bazen boot.py dosyasına sahip olmamak ve herhangi bir ilklendirme kodunu bunun yerine main.py‘nin en üstüne yerleştirmek daha basittir.

main.py

boot.py‘ye benzer şekilde, main.py adlı bir dosya kartın dahili dosya sistemine kopyalanabilir. Bulunursa, başlatma sürecinde bir sonraki olarak çalıştırılır.

main.py, cihazınız her başladığında çalıştırmak istediğiniz herhangi bir Python kodu içindir.

main.py kullanımı için bazı ipuçları:

  • main.py‘nin çıkış yapması gerekmez; oraya sonsuz bir while True döngüsü koymaktan çekinmeyin.

  • Karmaşık Python uygulamaları için tüm kodunuzu main.py içine koymanız gerekmez. main.py, uygulamanızı içe aktaran ve yürütmeyi başlatan basit bir giriş noktası olabilir:

    import my_app
    my_app.main()
    

    Bu, uygulamanızın yapısını net tutmaya yardımcı olabilir. Ayrıca bir karta birden fazla uygulama kurmayı ve aralarında geçiş yapmayı kolaylaştırır.

  • Sağlam uygulamalar yazarken, kod çökerse uygun eylemi gerçekleştirmek için main.py içindeki kodu bir istisna işleyiciyle sarmak iyi bir uygulamadır. Örneğin:

    import machine, sys
    import my_app
    try:
        my_app.main()
    except Exception as e:
        print("Fatal error in main:")
        sys.print_exception(e)
    
    # Following a normal Exception or main() exiting, reset the board.
    # Following a non-Exception error such as KeyboardInterrupt (Ctrl-C),
    # this code will drop to a REPL. Place machine.reset() in a finally
    # block to always reset, instead.
    machine.reset()
    

    Aksi takdirde MicroPython, herhangi bir çökmenin ardından veya main çıkış yaparsa REPL’e düşer (aşağıya bakın).

  • boot.py içinde ayarlanmış herhangi bir genel değişken, main.py‘nin genel bağlamında hâlâ ayarlı olacaktır.

  • Flash kullanımını ve bellek tüketimini tam olarak optimize etmek için önceden derlenmiş main.mpy ve/veya boot.mpy dosyalarını dosya sistemine kopyalayabilir, hatta bunları aygıt yazılımı derlemesine gömebilirsiniz.

  • main.py yürütmesi, ham REPL modundan bir yazılımsal sıfırlama başlatıldığında (örneğin, mpremote veya başka bir program doğrudan MicroPython ile etkileşime girdiğinde) atlanır.

Etkileşimli Yorumlayıcı (REPL)

main.py bulunmazsa veya main.py çıkış yaparsa, MicroPython Etkileşimli Yorumlayıcı Modu (diğer adıyla REPL) hemen başlar.

Not

main.py sonsuz bir döngü içerse bile, REPL seri portunda Ctrl-C yazmak bir KeyboardInterrupt enjekte eder. Hiçbir istisna işleyici bunu yakalamazsa main.py çıkış yapar ve REPL başlar.

boot.py ve main.py içinde ayarlanmış herhangi bir genel değişken, REPL’in genel bağlamında hâlâ ayarlı olacaktır.

REPL, Python kodu bir donanımsal veya yazılımsal sıfırlamayı tetikleyene kadar yürütmeye devam eder.

Yazılımsal Tuğlalaşma (önyükleme hatası)

MicroPython’ın başlatma sırasında yanıt vermez hâle gelmesi nadirdir ama mümkündür; bu durum bazen “yazılımsal tuğlalaşma” olarak adlandırılır. Örneğin:

  • boot.py yürütmesi takılırsa ve yerel USB seri portu hiç ilklenmezse.

  • Python kodu REPL arabirimini yeniden yapılandırarak erişilemez hâle getirirse.

İçiniz rahat olsun, kurtarma mümkündür!

OpenMV IDE kullanıyorsanız, çoğu zaman yalnızca bağlanmak yeterlidir — IDE, çalışan main.py‘yi durdurur ve kontrolü devralır. Kamera hiç bağlanmıyorsa, aşağıdaki Fabrika Sıfırlaması‘nı kullanın. Bir sonraki açıklanan Ctrl-C yöntemi, doğrudan seri terminal oturumları içindir — cihaz üzerindeki REPL’e dayanır, ki OpenMV IDE bunu kullanmaz.

KeyboardInterrupt

Çoğu durumda, REPL seri portunu açmak ve Ctrl-C yazmak bir KeyboardInterrupt enjekte eder ve çalışan betiğin çıkış yapmasına ve bir REPL’in başlamasına neden olabilir. REPL’den, hatalı davranan Python dosyasını kaldırmak için os.remove() kullanabilirsiniz:

import os
os.remove('main.py')

Dahili dosya sisteminde hangi dosyaların hâlâ mevcut olduğunu doğrulamak için:

import os
os.listdir()

Fabrika Sıfırlaması

Yukarıdaki yöntemi kullanarak bir REPL’e ulaşamıyorsanız, geriye kalan seçenek bir fabrika sıfırlamasıdır: dahili flash dosya sisteminin tüm içeriğinin silinmesi. Bu, dahili dosya sistemi bozulmuşsa da çözümdür.

OpenMV IDE’nin bunu yapmak için birkaç yerleşik yolu vardır. Önce kamerayı kurtarma/önyükleyici (bootloader) moduna alın — yöntem karttan karta farklılık gösterir, bu yüzden moda nasıl gireceğinizi öğrenmek için kartınızın hızlı başvuru sayfasındaki Recovery and debug pins bölümüne bakın. Ardından OpenMV IDE’de bağlan düğmesine tıklayın ve dosya sistemini silmek ve aygıt yazılımını yeniden yüklemek için yönergeleri izleyin.

Uyarı

Aygıt yazılımını dosya sistemini silmeden yeniden yüklemek, normal bir aygıt yazılımı güncellemesi dosya sisteminin içeriğini koruduğundan, yazılımsal tuğlalaşmadan kurtarmayı genellikle sağlamaz. OpenMV IDE bunu istediğinde silme seçeneğini seçtiğinizden emin olun.

Takılırsanız, OpenMV forumlarında sorun.