色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

嵌入式軟件優先級的重要性

strongerHuang ? 來源:博客園 ? 作者:博客園 ? 2020-09-04 15:29 ? 次閱讀

嵌入式軟件開發中,我們不可避免的需要接觸優先級的概念,掌握優先級的概念對于設計一個好的軟件系統尤為重要。

本篇筆記的主要內容有以下幾個方面:

1、中斷優先級

2、操作系統中的任務優先級

3、同等優先級處理

4、中斷嵌套

今天借助大家熟悉的 STM32F103 平臺和各位聊聊其中的密事。

首先,我們從一個裸機系統的變量自加開始說起。

這里有三個變量,A、B、C,其中 B 變量除了在 main 函數中自加外,還會在中斷處理函數中進行自加。

這里面考慮了B的兩種情況,一是先執行 main 中的自加再執行中斷的自加,二是先執行中斷的自加再進行 main 的自加。

不管發生哪種情況,當程序執行到 C 位置時,B 的值都是一樣的。

當然,以上分析是從 C 語言的角度進行分析的,如果以匯編的視角進行分析(自加操作在匯編中分為三個步驟),你會發現,這里面其實還有第三種情況:

這里面的 B’ 可以認為是寄存器,即變量的 B 的副本。

正因為副本的存在,在main 函數的寫入過程中導致丟失了中斷中 B 的自加操作。

對于程序而言,就好像根本沒有進入中斷一樣!

這就是全局變量的使用隱患。

但是善于分析的道友可能會提出這樣一個疑問,為什么上面只考慮了main 函數中的B++被打斷的可能,卻沒有考慮中斷(橙色部分)的B++被打斷的可能,是魚鷹忽略了嗎?

不不,其實這里面就涉及到了今天的主題,優先級。

在裸機系統中,中斷優先級高于main函數的處理,也就是說,一且中斷來臨, 不管main函數執行到哪個位置,都會優先處理中斷程序,只有中斷程序執行完成后,才會繼續執行main函數,所以中斷的 B++ 不可能被main 函數打斷!

這里插兩個問題:

怎么進入中斷函數的?

當中斷請求(中斷請求可以認為是種電平信號,在寄存器中就表現為某一位的標志位)來臨時,硬件負責把部分寄存器存儲到棧(一種特殊的數據結構)中,這里面就包含了PC寄存器(用于指示下一條指令執行的位置),之后從向量表中找到中斷處理函數的入口地址,開始進入中斷處理函數中執行。

怎么回到原來的位置?

因為在進入中斷前已經保存了PC等其他寄存器的值,所以只要在執行完中斷處理函數后,將之前的保存到棧中的值恢復回來,那么CPU就可以繼續從被打斷的指令開始繼續執行。

更多相關的中斷行為請查看《權威指南》,魚鷹不再細說。

回到剛才的優先級話題,正因為中斷的執行優先級比main高,所以中斷中的 B++ 不會被打斷,這也是為什么有些時候,我們不需要對中斷中的變量進行臨界保護的原因所在。

在 Cortex-M3 內核中,中斷分為可屏蔽和不可屏蔽中斷,同時又有可編程優先級和不可編程優先級之分。

所謂可屏蔽,就是說這個中斷是可以屏蔽掉的,即使發生了中斷,也不會讓CPU執行中斷里面的程序。

比如我們的定時器中斷,如果我們沒有開啟相應的中斷的話,即使定時器溢出中斷來了,那也不會進入中斷處理函數處理的。

而不可屏蔽,就是說這個中斷是不可以屏蔽的,比如復位中斷(是不是不可思議,代碼執行的第一條指令竟然是中斷處理函數里面的),如果復位中斷都被屏蔽了,那么系統也就別想運行了。

可編程,意味著這個中斷的優先級可以由軟件修改(不可編程,即優先級固定死了,不能修改)。

中斷的優先級在設置時又有搶占式優先級和非搶占式優先級兩種設置(根據單片機不同,搶占式和非搶占式可設置的位數不同,并且可以分配各自的位數,即所謂的中斷分組,如STM32F103 共有四位,通過設置中斷分組來決定搶占式和非搶占的位數)。

