2016-04-02 81 views
4

我有c代碼從RAM運行在低功耗運行模式(所以中斷沒有處理)。該模式由代碼序列啓用:STM8 ASM安全地執行WFE

  • 跳轉到RAM
  • SIM
  • 關掉內部閃存,和功率調節器,切換到低速時鐘源(LSE)
  • 做WFE模式一些工作(低功率等待模式)
  • 開關功率調節器和閃光燈,恢復時鐘源
  • RIM
  • 跳閃

因此,在勘誤表中描述的WFE指令沒有問題。這種結構的問題,也可能是CPU鎖定的原因在低功率等待模式永遠:

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

即拆卸爲:

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

從計時器事件具有概率性質,並且這代碼不能保證它會在WFE指令執行後發生:

  • BTJT指令在2個週期中執行,長度爲5;從RAM中執行
  • 代碼可以是不連續的,因爲「獲取」國家對少數週期

我使用手動PM0044,並暫停執行在第26頁它裏面的內容相當表:

example code execution from RAM

有兩種情況下,代碼執行停止3個週期。所以我不確定我的異步喚醒事件不會發生在BTJT和WFE指令之間。

是否有辦法確保嚴格的邏輯順序(檢查條件> wfe>喚醒事件)?由OP發現

+0

目前還不清楚你在問什麼。 WFE指令執行後,CPU已被事件喚醒並執行以下指令。以下指令應該是跳回到BTJT指令的JRA指令。序列爲1)測試位和退出循環(如果已設置)2)等待喚醒事件3)跳到步驟1.如果已經正確編程了WFE控制寄存器,則它應該等同於序列1)測試位並退出循環如果設置2)跳轉到步驟1.WFE指令只是節省電力。 –

+0

@羅斯,這是真的嗎? _執行WFE指令後,CPU已被事件喚醒並執行以下指令。現在,我相信這種可靠的代碼結構,正確的做法是隻有在WFE指令有相當大的空白時間。在更復雜的情況下,不要在任何對手發生事件後使用它。 – imbearr

+0

我確定它按我描述的方式工作。在執行WFE指令期間,CPU正在睡眠並等待事件。 WFE指令執行完成後,CPU不再睡着,不再等待事件。然後執行下一條指令,就像通常在指令完成執行時發生的那樣。但是,我仍然沒有看到你的問題是什麼。所以我們可能不會談論同樣的事情。大部分時間將解決什麼問題? –

回答

1

解決方案:

我已閱讀勘誤表(感謝羅斯嶺)幾次用心,這是主要的想法:

一般的解決辦法是,以確保沒有中斷請求或事件發生在WFE指令執行或重新執行週期的適當的應用程序時間。

5

如果您的鎖定問題是由我提到的WFE勘誤引起的,那麼應該比嘗試實現「正確的應用程序時序」更簡單的解決方案。

errata provided by STMicroelectronics讀取:可發生

兩種類型的故障:

情況1:
如果WFE指令被置於 32位字的兩個MSB在存儲器內, WFE 執行週期或重新執行週期期間(從ISR 處理程序返回時)發生的事件將導致不正確的代碼執行。

案例2:
在WFE 執行週期中發生的中斷請求將導致不正確的代碼執行。這也是 有效期爲WFE重新執行週期,而從ISR 處理

案例2回,你說的「中斷不被處理,因爲我用的低功耗運行模式不應該在你的案件,不適用」。如果在WFE指令期間不能發生中斷,則只有第一種情況中描述的故障可能導致鎖定。

情況1只適用於WFE指令在內存中的32位字內的某種對齊方式。因此,如果您可以確保WFE指令永遠不會以代碼對齊的方式出現,那麼您將不會遇到此故障。如果你的彙編程序支持一個align指令,你可以用它來實現這一點,如果彙編程序沒有插入NOP,可能還會有一個標籤和一個跳轉。然而,一個簡單的解決方案是作爲勘誤表「專用解決辦法」:

 WFE 
    JRA next 
next: 

這似乎是通過將一個相當於一個2 - 工作繞過故障更換WFE指令在WFE指令之後的字節NOP。我的猜測是,CPU不會立即執行WFE指令之後的指令,而是在下一個32位世界開始時向前跳過兩個字節的指令(如果有的話)。在跳過的空間中放置一個2字節的NOP意味着發生故障或不發生故障。

+0

修改代碼以確保正確的時間並不困難,這對我的意見來說是更正確的方法。 – imbearr