欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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ù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-12 11:25 ? 次閱讀

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

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

Ⅰ問題來源

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

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

Ⅱ解決問題的過程

我解決問題還是按照常規(guī)思維,一步一步跟蹤,很多問題其實(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)一步查找問題

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

這就是我們常說的“臨界段”,這一點(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è)地址,相信之前了解過NVIC的都知道,就是Interrupt control state register.即中斷控制狀態(tài)寄存器。

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

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

其實(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)明白,大概意思就是過去控制寄存器狀態(tài),這也是我開篇說的,讓大家了解的__get_CONTROL。

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

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

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

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

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

Ⅲget_CONTROL的應(yīng)用

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

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

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

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

Ⅳ多說兩句

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

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

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

說到這里,多說一句,關(guān)于問問題的話,后臺(tái)每天都有許多人問我問題,但是有些問題其實(shí)真的很簡(jiǎn)單,比如:編譯有個(gè)變量未調(diào)用的警告、重復(fù)定義,多了一個(gè)分號(hào)等,這些看一下提示都知道。不要告訴我你英語差,我英語初高中從來都沒有及格過,依然還是得看英文手冊(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ī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10909

    瀏覽量

    213128
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    819

    瀏覽量

    119910
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62413
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    c51單片機(jī)中斷

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

    關(guān)于中斷知識(shí)學(xué)習(xí)總結(jié)筆記

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

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

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

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

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

    求助,關(guān)于PSoC6在CM0+中用于進(jìn)入休眠和深度休眠的函數(shù)的問題

    : \" 執(zhí)行 WFI 指令時(shí),CPU 進(jìn)入休眠或深度休眠狀態(tài)(取決于 SCR 寄存器的 SLEEPDEEP 位),并在中斷請(qǐng)求(優(yōu)先級(jí)高于當(dāng)前優(yōu)先級(jí))或調(diào)試請(qǐng)求時(shí)喚醒。 WFE 指令與 WFI 類似
    發(fā)表于 07-05 06:27

    STM32L151低功耗運(yùn)行模式CPU是否正在運(yùn)行?

    在使得CPU處于LPRUN Mode時(shí),翻轉(zhuǎn)LED,LED不能正常翻轉(zhuǎn),因此請(qǐng)教一下網(wǎng)友們,STM32L151低功耗運(yùn)行模式CPU是否正在運(yùn)行
    發(fā)表于 07-05 06:17

    ESP32S2如何判斷當(dāng)前代碼是否中斷?

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

    PLC出現(xiàn)問題時(shí)如何快速判斷CPU異常

    CPU異常是較為常見且影響較大的問題之一。本文將從多個(gè)方面探討如何快速判斷PLC出現(xiàn)問題時(shí)是否CPU異常,并提供相應(yīng)的解決方法和建議。
    的頭像 發(fā)表于 06-12 11:13 ?1011次閱讀

    對(duì)于中斷,先執(zhí)行中斷服務(wù)函數(shù)還是先清理中斷標(biāo)志?

    對(duì)于中斷,先執(zhí)行中斷服務(wù)函數(shù)還是先清理中斷標(biāo)志?開始學(xué)習(xí)固件庫的時(shí)候,差不多是先進(jìn)入服務(wù)函數(shù)在清
    發(fā)表于 05-22 07:20

    求助,幫忙判斷下對(duì)ADC DMA回調(diào)函數(shù)的理解是否正確?

    但是結(jié)束完回調(diào)函數(shù)后,不管 DMA1 的 CH1 的優(yōu)先級(jí) 是否比 DMA1 的 CH2 優(yōu)先級(jí)高,都會(huì)重新 ADC1 的掃描,ADC2 的掃描永遠(yuǎn)不會(huì)進(jìn)行,自然也不會(huì) DMA1 CH2 的中斷
    發(fā)表于 05-06 09:24

    如果單片機(jī)的程序正在執(zhí)行中斷服務(wù)程序,期間又有比正在執(zhí)行中斷級(jí)別高的中斷結(jié)果會(huì)如何?

    請(qǐng)教一下,如果單片機(jī)的程序正在執(zhí)行中斷服務(wù)程序,期間又有比正在執(zhí)行中斷級(jí)別高的
    發(fā)表于 04-09 07:46

    執(zhí)行判斷CPU怎么設(shè)計(jì)?

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

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

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