搶占優先級,即如果中斷 1 的優先級比中斷 2 的搶占優先級高的話,一旦中斷1發出中斷請求,即使已經在中斷 2 執行了,也會強制進入中斷 1 執行,這個類似于 main 函數與中斷的關系,只不過這里兩個都是中斷而已。

在搶占優先級相同情況下,非搶占優先級就會開始起作用了。

如果中斷 1 和中斷 2 的搶占優先級設置成一樣,而非搶占優先級不一樣,此時如果兩個中斷同時發出請求,那么優先處理非搶占優先級高的中斷。

但是如果不是同時發生呢?那么就會依次處理中斷請求,在其中一個中斷處理過程中,是不可以被另一個中斷打斷的,同時如果本中斷再來一個請求,也不會重新進入中斷函數處理。

即中斷本身不可打斷自身的處理,換句話說中斷不會執行到一半時又因為自身新的中斷請求來臨而重新再次進入本中斷處理函數執行。

如果搶占優先級和非搶占優先級都設置成一樣呢,此時如果兩個中斷同時發生,又該選擇哪個先執行,隨機嗎?

這里就涉及到硬件優先級了。

在上圖中,每一個中斷其實都是有固定的默認優先級的,這個優先級肯定不同,所以當搶占優先級和非搶占優先級一樣的情況下,在中斷同時發生時,先執行默認優先級高的。

看圖:

講到了中斷,就不可不說如何禁止中斷的問題了。

在常規操作中,我們會使用禁止全局中斷來禁止中斷的處理,一旦禁止了全局中斷,那么除了不可屏蔽中斷外,所有的中斷都會被屏蔽掉,即如果在禁止中斷后發生了中斷,也不會再執行。

但是一旦中斷打開了,那么之前被屏蔽的中斷就會立刻開始執行(有一個中斷掛起位,代表中斷的發生,只有CPU執行了中斷處理函數,并清零相應標志位,該掛起位才會清除)。

如果在關閉中斷的過程中發送了兩次中斷,比如外部中斷發生了兩次,那么在開啟中斷后,也只會響應一次中斷,因為掛起位就只有那么一位(不像隊列一樣可以保留多個標志位)。

對于一般功能而言,禁止全局中斷確實有用,對于保護全局變量也非常有效,但是對于整個系統而言會有一定的影響。

如果禁止中斷的時間很短,那么確實無關緊要,但是一旦需要禁止較長的時間(毫秒級別),對于那些需要及時處理的中斷而言,就是一個不可忽視的延遲。

而在操作系統中,為了保護那些全局變量,禁止中斷的操作時有發生,那么是否有一種方法可以屏蔽部分中斷,而讓高優先級的中斷不被屏蔽呢?

有的,在 Cortex-M3 內核中,有一個寄存器專門干這事,即 BASEPRI。

當設置該寄存器時,將屏蔽所有優先級不高于某個具體值的中斷。

比如設置該寄存器為 3,那么優先級0~ 2的中斷不會被屏蔽。

所以在操作系統中,我們可以修改禁止中斷的代碼,使其不會屏蔽高優先級的中斷,對于高優先級中斷來說,可增加實時性。

uCOS II 中默認是直接全局禁止中斷的(可以修改它),但是 FreeRTOS 是可以禁止部分中斷的,使用的就是上述寄存器,當然這個功能需要單片機本身支持才行。

以上就是中斷優先級的內容,如果只會裸機的話,那么以上內容就差不多了,但是如果是操作系統,那么需要再增加一個任務優先級的概念。

所謂任務,你也可以認為是一種中斷,只不過,這種特殊的中斷優先級低于所有的硬件觸發的中斷。

中斷的優先級凌駕于所有任務之上。

也就是說,一旦中斷來臨,不管CPU正在執行哪個任務,在全局中斷開啟的情況下,都會立刻執行中斷里的程序。

在中斷中,可以進行中斷嵌套,所謂的中斷嵌套即當前中斷被另一個更高優先級的中斷所打斷(即搶占),被打斷的中斷必須在高優先級任務執行完成后才會繼續執行。而在嵌入式實時操作系統中,為了更好的處理實時任務,一般而言也會設置成可搶占的任務(亦稱可剝奪)。

