91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-12 11:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

    文章

    11279

    瀏覽量

    225022
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    866

    瀏覽量

    123014
  • FreeRTOS
    +關(guān)注

    關(guān)注

    14

    文章

    499

    瀏覽量

    66945
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    怎樣判斷步進(jìn)電機(jī)是否壞了?

    步進(jìn)電機(jī)作為自動(dòng)化設(shè)備中的關(guān)鍵部件,其運(yùn)行狀態(tài)直接影響整個(gè)系統(tǒng)的穩(wěn)定性。當(dāng)設(shè)備出現(xiàn)異常時(shí),如何快速準(zhǔn)確地判斷步進(jìn)電機(jī)是否損壞?本文將從現(xiàn)象觀察、工具檢測(cè)、常見(jiàn)故障類型及維修建議四個(gè)維度,提供一套系統(tǒng)化的診斷方法。
    的頭像 發(fā)表于 03-05 17:33 ?823次閱讀

    請(qǐng)問(wèn)如何從一個(gè)函數(shù)內(nèi)部判斷函數(shù)是否是個(gè)成員函數(shù)還是個(gè)非成員函數(shù)?

    如何從一個(gè)函數(shù)內(nèi)部判斷函數(shù)是否是個(gè)成員函數(shù)還是個(gè)非成員函數(shù)?
    發(fā)表于 01-06 06:30

    CW32學(xué)習(xí)筆記,通用異步收發(fā)器之中斷接收

    的。想象現(xiàn)在CPU正在執(zhí)行一個(gè)函數(shù)function(),倘若函數(shù)還未執(zhí)行完成,
    發(fā)表于 12-12 07:45

    如何通過(guò)性能表現(xiàn)判斷備用電池是否需要更換?

    通過(guò)性能表現(xiàn)判斷備用電池是否需要更換,核心是驗(yàn)證電池的 實(shí)際供電能力 和 充電穩(wěn)定性 ,因?yàn)檫@直接決定了主電源中斷時(shí)能否保障裝置數(shù)據(jù)不丟失。具體可從 放電續(xù)航、充電效率、供電可靠性 三個(gè)維度開(kāi)展測(cè)試
    的頭像 發(fā)表于 12-10 11:19 ?964次閱讀
    如何通過(guò)性能表現(xiàn)<b class='flag-5'>判斷</b>備用電池<b class='flag-5'>是否</b>需要更換?

    如何判斷備用電池是否需要更換?

    判斷電能質(zhì)量在線監(jiān)測(cè)裝置備用電池是否需要更換,需結(jié)合 電池狀態(tài)參數(shù)、性能表現(xiàn)、物理外觀 三個(gè)維度的指標(biāo)綜合判定,同時(shí)參考電池使用年限和工業(yè)現(xiàn)場(chǎng)的特殊損耗情況,具體判斷標(biāo)準(zhǔn)和方法如下: 一、通過(guò)核心
    的頭像 發(fā)表于 12-10 11:17 ?540次閱讀
    如何<b class='flag-5'>判斷</b>備用電池<b class='flag-5'>是否</b>需要更換?

    mcu短時(shí)間內(nèi)發(fā)生多次中斷,如何解決中斷丟失問(wèn)題呢?

    ?例如:中斷A在短時(shí)間內(nèi)觸發(fā)了3次,但是CPU來(lái)不及響應(yīng)(中斷A的執(zhí)行函數(shù)時(shí)間長(zhǎng),或者正在
    發(fā)表于 12-05 07:07

    關(guān)于蜂鳥(niǎo)E203內(nèi)核中斷硬件實(shí)現(xiàn)中斷嵌套的設(shè)計(jì)

    嵌套,可以有很多層(蜂鳥(niǎo)處理器該情況下不響應(yīng)新的中端,繼續(xù)執(zhí)行正在處理的ISR,徹底完成后才響應(yīng)新的中斷請(qǐng)求) 注意:假設(shè)新來(lái)的中斷請(qǐng)求的優(yōu)先級(jí)比
    發(fā)表于 10-23 07:07

    如何判斷射頻模塊的硬件是否損壞?

    判斷射頻模塊(如射頻信號(hào)發(fā)生器中的核心模塊)的硬件是否損壞,需圍繞 “ 直觀物理異常、功能完全失效、參數(shù)極端異常、拆解后硬件特征 ” 四大維度展開(kāi),核心是區(qū)分 “硬件損壞(突發(fā)性、不可逆故障
    的頭像 發(fā)表于 10-14 17:36 ?1097次閱讀

    rt_tick_increase 引用指針變量未判斷是否為空?

    此指針變量使用之前沒(méi)有判斷是否為空,萬(wàn)一rt_system_scheduler_start此函數(shù)調(diào)用之前來(lái)滴答定時(shí)器的中斷了,這樣操作是不是會(huì)有風(fēng)險(xiǎn)
    發(fā)表于 10-09 08:07

    如何判斷通信問(wèn)題是否由設(shè)備故障引起?

    判斷通信問(wèn)題是否由 “設(shè)備故障” 引起,核心邏輯是“聚焦設(shè)備本身的‘硬件狀態(tài)、軟件配置、通信交互能力’,通過(guò)‘孤立測(cè)試 + 替換驗(yàn)證 + 故障定位’,排除鏈路、干擾、配置等外部因素,確認(rèn)問(wèn)題是否
    的頭像 發(fā)表于 09-25 14:19 ?1377次閱讀
    如何<b class='flag-5'>判斷</b>通信問(wèn)題<b class='flag-5'>是否</b>由設(shè)備故障引起?

    求助,關(guān)于RT-Thread 最新版本timer.c rt_timer_check函數(shù)問(wèn)題求解

    關(guān)于系統(tǒng)定時(shí)器超時(shí)處理函數(shù)rt_timer_check,V5.1.0版本和原來(lái)v4.1.1版本有個(gè)區(qū)別在于,進(jìn)入超時(shí)回調(diào)函數(shù)t-&gt;timeout_func(t-&
    發(fā)表于 09-25 07:00

    如果在FMC執(zhí)行“程序”或“擦除”時(shí)發(fā)生中斷事件,是否會(huì)處理中斷事件?

    如果在FMC執(zhí)行“程序”或“擦除”時(shí)發(fā)生中斷事件,是否會(huì)處理中斷事件?
    發(fā)表于 08-27 08:01

    如果在FMC執(zhí)行“程序”或“擦除”時(shí)發(fā)生中斷事件,是否會(huì)處理中斷事件呢?

    如果在FMC執(zhí)行“程序”或“擦除”時(shí)發(fā)生中斷事件,是否會(huì)處理中斷事件?
    發(fā)表于 08-22 06:58

    如何判斷伺服電機(jī)是否損壞

    伺服電機(jī)作為工業(yè)自動(dòng)化領(lǐng)域的核心部件,其運(yùn)行狀態(tài)直接影響設(shè)備效率和生產(chǎn)線穩(wěn)定性。判斷伺服電機(jī)是否損壞需要結(jié)合多維度檢測(cè)方法,從基礎(chǔ)觀察、性能測(cè)試到專業(yè)診斷層層遞進(jìn)。以下為系統(tǒng)性判斷流程及實(shí)操要點(diǎn)
    的頭像 發(fā)表于 05-12 17:21 ?4378次閱讀
    如何<b class='flag-5'>判斷</b>伺服電機(jī)<b class='flag-5'>是否</b>損壞

    CPU的各種指令和執(zhí)行流程

    在集成電路設(shè)計(jì)中,CPU的指令是指計(jì)算機(jī)中央處理單元(CPU)用來(lái)執(zhí)行計(jì)算任務(wù)的基本操作指令集。這些指令是CPU能夠理解并執(zhí)行的二進(jìn)制代碼,
    的頭像 發(fā)表于 04-18 11:24 ?2639次閱讀