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

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

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

如何判斷CPU是否正在執(zhí)行中斷函數(shù)?

5RJg_mcuworld ? 來(lái)源:未知 ? 作者:胡薇 ? 2018-09-04 17:30 ? 次閱讀

1.這是一個(gè)有許多經(jīng)驗(yàn)的攻城獅都遇到過(guò)的坑,本文教你正確繞過(guò)這個(gè)坑;

2.教大家了解__get_CONTROL的用法,及xQueueSend和xQueueSendFromISR的區(qū)別;

Ⅰ問(wèn)題來(lái)源

今天在FreeRTOS系統(tǒng)上移植了部分別人寫的代碼,移植前仔細(xì)看了下源碼,確認(rèn)沒(méi)問(wèn)題后,編譯,下載,運(yùn)行,突然“死機(jī)了”······

于是,我又再次確認(rèn)了移植的代碼,沒(méi)有發(fā)現(xiàn)Bug所在。此時(shí),我開(kāi)啟了在線調(diào)試功能,發(fā)現(xiàn)程序死在了“vPortEnterCritical”函數(shù)中的斷言語(yǔ)句里。如下:

Ⅱ解決問(wèn)題的過(guò)程

我解決問(wèn)題還是按照常規(guī)思維,一步一步跟蹤,很多問(wèn)題其實(shí)都是類似道理,有規(guī)律可循。

1.查看configASSERT斷言做了什么事?

跟蹤代碼:

#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

其中,里面taskDISABLE_ INTERRUPTS();就是關(guān)中斷的意思。緊跟著后面執(zhí)行了for( ;; );

看到這里,我明白了一點(diǎn),就是死在for( ;; );里面了。

2.進(jìn)一步查找問(wèn)題

我又開(kāi)始了思考,為什么會(huì)執(zhí)行到這里來(lái)呢?為什么會(huì)執(zhí)行portDISABLE_INTERRUPTS(); uxCriticalNesting++; if( uxCriticalNesting == 1 )等這些語(yǔ)句呢?

這就是我們常說(shuō)的“臨界段”,這一點(diǎn)我學(xué)習(xí)RTOS的時(shí)候已經(jīng)明白了,這一個(gè)函數(shù)肯定會(huì)被調(diào)用。于是,我把目標(biāo)鎖定了portNVIC_INT_CTRL_REG這個(gè)參數(shù)

#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )

0xe000ed04? 這個(gè)地址,相信之前了解過(guò)NVIC的都知道,就是Interrupt control state register.即中斷控制狀態(tài)寄存器。

3.確定問(wèn)題點(diǎn)

從上面的分析,其實(shí)問(wèn)題都已經(jīng)浮現(xiàn)出來(lái)了。于是查看了【Cortex-M3權(quán)威指南】中相關(guān)的內(nèi)容。(PS:這本手冊(cè)真的能解決很多問(wèn)題,翻譯成中文,對(duì)大部分朋友來(lái)說(shuō)是一件好事)

其實(shí),有這個(gè)一個(gè)寄存器:控制寄存器(CONTROL),里面講述的非常清楚:

看上圖,大概意思就是:在中斷模式下,CONTROL[1]為0。于是,又把思路轉(zhuǎn)向了core_cm3.c文件中的源碼:

__ASM uint32_t __get_CONTROL(void) { mrs r0, control bx lr }

懂一點(diǎn)匯編的,相信在這里都已經(jīng)明白,大概意思就是過(guò)去控制寄存器狀態(tài),這也是我開(kāi)篇說(shuō)的,讓大家了解的__get_CONTROL。

4.在線調(diào)試,分析結(jié)論

上面分析出來(lái)控制寄存器CONTROL,那么我們需要驗(yàn)證是否符合我們預(yù)期的效果,通過(guò)在線調(diào)試,斷電就可得出,如下面兩圖:

a.在非中斷情況下的值0x02

b.在中斷情況下的值0x00

至此,問(wèn)題已經(jīng)查明就是CONTROL。

Ⅲget_CONTROL的應(yīng)用

一般在RTOS實(shí)時(shí)操作系統(tǒng)中,常常使用隊(duì)列來(lái)處理我們的數(shù)據(jù),也就是常說(shuō)的FIFO(先入先出)。

