在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    10868

    瀏覽量

    211844
  • RTOS
    +關注

    關注

    22

    文章

    813

    瀏覽量

    119661
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62193
收藏 人收藏

    評論

    相關推薦

    c51單片機中斷

    優先級的中斷正在處理,CPU 會暫停當前正在執行的指令,將程序計數器(PC)等關鍵寄存器的值保存到堆棧中,然后根據
    發表于 11-25 21:43

    關于中斷知識學習總結筆記

    可以對變量進行賦值、進行條件判斷并根據結果執行不同分支代碼等。 函數調用能力 它們都具備調用其他函數的能力。在一個復雜的項目中,無論是普通函數
    發表于 11-23 11:23

    如何判斷繼電器是否正常工作

    判斷繼電器是否正常工作是一個涉及多個方面的過程,主要包括外觀檢查、電氣性能測試以及實際應用中的表現等。以下將從這些方面詳細闡述如何判斷繼電器是否正常工作。
    的頭像 發表于 09-10 11:06 ?898次閱讀

    【「ARM MCU嵌入式開發 | 基于國產GD32F10x芯片」閱讀體驗】+閱讀中斷

    進行通信的機制,外部通過中斷的方式來通知處理器有事情發生了,而處理器有專門的模塊根據發生的事情的緊急程序來決定是否要暫停正在執行的程序來響應中斷
    發表于 09-01 23:59

    ESP32S2如何判斷當前代碼是否中斷

    問題是,我怎么判斷當前代碼是否中斷執行? rt_err_t IRAM_ATTR rt_event_send(rt_event_t event, rt_uint32_t set
    發表于 06-21 06:30

    對于中斷,先執行中斷服務函數還是先清理中斷標志?

    對于中斷,先執行中斷服務函數還是先清理中斷標志?開始學習固件庫的時候,差不多是先進入服務函數在清
    發表于 05-22 07:20

    求助,幫忙判斷下對ADC DMA回調函數的理解是否正確?

    但是結束完回調函數后,不管 DMA1 的 CH1 的優先級 是否比 DMA1 的 CH2 優先級高,都會重新 ADC1 的掃描,ADC2 的掃描永遠不會進行,自然也不會 DMA1 CH2 的中斷
    發表于 05-06 09:24

    如果單片機的程序正在執行中斷服務程序,期間又有比正在執行中斷級別高的中斷結果會如何?

    請教一下,如果單片機的程序正在執行中斷服務程序,期間又有比正在執行中斷級別高的
    發表于 04-09 07:46

    執行判斷CPU怎么設計?

    需要使用JUMP函數跳出嗎,還是可以在EXE階段的乘法器后面的精確乘法器上加一個使能段,根據預測結果判斷要不要激活精確乘法器。但是這樣會不會讓EXE階段的時鐘周期過長?
    發表于 03-30 18:18

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

    CPU響應中斷轉去執行中斷服務程序前,需要把被中斷程序的現場信息保存起來,以便執行
    發表于 03-26 11:36 ?3810次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>中斷</b>程序:從硬件看什么是<b class='flag-5'>中斷</b>?

    關于CSD Capsense ISR的幾個疑問求解

    ; 1、觸發Capsense中斷后,測量數據復制到定義的數據結構中不是在中斷函數執行的,是通過調用CapSense_ProcessAllWidgets()
    發表于 02-01 08:31

    GD32 MCU是如何進入中斷函數

    用過GD32 MCU的小伙伴們都知道,程序是順序執行的,但當有中斷來的時候程序會跳轉到中斷函數執行
    的頭像 發表于 01-30 09:45 ?1100次閱讀
    GD32 MCU是如何進入<b class='flag-5'>中斷</b><b class='flag-5'>函數</b>的

    如何判斷電感是否損壞嗎

    電子發燒友網站提供《如何判斷電感是否損壞嗎.docx》資料免費下載
    發表于 01-22 09:25 ?0次下載

    系統函數怎么判斷低通高通

    判斷一個系統函數是低通還是高通,可以通過多種方法和指標來進行分析。下面將介紹常用的幾種判斷方法,并詳細解釋每種方法的原理和應用。 頻率響應分析法 通過分析系統函數的頻率響應特性,可以
    的頭像 發表于 01-12 11:06 ?3644次閱讀

    ADUCM360如何用外部中斷CPU從睡眠模式喚醒?

    并未喚醒CPU執行其他操作。 問題是: 1.設置的代碼是否有錯誤或者遺漏的地方? 2.外部中斷是否上升沿或下降沿觸發都可以?
    發表于 01-12 06:59
    主站蜘蛛池模板: 国产成人91青青草原精品| 久久久久久午夜精品| 天天操天天射天天舔| 午夜久久久| 天堂成人在线| 久久久久久人精品免费费看| 国产网站大全| 1024国产手机视频基地| 日本xxxxxxxx69| 亚洲码在线| www.亚洲成人| 亚洲天堂视频在线播放| 亚洲福利视频一区二区三区| 免费国产高清精品一区在线| 伊人涩| 特级aaa毛片| 欧美日韩在线成人免费| 国模精品| 午夜大片免费完整在线看| 久久三级网站| 男人视频在线观看| 狠狠色噜噜综合社区| 午夜免费成人| 你懂的视频在线看| 成色视频| 超级碰碰青草久热国产| 国产中出视频| 午夜在线看片| 国产亚洲美女精品久久久2020| 丁香五月缴情在线| 国产精品久久久精品三级| 天堂tv亚洲tv日本tv欧美人tv| 免费美剧在线观看| 中文天堂资源在线www| 黄色录像欧美| 男女交性视频免费视频| 四虎亚洲精品| 国产aaa级一级毛片| 人人插人人草| 亚洲欧美天堂网| 四虎永久在线精品影院|