中斷的優先級處理是由內核進行管理的,這里的內核是指單片機內核,比如STM32F103的內核是Cortex-M3(更準確的說是由 NVIC 管理)。

一旦設置好相應的寄存器之后,只要中斷來了,那么就會自動處理中斷程序,這些工作由硬件完成,它會在多個中斷同時來臨時選擇最高的優先處理;也會在中斷執行時,如果有一個更高優先級的中斷來臨時,打斷當前中斷的執行而先執行更高優先級的中斷。

但是操作系統是純軟件行為,那么操作系統的任務優先級又是誰管理的?又是如何管理的呢?

答案就在Systick中斷。

既然要管理所有任務的優先級,即在合適時選擇運行優先級最高的任務,那么操作系統本身必然需要有能剝奪所有任務執行的能力,而中斷是凌駕于任務之上的,可以在任何時候剝奪任務的執行,從而獲得CPU的使用權,所以選擇中斷作為操作系統的核心是合適的。

但是中斷那么多,選擇什么中斷比較合適呢?沒有比 Systick 中斷更合適的了,因為它就是為此而生的。

Systick說白了就是一個定時器,但是和普通定時器不同的是,功能比較單一,就是一個計數器而已,所以使用它管理任務是合適的,不會占用其他定時器。

那么Systick又是如何管理任務的呢?

一般而言,Systick 會設置成幾毫秒中斷一次,在每次中斷時,Systick處理程序(即操作系統內核)都會從所有的任務中選擇最高優先級的任務執行,也就是說,系統總是運行最高的任務。

而這個特性也就導致你的高優先級任務不可以無限執行而不主動釋放CPU,因為一旦高優先級任務無限執行了,那么低優先級任務將永遠得不到執行機會,這就給人一種死機的假象。

可能有道友會疑惑,為什么空閑任務不需要調用系統延時函數去主動釋放CPU的使用權呢?

那是因為空閑任務本身優先級就是所有任務中最低的,如果它主動釋放 CPU 了,而其他任務都處于掛起狀態,那么操作系統又該讓誰去執行呢?

所以,空閑任務需要永遠處于運行狀態。

從這個角度來說,操作系統主要的功能就是定時從所有任務中尋找最高優先級的任務,然后讓該任務得到運行機會(使用PendSV 中斷切換到任務中,模擬中斷切換過程),功能類似于中斷管理器。

而正因為操作系統只會尋找最高優先級的任務來執行(對于實時操作系統是這樣,有些操作系統可能先來先處理的策略),所以任務本身主動釋放 CPU 就顯得尤為重要了。

最常用的主動釋放 CPU 的函數就是系統延時函數了,調用這個函數后,任務將延時一段時候才回來繼續執行,而在延時過程中,操作系統就可以調用其他任務執行了,正因為如此,操作系統才顯得高效。

雖然操作系統需要中斷來剝奪所有任務的執行,從而擁有 CPU 的控制權,但是一般而言,它的優先級卻是所有中斷中最低的,因為它的優先級只需要高于任務即可,如果設置的更高,那么就會影響到真正需要高優先處理的中斷,因為Systick中斷的處理還是比較頻繁和繁重的,如果設置的太高,那么在Systick處理時,更低優先級的中斷將無法處理,這可不是我們想看到的結果。

而如果設置成中斷優先級最低的話,既可以剝奪任務的執行,又可以在高優先級中斷來臨時及時處理中斷,讓系統的實時得到提高。

與 Systick 配套的中斷,還有一個 PendSV 中斷,這個優先級一般和 Systick 設置成一樣,一般而言該中斷的觸發是由操作系統內核主動觸發的(在切換任務時軟件觸發該中斷),而不像 Systick 一樣,定時被動觸發,關于兩個中斷更具體描述可參考《Cortex-M3 權威指南》。

既然中斷可以設置成優先級一樣的,那么任務應該也可以才對,確實一般的操作系統都可以設置相同優先級的任務(uCOS II 不可以, uCOS III 和 FreeRTOS 、RT-Thread可以),那么操作系統又是如何處理同等優先級的任務?

一般而言,在任務初始化時,會設置任務的時間片,這個時間片就是在任務優先級相同的情況下才會發生作用。

