嵌入式中断服务函数的一些特点
? ? ? ? 中斷是嵌入式系統(tǒng)中重要的組成部分,但是在標(biāo)準(zhǔn)C中不包含中斷。許多編譯開(kāi)發(fā)商在標(biāo)準(zhǔn)C上增加了對(duì)中斷的支持,提供新的關(guān)鍵字用于標(biāo)示中斷服務(wù)程序 (ISR),類(lèi)似于__interrupt、#program interrupt等。當(dāng)一個(gè)函數(shù)被定義為ISR的時(shí)候,編譯器會(huì)自動(dòng)為該函數(shù)增加中斷服務(wù)程序所需要的中斷現(xiàn)場(chǎng)入棧和出棧代碼。
中斷服務(wù)程序需要滿(mǎn)足如下要求:
(1)不能返回值;
(2)不能向ISR傳遞參數(shù);
(3) ISR應(yīng)該盡可能的短小精悍;
(4) printf(char * lpFormatString,…)函數(shù)會(huì)帶來(lái)重入和性能問(wèn)題,不能在ISR中采用。
?
參閱網(wǎng)上資料和個(gè)人的一些理解
A.為什么不能有返回值?
中斷服務(wù)函數(shù)的調(diào)用是硬件級(jí)別的,當(dāng)中斷產(chǎn)生,pc指針強(qiáng)制跳轉(zhuǎn)到對(duì)應(yīng)的中斷服務(wù)函數(shù)入口,進(jìn)入中斷具有隨機(jī)性,并不是某段代碼對(duì)其進(jìn)行調(diào)用,那么如果有返回值它的返回值返回給誰(shuí)?顯然這個(gè)返回值毫無(wú)意義,如果有返回值,它必定需要進(jìn)行壓棧操作,這樣一來(lái)何時(shí)出棧怎么出棧將變得無(wú)法解決。
B.不能向ISR傳遞參數(shù)?
同理,也是由于這樣會(huì)破壞棧的原因,因?yàn)楹瘮?shù)傳遞參數(shù)必定會(huì)要求壓棧出棧操作,由于進(jìn)入中斷服務(wù)函數(shù)的隨機(jī)行,誰(shuí)給它傳遞參數(shù)都成問(wèn)題
C.ISR應(yīng)盡可能的短小精悍?
如果某個(gè)中斷頻繁產(chǎn)生,而它對(duì)應(yīng)的ISR相當(dāng)?shù)暮臅r(shí),那么對(duì)中斷的響應(yīng)就會(huì)無(wú)限的延遲,會(huì)丟掉很多的中斷請(qǐng)求
D.printf(char * lpFormatString,…)函數(shù)會(huì)帶來(lái)重入和性能問(wèn)題,不能在ISR中采用。
這就涉及到一個(gè)中斷嵌套問(wèn)題,由于printf之類(lèi)的glibc函數(shù)采用的是緩沖機(jī)制,這個(gè)緩沖區(qū)是共享的,相當(dāng)于一個(gè)全局變量,第一層中斷來(lái)時(shí),它向緩沖里面寫(xiě)入一些部分內(nèi)容,恰好這時(shí)來(lái)了個(gè)優(yōu)先級(jí)更高的中斷,它同樣調(diào)用了printf,也向緩沖里面寫(xiě)入一些內(nèi)容,這樣緩沖區(qū)的內(nèi)容就錯(cuò)亂了。
?
原網(wǎng)址:http://www.cnblogs.com/thammer/p/5017329.html
(SAW:Game Over!)
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的嵌入式中断服务函数的一些特点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C/Cpp / static 关键字
- 下一篇: 网络通信之 字节序转换原理与网络字节序、