比如:我們?cè)贔reeRTOS系統(tǒng)中,要將UART發(fā)送、或者接收的數(shù)據(jù)加入隊(duì)列:在中斷里加入隊(duì)列,在非中斷里加入隊(duì)列。這個(gè)時(shí)候,就需要使用get_CONTROL來(lái)判斷當(dāng)前是否處于中斷函數(shù)里。

當(dāng)然,類似的情況很多,像CAN、I2C、SPI等一樣的道理。

舉例,CAN總線發(fā)送數(shù)據(jù)加入隊(duì)列:

Ⅳ多說(shuō)兩句

以上的分析,看似很簡(jiǎn)單,其實(shí)包含的內(nèi)容很多,可能有很多人覺(jué)得:這些問(wèn)題對(duì)于我來(lái)說(shuō)是小菜一碟。

說(shuō)句實(shí)話,我和大家一樣,都是慢慢學(xué)習(xí)過(guò)來(lái)的,這里面跳過(guò)的坑其實(shí)很多,是因?yàn)槲姨^(guò)了太多的坑,所以才會(huì)對(duì)一些問(wèn)題更加了解。

上面類似的問(wèn)題,在我學(xué)習(xí)RTOS、移植CANOpen等等那些時(shí)候都有遇到過(guò),想要知道我遇到那些問(wèn)題,處理起來(lái)難不難,明確回答:很多問(wèn)題在初學(xué)的時(shí)候都很難,但我還是走過(guò)來(lái)了。

說(shuō)到這里,多說(shuō)一句,關(guān)于問(wèn)問(wèn)題的話,后臺(tái)每天都有許多人問(wèn)我問(wèn)題,但是有些問(wèn)題其實(shí)真的很簡(jiǎn)單,比如:編譯有個(gè)變量未調(diào)用的警告、重復(fù)定義,多了一個(gè)分號(hào)等,這些看一下提示都知道。不要告訴我你英語(yǔ)差,我英語(yǔ)初高中從來(lái)都沒(méi)有及格過(guò),依然還是得看英文手冊(cè)。確實(shí)不懂,安裝一個(gè)翻譯軟件不難吧。

聲明:本文內(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)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10813

    瀏覽量

    210905
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4730

    瀏覽量

    68259

原文標(biāo)題:如何判斷CPU是否正在執(zhí)行中斷函數(shù)?