比如,任務 1 設置 5 個時間片(即Systick中斷時間),任務 2 設置 10 個時間片,如果兩個任務的優先級一樣,那么在 15 個時間片內,任務 1 將執行 5 個時間片,之后切換到任務 2 執行10個時間片,來回往復。

那么比任務1 和任務 2 優先級更高的任務該什么時候執行呢?答案是隨時,即只要高優先級任務有需要,那么不管任務 1 和 任務 2 是否主動釋放 CPU,都會被操作系統強制切換到高優先級任務中執行(由 Systick完成,所以可能會有一點延時)。

那么優先級比它們低的任務呢?這個就靠它們的自覺了,如果它們自覺的主動釋放CPU(比如調用系統延時函數),那么低優先級任務就有執行機會,否則,低優先級任務將不會執行!

該用一張圖來說明整個系統的優先級關系了:

最后魚鷹再聊聊該如何設置任務優先級。

很多人設計任務優先級時都會從 0、1、2、3 這樣的順序來設置,實際上,這種設置是不合理的,因為一旦后面需求變化了,要從中加入一個中間的優先級,那么很可能在加入后程序出現問題了。

其實我們可以從 Cortex-M3 的中斷優先級得到啟發,即空開部分優先級不使用,留待后面擴展用,比如設計優先級時可以設置成 3、5、7、9、11,留出最高的0~2用于可能的高優先級任務,中間空出一個或兩個優先級用于擴展,這樣一旦后面需要增加其他優先級的任務,會顯得異常簡單(可能會有額外的一點內存損耗,但卻是值得的)。

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

    關注

    5082

    文章

    19104

    瀏覽量

    304817
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3587

    瀏覽量

    129436

