簡體   English   中英

ISR中聲明的C Global

[英]C Global declared in ISR

我正在為他們的ARM系列微控制器評估飛思卡爾的Kinetis Design Studio。 我正在看一個示例,作為做我的第一個“閃爍LED”項目的基礎。 當使用在我的主程序和ISR之間共享的變量(例如計數器)時,我通常會在main.c中定義一個volatile全局變量,並在ISR中將其引用為extern。 他們的例子恰恰相反,他們也沒有使用volatile關鍵字。 我從未見過這樣做。 這有好處嗎? 順便說一句,無論哪種方式,我的程序都可以正常工作。

丟失的volatile是一個錯誤( 盡管很常見 ),它本身應該是質量警告。 哪里來實例化一個全球性的選擇是任意的,但從一個凝聚點,是有意義的繼續,涉及到中斷的中斷數據。 就是說,使用全球數據本身就表明質量和實踐存在疑問。

利用數據封裝的更好模式是:


中斷

...

volatile static int counter = 0 ;
void interruptHandler()
{
    counter++ ;
}

int interruptCounter{ return counter } ;

...

中斷

...

extern int interruptCounter() ;

...

main.c

#include "interrupt.h"

    ...

    int icount = interruptCount() ;

    ...

我不知道codewarrior套件。 但是,通常, volatile告訴編譯器,該變量在正常控制流之外更改,如程序代碼所示。

從歷史上看,嵌入式編譯器對於不使用'volatile'和/或實施一些策略來支持不了解優化並“忘記” volatile經驗不足的程序員是相當寬容的。 但是,這將導致代碼優化不佳,特別是對於ARM平台而言(HC08&Co MCU始終必須從內存中加載每個變量的問題較少)。

盡管CW仍然可以忍受,但高度優化諸如gcc之類的代碼的編譯器並不能原諒和更徹底地進行優化。 如果您忘記了此類編譯器的volatile或障礙,則可能會遇到例如空的主循環。

即使您的代碼目前運行良好,啟用優化或更改次要(可能不相關)方面后,情況可能也會改變。

來自長期嵌入式開發人員的非常好的建議:使用volatile 請謹慎使用它(請在此處找到更多詳細信息),但請謹慎使用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM