EFM Gekko denetleyicilerini (http://energymicro.com/) kullanarak pille çalışan yazılımlar geliştirmeye çalışıyorum ve bunun için yararlı bir şey olmadığında denetleyicinin uykuda olmasını istiyorum. WFI (Kesmeyi Bekle) komutu bu amaç için kullanılır; bir kesinti gerçekleşinceye kadar işlemciyi uyku moduna geçirir.
Bir yerde bir şey saklayarak uyku meşgul olsaydı, biri gibi bir şey yapmak için yüke özel / mağazaya özel işlemleri kullanabilir:
// dont_sleep bir şey olduğunda 2 ile yüklenir // ana döngüyü en az bir kez dönmeye zorlamalıdır. Bir kesinti varsa // aşağıdaki ifade sırasında 2'ye sıfırlanmasına neden olur, // davranış, kesintiden sonra gerçekleşmiş gibi olacaktır. store_exclusive (yük_exclusive (dont_sleep) >> 1); iken (! dont_sleep) { // Bir sonraki ifade ile store_exclusive arasında kesinti olursa uyuma load_exclusive (SLEEP_TRIGGER); eğer (! dont_sleep) (SLEEP_TRIGGER) store_exclusive; }
Load_exclusive ve store_exlusive işlemleri arasında bir kesinti gerçekleşirse, etki store_exclusive'i atlamak ve böylece sistemin döngüden bir kez daha geçmesine (kesmenin dont_sleep ayarlayıp ayarlamadığını görmek) neden olur. Ne yazık ki, Gekko uyku modunu tetiklemek için bir yazma adresi yerine bir WFI talimatı kullanır; gibi kod yazmak
eğer (! dont_sleep) WFI ();
'if' ve 'wfi' arasında bir kesinti oluşması ve dont_sleep ayarlaması riskini doğurur, ancak wfi devam eder ve yine de yürütür. Bunu önlemek için en iyi model nedir? Kesintilerin WFI'yi çalıştırmadan hemen önce işlemciyi kesmesini önlemek için PRIMASK'ı 1 olarak ayarlayın ve hemen ardından silinsin mi? Yoksa daha iyi bir hile var mı?
DÜZENLE
Olay bitini merak ediyorum. Genel açıklamaya göre, çoklu işlemci desteği için tasarlanmış gibi görünüyor, ancak aşağıdakine benzer bir şeyin işe yarayıp yaramayacağını merak ediyordu:
eğer (dont_sleep) SEV (); / * WFE net etkinlik bayrağını takip edecek, ancak uyuyamayacak * / WFE ();
Don't_sleep ayarlayan her kesme de bir SEV komutu yürütmelidir, bu nedenle kesme "if" testinden sonra gerçekleşirse, WFE olay bayrağını temizler ancak uyku moduna geçmez. Bu iyi bir paradigma gibi mi görünüyor?