原文標題:嵌入式系統優先級詳解

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【「嵌入式Hypervisor:架構、原理與應用」閱讀體驗】+第7-8章學習心得

    這是一本很好的學習嵌入式的書籍。 在深入學習《嵌入式Hypervisor:架構、原理與應用》的第7-8章后,我對嵌入式Hypervisor的架構、原理及其在實際應用中的重要性有了更為深
    發表于 10-09 18:50

    freertos中斷優先級在哪設置

    FreeRTOS是一個流行的實時操作系統,它廣泛應用于嵌入式系統開發。在FreeRTOS中,中斷優先級是一個重要的概念,因為它決定了中斷處理的順序和響應時間。 1. 理解中斷優先級
    的頭像 發表于 09-02 14:17 ?641次閱讀

    APS智能優化排產軟件優先級應用

    資源、訂單需求和約束條件,自動計算出最優的生產計劃。在這個過程中,訂單排產的優先規則起著至關重要的作用。1.交期優先級交期優先級是訂單排產中最基本的
    的頭像 發表于 06-26 17:43 ?386次閱讀
    APS智能優化排產<b class='flag-5'>軟件</b>的<b class='flag-5'>優先級</b>應用

    從事嵌入式方向,一定要軟硬件通吃?

    嵌入式系統開發領域,軟件和硬件的界限常常模糊不清。一個常見的問題是,嵌入式軟件工程師是否需要了解硬件。本文將探討這一問題的重要性,并分析
    的頭像 發表于 06-05 08:10 ?1178次閱讀
    從事<b class='flag-5'>嵌入式</b>方向,一定要軟硬件通吃?

    systick的中斷優先級是否應該設置為最高優先級的嵌套中斷?

    最近在學習ucosii有這樣一個疑問,關于stm32的systick作為ucosii的基準時鐘,systick的中斷優先級是否應該設置為最高優先級的嵌套中斷。理由是什么?各位大俠求指教!!!
    發表于 05-16 06:44

    創建了兩個task如果一個優先級高 一個優先級低,高優先級的那個一直在做,什么時候會調度到低優先級的呢?

    創建了兩個task如果一個優先級高一個優先級低, 我看到任務的函數都是用死循環做的,那個高優先級的那個一直在做,什么時候會調度到低優先級的呢?
    發表于 05-13 07:13

    嵌入式實時操作系統中的優先級反轉問題

    死鎖預防是實時系統設計中的一個重要因素。不幸的是,即使使用安全排除技術,這可能也不是困難的終點。在解決資源爭用問題時,可能引入新的優先級翻轉問題。
    發表于 04-26 15:47 ?469次閱讀
    <b class='flag-5'>嵌入式</b>實時操作系統中的<b class='flag-5'>優先級</b>反轉問題

    嵌入式環境的中斷調試步驟操作

    確保問題中斷的優先級設置正確。它應該高于正常工作的中斷的優先級,但低于任何應該優先于它的中斷的優先級
    發表于 04-09 10:41 ?371次閱讀

    嵌入式實時操作系統優先級搶占調度機制解析

    當搶占發生時,任務即使沒有完成也會被迫放棄處理器,此時任務并沒有被掛起,而是會返回就緒隊列。任務在隊列中的位置是由優先級決定的,它會在隊列中等待到下一次被調度。
    的頭像 發表于 04-05 05:22 ?2795次閱讀
    <b class='flag-5'>嵌入式</b>實時操作系統<b class='flag-5'>優先級</b>搶占<b class='flag-5'>式</b>調度機制解析

    STM32F103的寄存器NVIC_IPRx搶占優先級和子優先級是怎么設置的?

    STM32F103的寄存器NVIC_IPRx有些不明白,搶占優先級和子優先級是怎么設置的? 如果,中斷分組2,搶占優先級3,子優先級3 那下面這樣寫對嗎? SCB->AIR
    發表于 03-27 07:48

    嵌入式C語言中斷調試步驟

    確保問題中斷的優先級設置正確。它應該高于正常工作的中斷的優先級,但低于任何應該優先于它的中斷的優先級
    的頭像 發表于 03-26 12:20 ?682次閱讀

    Hightec對芯片中斷優先級分配時,中斷號越高中斷優先級越高嗎?

    請問大佬,Hightec對芯片中斷優先級分配時,中斷號越高中斷優先級越高嗎?看網上的帖子說中斷號越低優先級越高。
    發表于 02-27 06:13

    嵌入式軟件設計的原則分享

    嵌入式軟件開發如果具有更好的閱讀、擴展性以及維護,就需要考慮很多因素。今天給大家分享幾個嵌入式軟件
    發表于 02-25 10:54 ?679次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>設計的原則分享

    華為和思科默認路由優先級

    優先級值不同,則優先級值最小的為最優路由(無論開銷值是否相同,另一種理解就是對不同路由來源或路由協議之間的比較)。
    的頭像 發表于 01-11 10:47 ?1178次閱讀

    GD32如何配置中斷優先級分組以及中斷優先級

    使用GD32 MCU的過程中,大家可能會有以下疑問:中斷優先級如何配置和使用?
    的頭像 發表于 01-10 10:30 ?3056次閱讀
    GD32如何配置中斷<b class='flag-5'>優先級</b>分組以及中斷<b class='flag-5'>優先級</b>
    主站蜘蛛池模板: 曰批国产精品视频免费观看| 中字幕久久久人妻熟女天美传媒| 色一伦一情一区二区三区| 无码人妻视频又大又粗欧美 | 欧洲内射VIDEOXXX3D| 午夜爽喷水无码成人18禁三级| 在线 无码 中文 强 乱| 打卡中国各地奋斗第一线| 欧美性最猛xxxx在线观看视频| 亚洲AV精品无码成人| free高跟丝袜秘书hd| 国色天香社区视频免费高清3| 女人张腿让男人桶免费| 亚洲乱码AV久久久久久久| a免费在线观看视频| 极品少妇高潮啪啪无码吴梦| 青青青久草| 在野外被男人躁了一夜动图| 国产精品人妻无码久久久蜜桃| 男女亲吻摸下面吃奶视频| 亚洲精品高清在线观看| 超碰97人人做人人爱亚洲尤物| 久久理论片| 亚洲444777KKK在线观看| xxxx美国老师1819| 久久爽狠狠添AV激情五月| 无码射肉在线播放视频| caoporn超碰视频| 久久yy99re66| 香蕉水蜜桃牛奶涩涩| 成年妇女免费播放| 麻豆免费观看高清完整视频| 亚洲日韩KKK444KKK聚色| 国产AV亚洲精品久久久久软件| 妹妹成人网| 亚洲最大成人| 国产免费看片| 色狐直播免费观看| jizz中国女人| 男人日女人的b| 中文字幕不卡一区二区三区|