2016-04-02 27 views
4

güvenli bir şekilde çalıştırılıyor düşük güç tüketimi modunda RAM'den çalıştırılan c kodum var (bu nedenle kesintiler ele alınmıyor). Kod dizisi ile etkin Bu mod:STM8 ASM, WFE

  • atlama
  • WFE modu ile bir işi yapmak düşük hızlı saat kaynağına iç flaş ve güç regülatörü, anahtarı (LSE)
  • SİM
  • anahtarı kapalı RAM
  • atlama
  • flaş (düşük güç bekleme modu) güç regülatör ve flaş üzerinde
  • anahtarı, geri saat kaynağı
  • RIM Bu nedenle, errata sayfasında açıklanan WFE talimatı ile ilgili bir sorun yoktur. zamanlayıcı gelen

    000035 720252B602  BTJT  TIM1_SR1, #1, 0xB6 
    00003A 728F   WFE 
    

    Olay bir olasılık doğası vardır ve bu: olarak sökme

    while nbit(TIM1_SR1,CC3IF) asm("wfe"); 
    

    şudur: Bu yapım ilgili sorun, sonsuza dek düşük güç bekleme modunda içinde CPU kilidin neden olabilir kod, WFE komutunun yürütülmesinden sonra gerçekleşeceğinin garanti edilmez:

  • BTJT talimatı 2 döngüde gerçekleştirilir ve uzunluk 5'e sahiptir; devletler Birkaç döngüden

Ben manuel PM0044 kullanın ve üzerinde yürütmeye ara "getir" çünkü RAM dan yürütülen

  • kod sürekli olmayabilir sayfada 26 o içeriğin oldukça tablosu:

    example code execution from RAM

    Kod yürütme 3 döngüde durduğunda 2 vaka var. Bu yüzden asenkronize uyandırma olayımın BTJT ve WFE talimatları arasında gerçekleşmeyeceğinden emin değilim.

    Sıkı bir mantıksal sekans sağlamak için yollar var mı (kontrol koşulu> wfe> uyandırma olayı)? OP tarafından bulunan

  • +0

    Ne sorduğun belli değil. WFE komutu yürütüldükten sonra CPU zaten bir olay tarafından uyandı ve aşağıdaki komut yürütüldü. Aşağıdaki talimat, BTJT talimatına geri sıçrayan JRA komutu olmalıdır. Sıra 1) test biti ve çıkış döngüsü ise 2) eğer uyandırma olayı için bekleyiniz 3) adım 1'e atlayın. Eğer WFE kontrol kayıtlarını doğru şekilde programladıysanız, sıra 1) test bitine eşdeğer ve çıkış olmalıdır. eğer set 2) döngü 1'e atlayın. WFE komutu sadece güç tasarrufu sağlar. –

    +0

    @Ross, Gerçekten düşündüğünüz gibi mi? _WFE komutu yürütüldükten sonra CPU zaten bir olay tarafından uyandı ve aşağıdaki komut yürütüldü. Şimdi Şimdi bu büyük kodun yapısının doğru olduğuna ve doğru yolun WFE girişini sadece oldukça büyük bir sınır varsa kullanacağına inanıyorum. zaman. Ve daha karmaşık durumlarda herhangi bir rakip uyandırma olayından sonra onu kullanmayın. – imbearr

    +0

    Açıkladığım şekilde çalıştığından eminim. WFE komutunun yürütülmesi sırasında CPU uykuda ve bir olayı beklemektedir. WFE komutunun yürütülmesi bittikten sonra CPU artık uykuda değildir ve artık bir etkinlik beklememektedir. Daha sonra, bir komutun yürütmeyi tamamladığında normalde olduğu gibi sonraki talimatı yürütür. Ancak, hala senin sorunun ne olduğunu görmüyorum. Bu yüzden aynı şeylerden söz etmeyebiliriz. Ne zaman büyük bir zaman sınırı çözer? –

    cevap

    1

    Çözüm:

    daha dikkatli doğrularını (Ross Ridge sayesinde) birkaç kez okudum ve bu ana fikir:

    Genel çözüm hiçbir kesinti isteği sağlamaktır veya WFE komutunun yürütülmesi veya yeniden yürütme döngüsü sırasında uygun uygulama zamanlamasıyla olay meydana gelir. Blokaj sorunları Sonra "doğru uygulama zamanlaması" elde etmek çalışırken daha kolay çözüm olması gerektiğini söz WFE doğrularını kaynaklanır Eğer

    5

    .

    errata provided by STMicroelectronics okur: başarısızlık

    İki tip oluşabilir:

    Vaka 1: WFE talimat bellek içinde 32 bit kelimenin iki MSB yerleştirilir durumda
    , WFE yürütme döngüsü veya yeniden yürütme döngüsü sırasında meydana gelen bir olay (ISR işleyicisinden döndüğünde) yanlış bir kod yürütülmesine neden olur.

    Durum 2:
    WFE yürütme döngüsü sırasında gerçekleşen bir kesme isteği, yanlış kod yürütülmesine neden olur. Eğer ben düşük güç çalıştırmak modunu kullanmak için kesmeler işlenmez" dedikleri gibi sizin için geçerli olmamalıdır bir ISR işleyicisi

    Durum 2 dönerken Bu, aynı zamanda WFE yeniden yürütme döngüsü için geçerlidir olduğunu ". WFE talimatı sırasında kesilmeleri mümkün değilse, sadece ilk durumda açıklanan arıza kilitlenmelere neden olabilir.

    Durum 1, yalnızca WFE yönergesi, bellekte 32 bitlik bir sözcük içinde belirli bir hizalamadaysa geçerlidir. Bu nedenle, WFE komutunun kodda hiçbir zaman bu şekilde hizalanmadığından emin olursanız, bu hatayla karşılaşmazsınız. Eğer toplayıcınız bir hizalama direktifini destekliyorsa, bunu başarabilirdiniz, belki de bir etiket ile birlikte ve NOP'ları takmıyorsa bir sıçrama ile birlikte.

    Bu 2- tutarı ne koyarak hatası bir çözüm gibi görünmektedir

     WFE 
        JRA next 
    next: 
    

    ile WFE talimat değiştirin: Ancak daha kolay bir çözüm doğrularını bir "özel çözüm" olarak verilir WFE komutundan sonra bayt NOP. Tahminim, işlemcinin WFE komutunu takip eden talimatı yerine getirmemesi, bir sonraki 32 bit dünyasının başlangıcında (eğer varsa) talimatın iki baytını atlamak yerine, başarısızlık sonucudur. Üzerine atlanan alanda 2 baytlık bir NOP koymak, başarısızlığın gerçekleşip gerçekleşmediği anlamına gelmez.

    +0

    doğru zamanlama sağlamak için kodu revize etmek çok zor değil ve bu benim görüşüme göre daha doğru bir yol. – imbearr