MTK系統(tǒng)錯(cuò)誤類(lèi)型分析
MTK系統(tǒng)錯(cuò)誤類(lèi)型分析是本文要介紹的內(nèi)容,主要是來(lái)了解MTK系統(tǒng)中出現(xiàn)的問(wèn)題,系統(tǒng)錯(cuò)誤中有兩種典型的分類(lèi),一種是CPU觸發(fā)的系統(tǒng)錯(cuò)誤,另外一種是軟件觸發(fā)的系統(tǒng)錯(cuò)誤。
1、CPU觸發(fā)(檢測(cè)到)的系統(tǒng)錯(cuò)誤
Undefined Instruction Exception(沒(méi)有定義的指令錯(cuò)誤)
本來(lái)的意思是指:ARM解析不了當(dāng)前指令如何執(zhí)行,換句話(huà)說(shuō),當(dāng)前指令不屬于ARM指令集。但是大家看到這里會(huì)感到納悶,這種錯(cuò)誤怎么可能會(huì)發(fā)生?除非ADS和RVCT等編譯器出現(xiàn)bug,否則這種錯(cuò)誤不可能沒(méi)有在編譯階段里揪出來(lái)。這些編譯器吃白米飯的么,連是不是ARM的指令集里的指令還不知道嗎?所以出現(xiàn)這種錯(cuò)誤一定不是代碼的問(wèn)題。出現(xiàn)這種錯(cuò)誤很可能是程序跑飛,跑到data區(qū)域執(zhí)行了。跑飛的原因有很多,如函數(shù)指針問(wèn)題,或者局部變量溢出把堆棧中的函數(shù)返回地址寫(xiě)壞了,等等
Software Interrupt Exception
給大家先看看有趣的東東,MTK介紹SWI exception類(lèi)型時(shí)寫(xiě)的:
- The software interrupt instruction (SWI) is used to enter Supervisor mode,
- usually to request a particular supervisor function.
借問(wèn)各位大俠,從上面那段話(huà)能知道SWI是exception么?我實(shí)在是忍無(wú)可忍,甚至達(dá)到了抓狂的程度??戳松厦娴慕忉?zhuān)耆悴欢甋WI與exception有絲毫關(guān)系。SWI其實(shí)可以解釋為軟件觸發(fā)中斷,但在MTK的系統(tǒng)中,不會(huì)用到這種軟中斷。所以假設(shè)軟中斷被觸發(fā)了,一定是程序跑飛了。到此,大家終于明白SWI為什么也算是exception一種了。
Pre-fetch Abort Exception
預(yù)取指令錯(cuò)誤是指CPU從RAM或者ROM中讀取指令時(shí),所提供的地址是個(gè)非法地址(RAM和ROM以外的地址)。一般是函數(shù)指針問(wèn)題,或者局部變量溢出把堆棧中的函數(shù)返回地址寫(xiě)壞了,等等
Data Abort Exception
數(shù)據(jù)錯(cuò)誤是指訪(fǎng)問(wèn)RAM或ROM中數(shù)據(jù)時(shí),所提供的地址是個(gè)非法地址(RAM和ROM以外的地址)。一般是數(shù)據(jù)指針出現(xiàn)問(wèn)題。
2、軟件觸發(fā)(檢測(cè)到)的系統(tǒng)錯(cuò)誤
Assert Error
程序員在代碼中埋的Assert語(yǔ)句,在MTK代碼中有3種:ASSERT(),EXT_ASSERT(),EXT_ASSERT_DUMP()
Fatal Error
可以理解為寫(xiě)在KAL層中的Assert語(yǔ)句,這是MTK的System工程師在KAL層埋的一些Assert語(yǔ)句。KAL層是系統(tǒng)的適配層,因此在這層里面出現(xiàn)問(wèn)題,一般都是與系統(tǒng)的異常相關(guān)。如:ctrl buffer不足,外部隊(duì)列滿(mǎn)了之類(lèi)的錯(cuò)誤
System Lockup
文檔中是寫(xiě)系統(tǒng)掛起。小弟不才,debug這么多年都未能與這種異常邂逅。
小結(jié):MTK系統(tǒng)錯(cuò)誤類(lèi)型分析的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!