0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Cortex-M0處理器內(nèi)核異常中斷簡(jiǎn)介

安芯教育科技 ? 來(lái)源:技術(shù)社區(qū) ? 作者:技術(shù)社區(qū) ? 2022-06-01 14:41 ? 次閱讀
1. Cortex-M0 處理器內(nèi)核異常中斷簡(jiǎn)介

在Cortex‐M0內(nèi)核上搭載了一個(gè)異常響應(yīng)系統(tǒng),支持眾多的系統(tǒng)異常和外部中斷。其中,編號(hào)為1-15的對(duì)應(yīng)系統(tǒng)異常,大于等于16的則全是外部中斷,優(yōu)先級(jí)的數(shù)值越小,則優(yōu)先級(jí)越高。除了個(gè)別異常的優(yōu)先級(jí)被定死外,其它異常的優(yōu)先級(jí)都是可編程的。

因?yàn)?a target="_blank">芯片設(shè)計(jì)可以修改內(nèi)核的硬件描述源代碼,所以做成芯片后,支持的中斷源數(shù)目常常不到240 個(gè),并且優(yōu)先級(jí)的位數(shù)也由芯片廠商最終決定。

e58c9a92-e168-11ec-ba43-dac502259ad0.png

類型編號(hào)為 1-15 對(duì)應(yīng)系統(tǒng)異常,在《ARM Cortex-M0權(quán)威指南》一書(shū)中的第12章節(jié)<錯(cuò)誤處理>章節(jié)中有描述:對(duì)于ARM處理器,架構(gòu)采用錯(cuò)誤異常的機(jī)制來(lái)檢測(cè)問(wèn)題,當(dāng)一個(gè)程序產(chǎn)生了錯(cuò)誤并且被處理器檢測(cè)到時(shí),異常中斷會(huì)被觸發(fā),并且核心會(huì)跳轉(zhuǎn)到相應(yīng)的異常終端處理函數(shù)執(zhí)行,錯(cuò)誤異常的中斷有如下:

Reset


在上下電、NRST拉低、看門狗復(fù)位或軟復(fù)位時(shí)啟動(dòng)復(fù)位。當(dāng)復(fù)位產(chǎn)生時(shí),處理器停止一切操作,并將復(fù)位當(dāng)做一種特殊形式的異常來(lái)執(zhí)行,進(jìn)入到對(duì)應(yīng)的中斷函數(shù)。當(dāng)復(fù)位撤銷時(shí),從向量表中復(fù)位項(xiàng)提供的地址處重新啟動(dòng)執(zhí)行,芯片重新開(kāi)始執(zhí)行。

NMI


不可屏蔽中斷(NMI),可以由外設(shè)產(chǎn)生,也可以由軟件來(lái)觸發(fā)。這是除復(fù)位之外優(yōu)先級(jí)最高的異常中斷,NMI永遠(yuǎn)使能,優(yōu)先級(jí)固定為-2,CSS的時(shí)鐘安全機(jī)制使能判定時(shí)鐘失效后就會(huì)進(jìn)入到該中斷。NMI 不能:


1、被屏蔽,它的執(zhí)行也不能被其他任何異常中止;
2、被除復(fù)位之外的任何異常搶占。

HardFault


HardFault 是由于在正常操作過(guò)程中或在異常處理過(guò)程中出現(xiàn)錯(cuò)誤而出現(xiàn)的一個(gè)異常。HardFault的優(yōu)先級(jí)固定為-1,表明它的優(yōu)先級(jí)要高于任何優(yōu)先級(jí)可配置的異常。

SVCall


管理程序調(diào)用(SVC)異常是一個(gè)由SVC指令觸發(fā)的異常。在OS環(huán)境下,應(yīng)用程序可以使用 SVC指令來(lái)訪問(wèn)OS內(nèi)核函數(shù)和器件驅(qū)動(dòng)。

PendSV


PendSV是一個(gè)中斷驅(qū)動(dòng)的系統(tǒng)級(jí)服務(wù)請(qǐng)求。在OS環(huán)境下,當(dāng)沒(méi)有其它異常有效時(shí),使用 PendSV 來(lái)進(jìn)行任務(wù)切換。

SysTick


SysTick是一個(gè)系統(tǒng)定時(shí)器到達(dá)零時(shí)產(chǎn)生的異常,軟件也可以產(chǎn)生一個(gè)SysTick異常。在OS環(huán)境下,處理器可以將這個(gè)異常用作系統(tǒng)節(jié)拍。

中斷(IRQ)


中斷(或 IRQ)是外設(shè)發(fā)出的一個(gè)異常,或者由軟件請(qǐng)求產(chǎn)生的一個(gè)異常。在系統(tǒng)中,外設(shè)使用中斷來(lái)與處理器通信,在中斷函數(shù)中可以查詢和清除標(biāo)志操作。