文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于CPU中斷技術(shù)的理論剖析

    計(jì)算機(jī)處于執(zhí)行期間,系統(tǒng)內(nèi)發(fā)生了非尋?;蚍穷A(yù)期的急需處理事件,CPU暫時(shí)中斷當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行
    的頭像 發(fā)表于 04-14 10:31 ?5723次閱讀
    關(guān)于<b class='flag-5'>CPU</b><b class='flag-5'>中斷</b>技術(shù)的理論剖析

    單片機(jī)main函數(shù)中斷函數(shù)執(zhí)行?

    最近看了硬漢分享的一個(gè)內(nèi)容:為什么復(fù)位中斷服務(wù)程序里面直接調(diào)用的main函數(shù),難道所有程序都在復(fù)位中斷里面執(zhí)行的?
    發(fā)表于 10-24 11:04 ?920次閱讀

    請(qǐng)問(wèn)一下中斷是如何執(zhí)行

    CPU正常執(zhí)行主程序②定時(shí)器TH0,TL0計(jì)滿溢出,中斷標(biāo)志位TF0置1③CPU執(zhí)行正在進(jìn)行
    發(fā)表于 01-11 06:05

    關(guān)于如何判斷CPU是否正在執(zhí)行中斷函數(shù)

    如何判斷CPU是否正在執(zhí)行中斷函數(shù)?
    的頭像 發(fā)表于 03-12 11:25 ?2547次閱讀

    什么是中斷 stm32中斷服務(wù)函數(shù)

    中斷概念: 中斷是指在計(jì)算機(jī)執(zhí)行期間,系統(tǒng)內(nèi)發(fā)生任何非尋常的或非預(yù)期的急需處理事件,使得CPU暫時(shí)中斷當(dāng)前
    的頭像 發(fā)表于 07-22 11:09 ?7182次閱讀

    51單片機(jī)——中斷

    **## 51單片機(jī)——中斷器**計(jì)算機(jī)正在執(zhí)行當(dāng)前程序,有中斷信號(hào)到來(lái)時(shí),則停止當(dāng)前程序的執(zhí)行 ,轉(zhuǎn)到終端服務(wù)子
    發(fā)表于 11-20 17:06 ?24次下載
    51單片機(jī)——<b class='flag-5'>中斷</b>器

    C51教程 第四個(gè)51程序:中斷控制--外部中斷0

    單片機(jī)在中斷發(fā)生時(shí),就立即停止執(zhí)行正在執(zhí)行的內(nèi)容,而去執(zhí)行中斷服務(wù)
    發(fā)表于 11-22 12:06 ?7次下載
    C51教程   第四個(gè)51程序:<b class='flag-5'>中斷</b>控制--外部<b class='flag-5'>中斷</b>0

    C51編程13-中斷篇(外部中斷

    CPU執(zhí)行的過(guò)程中,一般來(lái)說(shuō)都是在執(zhí)行主程序(main函數(shù)里面的代碼)。如果希望處理其他的功能,可以通過(guò)查詢的方式進(jìn)行,判斷
    發(fā)表于 11-22 12:51 ?9次下載
    C51編程13-<b class='flag-5'>中斷</b>篇(外部<b class='flag-5'>中斷</b>)

    中斷服務(wù)子程序是如何被執(zhí)行的 ?

    筆者在 《程序是如何在 CPU 中運(yùn)行的(二)》中從 PC 指針寄存器的角度分析了一級(jí)函數(shù)調(diào)用和二級(jí)函數(shù)調(diào)用執(zhí)行的過(guò)程,那么中斷服務(wù)子程序.
    發(fā)表于 02-07 11:02 ?2次下載
    <b class='flag-5'>中斷</b>服務(wù)子程序是如何被<b class='flag-5'>執(zhí)行</b>的 ?

    單片機(jī)C語(yǔ)言函數(shù)中斷函數(shù)中斷服務(wù)程序)

    中斷響應(yīng)與返回:CPU采集到中斷請(qǐng)求信號(hào),怎樣轉(zhuǎn)向特定的中斷服務(wù)子程序,并在執(zhí)行完之后返回被中斷
    發(fā)表于 02-10 11:21 ?0次下載
    單片機(jī)C語(yǔ)言<b class='flag-5'>函數(shù)</b>之<b class='flag-5'>中斷</b><b class='flag-5'>函數(shù)</b>(<b class='flag-5'>中斷</b>服務(wù)程序)

    FreeRTOS用二進(jìn)制信號(hào)量可以減少判斷語(yǔ)句的資源消耗

    系統(tǒng)判斷,會(huì)占用CPU的很大資源,以上示例中判斷按鍵是否按下,可以用中斷處理。在中斷中必須調(diào)用
    的頭像 發(fā)表于 09-15 11:43 ?1012次閱讀

    單重中斷與多重中斷介紹

    單重中斷與多重中斷 ?單重中斷CPU執(zhí)行中斷服務(wù)程序的過(guò)程中不能被打斷。當(dāng)有新的更高優(yōu)先級(jí)的
    的頭像 發(fā)表于 10-30 16:46 ?3084次閱讀
    單重<b class='flag-5'>中斷</b>與多重<b class='flag-5'>中斷</b>介紹

    MCS-51單片機(jī)外部中斷詳解

    CPU執(zhí)行的過(guò)程中,一般來(lái)說(shuō)都是在執(zhí)行主程序(main函數(shù)里面的代碼)。如果希望處理其他的功能,可以通過(guò)查詢的方式進(jìn)行,判斷
    的頭像 發(fā)表于 11-01 17:48 ?1754次閱讀
    MCS-51單片機(jī)外部<b class='flag-5'>中斷</b>詳解

    GD32 MCU是如何進(jìn)入中斷函數(shù)

    用過(guò)GD32 MCU的小伙伴們都知道,程序是順序執(zhí)行的,但當(dāng)有中斷來(lái)的時(shí)候程序會(huì)跳轉(zhuǎn)到中斷函數(shù),執(zhí)行
    的頭像 發(fā)表于 01-30 09:45 ?961次閱讀
    GD32 MCU是如何進(jìn)入<b class='flag-5'>中斷</b><b class='flag-5'>函數(shù)</b>的

    CPU中斷程序:從硬件看什么是中斷?

    CPU響應(yīng)中斷轉(zhuǎn)去執(zhí)行中斷服務(wù)程序前,需要把被中斷程序的現(xiàn)場(chǎng)信息保存起來(lái),以便執(zhí)行
    發(fā)表于 03-26 11:36 ?2855次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>中斷</b>程序:從硬件看什么是<b class='flag-5'>中斷</b>?