国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于如何判斷CPU是否正在執行中斷函數?

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

掃碼添加小助手

加入工程師交流群

1.這是一個有許多經驗的攻城獅都遇到過的坑,本文教你正確繞過這個坑;

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

Ⅰ問題來源

今天在FreeRTOS系統上移植了部分別人寫的代碼,移植前仔細看了下源碼,確認沒問題后,編譯,下載,運行,突然“死機了”······

于是,我又再次確認了移植的代碼,沒有發現Bug所在。此時,我開啟了在線調試功能,發現程序死在了“vPortEnterCritical”函數中的斷言語句里。如下:

Ⅱ解決問題的過程

我解決問題還是按照常規思維,一步一步跟蹤,很多問題其實都是類似道理,有規律可循。

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

跟蹤代碼:

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

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

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

2.進一步查找問題

我又開始了思考,為什么會執行到這里來呢?為什么會執行portDISABLE_INTERRUPTS(); uxCriticalNesting++; if( uxCriticalNesting == 1 )等這些語句呢?

這就是我們常說的“臨界段”,這一點我學習RTOS的時候已經明白了,這一個函數肯定會被調用。于是,我把目標鎖定了portNVIC_INT_CTRL_REG這個參數:

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

0xe000ed04? 這個地址,相信之前了解過NVIC的都知道,就是Interrupt control state register.即中斷控制狀態寄存器

3.確定問題點

從上面的分析,其實問題都已經浮現出來了。于是查看了【Cortex-M3權威指南】中相關的內容。(PS:這本手冊真的能解決很多問題,翻譯成中文,對大部分朋友來說是一件好事)

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

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

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

懂一點匯編的,相信在這里都已經明白,大概意思就是過去控制寄存器狀態,這也是我開篇說的,讓大家了解的__get_CONTROL。

4.在線調試,分析結論

上面分析出來控制寄存器CONTROL,那么我們需要驗證是否符合我們預期的效果,通過在線調試,斷電就可得出,如下面兩圖:

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

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

至此,問題已經查明就是CONTROL。

Ⅲget_CONTROL的應用

一般在RTOS實時操作系統中,常常使用隊列來處理我們的數據,也就是常說的FIFO(先入先出)。

比如:我們在FreeRTOS系統中,要將UART發送、或者接收的數據加入隊列:在中斷里加入隊列,在非中斷里加入隊列。這個時候,就需要使用get_CONTROL來判斷當前是否處于中斷函數里。

當然,類似的情況很多,像CANI2C、SPI等一樣的道理。

舉例,CAN總線發送數據加入隊列:

Ⅳ多說兩句

以上的分析,看似很簡單,其實包含的內容很多,可能有很多人覺得:這些問題對于我來說是小菜一碟。

說句實話,我和大家一樣,都是慢慢學習過來的,這里面跳過的坑其實很多,是因為我跳過了太多的坑,所以才會對一些問題更加了解。

上面類似的問題,在我學習RTOS、移植CANOpen等等那些時候都有遇到過,想要知道我遇到那些問題,處理起來難不難,明確回答:很多問題在初學的時候都很難,但我還是走過來了。

說到這里,多說一句,關于問問題的話,后臺每天都有許多人問我問題,但是有些問題其實真的很簡單,比如:編譯有個變量未調用的警告、重復定義,多了一個分號等,這些看一下提示都知道。不要告訴我你英語差,我英語初高中從來都沒有及格過,依然還是得看英文手冊。確實不懂,安裝一個翻譯軟件不難吧。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11277

    瀏覽量

    224944
  • RTOS
    +關注

    關注

    25

    文章

    866

    瀏覽量

    122975
  • FreeRTOS
    +關注

    關注

    14

    文章

    499

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    請問如何從一個函數內部判斷函數是否是個成員函數還是個非成員函數

    如何從一個函數內部判斷函數是否是個成員函數還是個非成員函數
    發表于 01-06 06:30

    CW32學習筆記,通用異步收發器之中斷接收

    的。想象現在CPU正在執行一個函數function(),倘若函數還未執行完成,
    發表于 12-12 07:45

    如何通過性能表現判斷備用電池是否需要更換?

    通過性能表現判斷備用電池是否需要更換,核心是驗證電池的 實際供電能力 和 充電穩定性 ,因為這直接決定了主電源中斷時能否保障裝置數據不丟失。具體可從 放電續航、充電效率、供電可靠性 三個維度開展測試
    的頭像 發表于 12-10 11:19 ?943次閱讀
    如何通過性能表現<b class='flag-5'>判斷</b>備用電池<b class='flag-5'>是否</b>需要更換?

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

    判斷電能質量在線監測裝置備用電池是否需要更換,需結合 電池狀態參數、性能表現、物理外觀 三個維度的指標綜合判定,同時參考電池使用年限和工業現場的特殊損耗情況,具體判斷標準和方法如下: 一、通過核心
    的頭像 發表于 12-10 11:17 ?533次閱讀
    如何<b class='flag-5'>判斷</b>備用電池<b class='flag-5'>是否</b>需要更換?

    mcu短時間內發生多次中斷,如何解決中斷丟失問題呢?

    ?例如:中斷A在短時間內觸發了3次,但是CPU來不及響應(中斷A的執行函數時間長,或者正在
    發表于 12-05 07:07

    關于蜂鳥E203內核中斷硬件實現中斷嵌套的設計

    嵌套,可以有很多層(蜂鳥處理器該情況下不響應新的中端,繼續執行正在處理的ISR,徹底完成后才響應新的中斷請求) 注意:假設新來的中斷請求的優先級比
    發表于 10-23 07:07

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

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

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

    此指針變量使用之前沒有判斷是否為空,萬一rt_system_scheduler_start此函數調用之前來滴答定時器的中斷了,這樣操作是不是會有風險
    發表于 10-09 08:07

    如何判斷通信問題是否由設備故障引起?

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

    求助,關于RT-Thread 最新版本timer.c rt_timer_check函數問題求解

    關于系統定時器超時處理函數rt_timer_check,V5.1.0版本和原來v4.1.1版本有個區別在于,進入超時回調函數t-&gt;timeout_func(t-&
    發表于 09-25 07:00

    如果在FMC執行“程序”或“擦除”時發生中斷事件,是否會處理中斷事件?

    如果在FMC執行“程序”或“擦除”時發生中斷事件,是否會處理中斷事件?
    發表于 08-27 08:01

    如果在FMC執行“程序”或“擦除”時發生中斷事件,是否會處理中斷事件呢?

    如果在FMC執行“程序”或“擦除”時發生中斷事件,是否會處理中斷事件?
    發表于 08-22 06:58

    如何判斷伺服電機是否損壞

    伺服電機作為工業自動化領域的核心部件,其運行狀態直接影響設備效率和生產線穩定性。判斷伺服電機是否損壞需要結合多維度檢測方法,從基礎觀察、性能測試到專業診斷層層遞進。以下為系統性判斷流程及實操要點
    的頭像 發表于 05-12 17:21 ?4307次閱讀
    如何<b class='flag-5'>判斷</b>伺服電機<b class='flag-5'>是否</b>損壞

    CPU的各種指令和執行流程

    在集成電路設計中,CPU的指令是指計算機中央處理單元(CPU)用來執行計算任務的基本操作指令集。這些指令是CPU能夠理解并執行的二進制代碼,
    的頭像 發表于 04-18 11:24 ?2612次閱讀

    變頻器是否有故障的方法判斷

    變頻器是否有故障用這幾種方法就可以輕松判斷,維修使用建議熟記?
    發表于 03-06 17:19 ?2次下載