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

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

Ⅰ問題來源

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

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

Ⅱ解決問題的過程

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

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

跟蹤代碼:

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

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

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

2.進一步查找問題

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

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

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

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

3.確定問題點

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

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

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

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

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

4.在線調試,分析結論

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

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

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

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

Ⅲget_CONTROL的應用

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

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

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

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

Ⅳ多說兩句

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

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

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

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

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

    關注

    68

    文章

    11074

    瀏覽量

    216897
  • RTOS
    +關注

    關注

    24

    文章

    849

    瀏覽量

    121108
  • FreeRTOS
    +關注

    關注

    12

    文章

    492

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

    如何判斷電路是否為高頻電路

    在數(shù)字電路中,工程師需要判斷該電路是否高頻電路,以此確保電路性能穩(wěn)定、減少信號失真和避免傳輸線效應,本文將分享如何判斷電路是否為高頻電路。 1、信號的上升沿/下降沿時間(Tr) 若信號
    的頭像 發(fā)表于 01-20 10:49 ?766次閱讀

    全面解析:如何精準判斷SMT貼片打樣是否合格?

    一站式PCBA智造廠家今天為大家講講SMT貼片打樣是否合格如何判斷?判斷SMT貼片打樣是否合格的方法。在電子設備制造領域,SMT貼片打樣是產品開發(fā)和生產過程中的關鍵環(huán)節(jié)。合格的SMT貼
    的頭像 發(fā)表于 01-07 09:29 ?396次閱讀

    單片機中斷相關知識點

    請求:當外部設備或內部模塊發(fā)生中斷事件時,會產生一個中斷請求信號。這個信號通過中斷控制器發(fā)送至CPU,請求CPU暫停當前
    發(fā)表于 11-30 09:49

    c51單片機中斷

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

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

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

    單片機有哪些中斷類型

    單片機中斷是指在單片機執(zhí)行程序的過程中,當外部設備或內部條件發(fā)生某個特定事件時,能夠暫停當前正在執(zhí)行的程序,轉而去執(zhí)行一個特定的服務程序(稱
    的頭像 發(fā)表于 10-17 18:12 ?2386次閱讀

    STM32CUBEMX(11)--外部中斷(EXTI)

    也能看出來這里才是真正執(zhí)行具體功能的函數(shù),該函數(shù)需要在mian.c文件中重寫,通過判斷中斷是來自哪個IO口編寫相應的
    發(fā)表于 09-10 15:44

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

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

    stm32怎樣觸發(fā)軟件中斷

    STM32中,您需要配置NVIC以啟用所需的中斷。這包括設置中斷通道、優(yōu)先級和觸發(fā)條件。 編寫中斷服務例程 中斷服務例程(ISR)是當中斷發(fā)
    的頭像 發(fā)表于 09-02 09:32 ?1893次閱讀

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

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

    降壓斬波電路如何判斷電流是否連續(xù)

    降壓斬波電路(也稱為BUCK電路)在電力電子領域具有廣泛應用,主要用于將高電壓轉換為低電壓。在判斷降壓斬波電路中電流是否連續(xù)時,可以從多個維度進行分析和判斷。 一、引言 降壓斬波電路作為一種重要
    的頭像 發(fā)表于 08-14 16:39 ?2204次閱讀

    JAVA應用CPU跳點自動DUMP工具

    背景 在做系統(tǒng)監(jiān)控時,CPU的使用率是一個關鍵的指標,它反映了系統(tǒng)的性能穩(wěn)定性以及是否存在異常情況,能幫助我們了解系統(tǒng)的負載情況。通過監(jiān)控CPU使用率,可以判斷系統(tǒng)
    的頭像 發(fā)表于 08-05 17:48 ?750次閱讀
    主站蜘蛛池模板: 日韩免费观看一级毛片看看 | 97视频免费上传播放 | 老司机亚洲精品影院在线 | 91极品女神私人尤物在线播放 | 精品欧美一区二区三区 | 精品卡1卡2卡三卡免费视频 | 欧美在线bdsm调教一区 | 国产美女视频爽爽爽 | yellow中文字幕久久网 | 狠狠色噜狠狠狠狠 | 成人中文在线 | 久久影院朴妮唛 | 国模私拍在线视频 | 看天堂 | 男女那啥的视频免费 | 天天综合色网 | www.色播| 天天干免费视频 | aaaa一级片| 色两性网欧美 | 久久福利青草精品资源 | 五月婷婷基地 | 欧美肥穴| 日本不卡一| 一级黄免费 | 国产亚洲第一伦理第一区 | 国产一级毛片午夜 | 亚洲综合激情网 | 亚洲色吧| 四虎影视在线看 | 在线天堂网www资源种子 | 欧美性生活网站 | 婷婷开心激情网 | 香港三级理论在线观看网站 | 簧片免费视频 | 操的好爽 | 国产成人精品本亚洲 | 最近2018免费中文字幕视频 | 去毛片| 色西西| 九九re|