2012-03-07 23 views

回答

1

對此,沒有萬能的答案。這取決於你的時間要求,現有的中斷負載等。

如果它是一個相當簡單的乘法或其他東西,那麼我只是在中斷,然後繼續前進。

只要確保你知道你在做什麼,不要在你的中斷中花費更多的時間。

3

你可以在中斷處理程序中做的工作越少越好。現在對您的應用程序來說可能不是什麼大問題,但是您的系統負載會更高,並且您不希望阻止其他更高優先級的任務來處理中斷。您可能希望查看信號燈和適當的多線程,而不是僅設置全局標誌。

+0

如果他運行裸機,他可能沒有信號量。 – 2012-03-07 22:27:16

+0

當然。但是,在實現基本線程和信號量方面沒有太多的開銷,並且它可以嚴重地減少編程過程。 – 2012-03-07 22:29:48

+0

@Carl,或許你可以詳細說明你使用信號量和線程的想法,以及如何讓編程更容易,因爲我看到它的方式,因爲我的應用程序已經非常複雜,在這個階段調整rtos似乎很可怕。 – 2012-03-07 22:42:18

2

這取決於你想要對ADC值做什麼,以及你需要多快。如果您需要根據ADC值採取一些時間關鍵的操作,則應該在中斷中處理這些操作。但是,如果是這種情況,爲了節省首次從ADC計數中計算「實際」模擬值的費用,您應該只根據ADC計數來表達您的關鍵閾值。例如,如果您的ADC每伏輸出8個計數,並且您需要在ADC報告電壓超過1.5伏時觸發緊急停止,則編寫您的中斷代碼以在12個計數處觸發緊急停止。然後,您仍然可以將ADC計數傳遞到主循環,以便轉換爲用戶界面用途的用戶友好型單元等。

一般原則是,爲了保證您能夠滿足截止日期,您構建您的應用程序和任何設置使其儘可能容易地達到最後期限。如果事情沒有嚴格的最後期限,把它放在主循環(一般來說)。

0

需要考慮的一件事是數據一致性。如果您從ADC獲得多個相關值(位置,電壓,電流等),那麼您可能需要做一些事情以確保您使用的是一致的設置。這可能意味着後臺更新比ISR中的更新要好。即使給定算法的一次讀數的一致性可能也很重要。考慮這個背景代碼。

delta = data-lastData; 
    //ISR could update data here. 
    lastData = data; 
    something = K1* data + K2 * delta; //this may be wrong now 
相關問題