2. HardFault異常

HardFault (硬件錯(cuò)誤,也有譯為硬錯(cuò)誤)是在MCU上編寫程序中所產(chǎn)生的錯(cuò)誤,硬件錯(cuò)誤處理幾乎是最高優(yōu)先級(jí),它的優(yōu)先級(jí)為-1,只有復(fù)位和不可屏蔽中斷(NMI)可以對(duì)其進(jìn)行搶占。當(dāng)它發(fā)生時(shí),表示處理器出現(xiàn)了問(wèn)題,需要采取緊急修復(fù)措施。

造成HardFault錯(cuò)誤的可能原因較多,如何在代碼量較大的情況下,快速定位造成的HardFault的問(wèn)題代碼,就成為比較關(guān)鍵的問(wèn)題。

本文將以MM32F0130系列MCU為例,Keil-MDK開(kāi)發(fā)環(huán)境,總結(jié)HardFault的調(diào)試、定位方法。在其它Cortex-M0 (M3,M4)內(nèi)核處理器,和其它開(kāi)發(fā)環(huán)境下,也可作為參考。

2.1 可能的原因

《ARM Cortex-M0權(quán)威指南》中提到,關(guān)于 Cortex M0內(nèi)核主要有以下幾點(diǎn)引起HardFault的原因:

  • 非法存儲(chǔ)器訪問(wèn)

  • 非對(duì)齊數(shù)據(jù)訪問(wèn)

  • 從總線返回錯(cuò)誤

  • 異常處理中的棧被破壞

  • 程序在某些 C 函數(shù)中崩潰

  • 意外地試圖切換至 ARM 狀態(tài)

  • 在錯(cuò)誤的優(yōu)先級(jí)上執(zhí)行系統(tǒng)服務(wù)調(diào)用指令(SVC)

從軟件角度,產(chǎn)生HardFault的可能原因有:
  • 數(shù)組越界

  • 野指針

  • 未初始化硬件卻開(kāi)始操作,或無(wú)中斷服務(wù)函數(shù)等

  • 任務(wù)堆棧溢出

  • 中斷服務(wù)函數(shù)設(shè)置錯(cuò)誤

  • 時(shí)鐘異常

注意:只有復(fù)位和NMI可以搶占優(yōu)先級(jí)固定的 HardFault 處理程序。HardFault可以搶占除復(fù)位、NMI 或其它硬故障之外的任何異常。
2.2 可能出現(xiàn)的異常
如果在執(zhí)行NMI或HardFault處理程序時(shí),或者在一個(gè)使用MSP的異常返回時(shí)出棧的卻是PSR的時(shí)候系統(tǒng)產(chǎn)生一個(gè)總線錯(cuò)誤,處理器進(jìn)入一個(gè)鎖定狀態(tài)。當(dāng)處理器處于鎖定狀態(tài)時(shí),它不執(zhí)行任何指令。處理器保持處于鎖定狀態(tài),直到下面任何一種情況出現(xiàn):
  • 出現(xiàn)復(fù)位

  • 調(diào)試器將鎖定狀態(tài)終止,出現(xiàn)中止仿真的現(xiàn)象

  • 出現(xiàn)一個(gè)NMI,以及當(dāng)前的鎖定處于HardFault處理程序中

注意:如果鎖定狀態(tài)出現(xiàn)在NMI處理程序中,后面的NMI就無(wú)法使處理器離開(kāi)鎖定狀態(tài)。 在應(yīng)用程序中,處理器處于鎖定狀態(tài),會(huì)一直在void HardFault\_Handler(void)函數(shù)中執(zhí)行。
voidHardFault_Handler(void)
{/*GotoinfiniteloopwhenHardFaultexceptionoccurs*/
while(1)
{
}
}

下面將在MM32F0130上運(yùn)行的數(shù)組越界代碼為例,具體闡述定位步驟:

voidStackTest(void)
{intdata[3],i;
for(i=0;i<10000;?i++)
????{
????data[i]=1;
????}
}
3. 查找HardFault方法和步驟

實(shí)際環(huán)境中,由于測(cè)試高壓產(chǎn)品常常無(wú)法連接調(diào)試器,故需要代碼來(lái)定位目標(biāo)語(yǔ)句地址,并通過(guò)一定手段保存:

在MM32F0130中,需先修改啟動(dòng)文件startup\_mm32f013x.s:

HardFault_Handler
PROC
IMPORThard_fault_handler_c;函數(shù)聲明
MOVSr0,#4;判斷主棧指針還是進(jìn)程棧指針
MOVr1,LR
TSTr0,r1
BEQstacking_used_MSP;如果是主棧指針
MRSR0,PSP;否則是進(jìn)程棧指針,把進(jìn)程棧指針地址付給R0
Bget_LR_and_branch;跳轉(zhuǎn)到HardFault中斷程序
stacking_used_MSP
MRSR0,MSP;把主棧指針地址賦給R0
get_LR_and_branch
MOVR1,LR

BLhard_fault_handler_c
ENDP

該段代碼會(huì)判斷當(dāng)前堆棧使用的是MSP或PSP,然后將堆棧參數(shù)傳遞給hard\_fault\_handler\_c函數(shù),該函數(shù)定義如下:

voidhard_fault_handler_c(unsignedint*hardfault_args,unsignedlr_value)
{unsignedintstacked_r0;//壓棧的r0
unsignedintstacked_r1;//壓棧的r1
unsignedintstacked_r2;//壓棧的r2
unsignedintstacked_r3;//壓棧的r3
unsignedintstacked_r12;//壓棧的r12
unsignedintstacked_lr;//壓棧的lr
unsignedintstacked_pc;//壓棧的pc
unsignedintstacked_psr;//壓棧的psr

stacked_r0=((unsignedint)hardfault_args[0]);
stacked_r1=((unsignedint)hardfault_args[1]);
stacked_r2=((unsignedint)hardfault_args[2]);
stacked_r3=((unsignedint)hardfault_args[3]);
stacked_r12=((unsignedint)hardfault_args[4]);
stacked_lr=((unsignedint)hardfault_args[5]);
stacked_pc=((unsignedint)hardfault_args[6]);
stacked_psr=((unsignedint)hardfault_args[7]);

while(1)
{
printf("[Hardfaulthandler]
");
printf("R0=%x
",stacked_r0);
printf("R1=%x
",stacked_r1);
printf("R2=%x
",stacked_r2);
printf("R3=%x
",stacked_r3);
printf("R12=%x
",stacked_r12);
printf("StackedLR=%x
",stacked_lr);
printf("StackedPC=%x
",stacked_pc);
printf("StackedPSR=%x
",stacked_psr);
printf("SCB_SHCSR=%x
",SCB->SHCSR);
printf("CurrentLR=%x
",lr_value);
}
}

處理器進(jìn)入到HardFault,將R0~R3、R12、LR、PC信息通過(guò)串口打印,根據(jù)寄存器信息排查問(wèn)題代碼。

當(dāng)處理器處理異常時(shí),除非異常是一個(gè)末尾連鎖異?;蜻t來(lái)的異常,否則,處理器把信息都?jí)喝氲疆?dāng)前堆棧中入棧(stacking),8個(gè)數(shù)據(jù)字的結(jié)構(gòu)被稱為棧幀(stack frame),棧按照雙字地址對(duì)齊方式。

e6090e4c-e168-11ec-ba43-dac502259ad0.png

入棧后,堆棧指針立刻指向棧幀的最低地址單元。棧包含返回地址,這是被中止的程序中下條指令的地址。這個(gè)值在異常返回時(shí)返還給 PC,使被中止的程序恢復(fù)執(zhí)行。

如下圖連接仿真器查看匯編的地址可以找到是程序問(wèn)題,根據(jù)PC指針地址,在程序生成的.map中查找出問(wèn)題函數(shù)。

e6390cbe-e168-11ec-ba43-dac502259ad0.png

4. 處理建議

根據(jù)上述的定位手段可以查找是哪一種情況造成的異常,在編程過(guò)程中需要避免出現(xiàn)上述異常情況,但是在惡劣復(fù)雜的環(huán)境下,可能會(huì)小概率觸發(fā)HardFault中斷,可以在函數(shù)中添加復(fù)位或者跳轉(zhuǎn)指令,具體的實(shí)現(xiàn)方式需根據(jù)應(yīng)用和使用環(huán)境來(lái)評(píng)估。

原文標(biāo)題:HardFault定位方法和步驟

文章出處:【微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    18924

    瀏覽量

    227196
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    889

    瀏覽量

    41219
  • Cortex-M0
    +關(guān)注

    關(guān)注

    4

    文章

    124

    瀏覽量

    38550

原文標(biāo)題:HardFault定位方法和步驟

文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    采用ARM Cortex-M0處理器內(nèi)核 英飛凌XMC1302馬達(dá)控制解決方案

    XMC1300器件是基于XMC 1000系列微控制的成員,采用ARM Cortex-M0處理器內(nèi)核。 XMC1300系列解決了控制需要電機(jī)控制,數(shù)字電源轉(zhuǎn)換的實(shí)時(shí)性問(wèn)題。它還具有外設(shè)
    發(fā)表于 08-04 09:42 ?9338次閱讀
    采用ARM <b class='flag-5'>Cortex-M0</b><b class='flag-5'>處理器</b><b class='flag-5'>內(nèi)核</b>  英飛凌XMC1302馬達(dá)控制解決方案

    Cortex-M0處理器的基礎(chǔ)知識(shí)

    Cortex-M0處理器介紹
    發(fā)表于 02-26 06:03

    Cortex-M3處理器是什么

    STM32單片機(jī)STM32的核心Cortex-M3處理器是一個(gè)標(biāo)準(zhǔn)化的微控制結(jié)構(gòu),希望思考一下,何為標(biāo)準(zhǔn)化?簡(jiǎn)言之,Cortex-M3處理器
    發(fā)表于 07-16 06:33

    中斷事件的異常處理是什么意思

    M0內(nèi)核支持的資源Cortex-M0處理器最多支持32個(gè)外部中斷(通常稱作IRQ),還有一個(gè)被稱作不可屏蔽
    發(fā)表于 12-21 06:50

    制造一種基于Cortex-M0Cortex-M3處理器的SoC

    DesignStartDesignStart計(jì)劃可以讓用戶無(wú)需預(yù)付授權(quán)費(fèi)用,就可以開(kāi)始設(shè)計(jì)、制造基于Cortex-M0Cortex-M3處理器的SoC,當(dāng)產(chǎn)品成功量產(chǎn)出貨之后再支付版稅。ARM
    發(fā)表于 07-27 16:58

    ARM Cortex-M0處理器內(nèi)核LPC1100系列微控制

      恩智浦推出了基于32位ARM Cortex-M0處理器內(nèi)核的LPC1100系列微控制。該處理器是ARM公司
    發(fā)表于 08-31 09:09 ?3377次閱讀
    ARM <b class='flag-5'>Cortex-M0</b><b class='flag-5'>處理器</b><b class='flag-5'>內(nèi)核</b>LPC1100系列微控制

    基于ARM Cortex-M0處理器的LPC1200工業(yè)控制系列

    恩智浦半導(dǎo)體NXP Semiconductors N.V.今天宣布推出其基于ARM Cortex-M0處理器的LPC1200工業(yè)控制系列。LPC1200進(jìn)一步拓展了恩智浦32位ARM微控制的產(chǎn)品范圍,適用于工業(yè)和家庭自動(dòng)化領(lǐng)域
    發(fā)表于 02-24 10:00 ?1279次閱讀

    ARM為主流嵌入式SoC設(shè)計(jì)提供免費(fèi)的Cortex-M0處理器IP

    ARM公司今天宣布,將為采用ARM Cortex-M0處理器進(jìn)行商業(yè)化之前的SoC元件的設(shè)計(jì)、原型建模和制造的設(shè)計(jì)人員提供免費(fèi)的Cortex-M0處理器IP,以及低成本的FPGA原型建
    發(fā)表于 10-15 13:57 ?2584次閱讀

    ARM異常中斷的原因及處理措施

    當(dāng)ARM異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行完當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序執(zhí)行。當(dāng)異常中斷處理
    的頭像 發(fā)表于 06-17 10:05 ?7814次閱讀

    Cortex-M0處理器的存儲(chǔ)模型資料下載

    電子發(fā)燒友網(wǎng)為你提供Cortex-M0處理器的存儲(chǔ)模型資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-08 08:40 ?10次下載
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>處理器</b>的存儲(chǔ)模型資料下載

    Cortex-M0處理器異常處理模型資料下載

    電子發(fā)燒友網(wǎng)為你提供Cortex-M0處理器異常處理模型資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可
    發(fā)表于 04-08 08:41 ?15次下載
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>處理器</b>的<b class='flag-5'>異常</b><b class='flag-5'>處理</b>模型資料下載

    Cortex-M0處理器的故障處理和功耗管理資料下載

    電子發(fā)燒友網(wǎng)為你提供Cortex-M0處理器的故障處理和功耗管理資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-08 08:42 ?4次下載
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>處理器</b>的故障<b class='flag-5'>處理</b>和功耗管理資料下載

    Cortex-M0處理器的編程模型資料下載

    電子發(fā)燒友網(wǎng)為你提供Cortex-M0處理器的編程模型資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-11 08:42 ?12次下載
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>處理器</b>的編程模型資料下載

    Cortex-M0處理器及其特性資料下載

    電子發(fā)燒友網(wǎng)為你提供Cortex-M0處理器及其特性資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-13 08:47 ?15次下載
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>處理器</b>及其特性資料下載

    Cortex-M0處理器中斷請(qǐng)求形式:電平觸發(fā)和脈沖輸入

    Cortex-M0處理器允許兩種形式的中斷請(qǐng)求:電平觸發(fā)和脈沖輸入。
    的頭像 發(fā)表于 05-13 12:05 ?1543次閱讀