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

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

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

3天內不再提示

RTOS中臨界區的使用技巧

嵌入式情報局 ? 來源:最后一個bug ? 2023-12-12 10:09 ? 次閱讀

1裸機與RTOS的理解

首先這里只針對單核CPU架構的芯片展開討論,大部分是MCU吧,而多核CPU的討論相對比較復雜,暫不涉及~

玩RTOS的朋友都知道,裸機與OS的最大區別就是實現多任務的并發,其實你說裸機就不能實現任務的并發嗎 ? 這個需要看所站的角度吧,只是說RTOS并發的粒度可以更加細,因為把裸機的任務拆分成多塊運行,其實也是一種并發方式。

從宏觀上雖然RTOS的每個任務都是在并發執行,其實微觀上還是一條一條指令在順序執行著,如下圖所示:

21bda9a6-982f-11ee-8b88-92fbcf53809c.png
而對于目前主流的RTOS,如UCOS或者FreeRTOS,所實現的都是多任務,更多的是一種多線程的并發執行而非多進程,所以對應到Linux平臺上稱他們為thread


2并發帶來的問題

并發的好處就是能夠在更細的粒度來盡可能的提高CPU的利用率,這里不能說使用了多線程就一定能提高,這與你所設計的任務劃分和處理有著直接的關系,只能說
多線程相比裸機更有這個能力。


而任何事物都有其利弊,多個任務在沒有同步處理的情況下,任務之間是無序運行的,無序也就意味著狀態的多樣性和復雜度。


當然bug菌這里所說的無序是一個相對的過程,比如對于CPU而言,它就是順序的去執行一條一條的指令,所以在這個層面它是有序的、確定的。


而把過程放大,比如執行一條C語言語句,一般它是由多條匯編指令組成,對于目前的搶占式內核,在一段時間內其多個任務就有可能指令交替執行,當這些指令都去操作同一塊內存,那么內存的最終結果由于順序不同而不同,最終難以確定。


狀態的不確定就有可能造成異常行為,也就是大家經常遇到的:"怎么跑著跑著就有問題,還沒啥規律~","這段代碼怎么看也沒問題呀~"


所以對比看來RTOS確實會帶來編程上的難度~



3臨界區

既然有難度,我們就要解決,把不確定性部分通過一些手段來變得確定,而造成這些不確定因素的動力是什么呢?是中斷~


bug菌一直覺得,其實對于裸機而言,如果把中斷服務函數看成一個更高優先級的搶占式任務,其實裸機主任務與中斷任務就形成了一種兩任務的并發,所以中斷與任務之間也是有共享問題需要類似處理的。


為了解決這些不確定因素,我們只需要在這段代碼區域限制中斷的發生即可,這一段區域就是臨界區,說得直白點 : 關中斷與開中斷。

1ENTER_CRITICAL();//進入臨界區
2
3//臨界區代碼
4
5EXIT_CRITICAL();//退出臨界區



4臨界區嵌套


臨界區的使用沒啥可說的,但是在你的代碼中怎么加臨界區確實一門技巧,可是說很多3~5年的工程師也并不一定處理得好,本文暫不展開,后面bug菌整理以后再分享給大家,今天只聊聊臨界區嵌套使用的問題,畢竟很多朋友在這里掉過坑~



參考偽代碼:


1/*********************************************
2 * Function: Fuction1
3 * Description:功能函數
4 * Author: bug菌
5/
6void Fuction1(void)
7{
8 ENTER_CRITICAL();//進入臨界區
9
10 //do something~
11
12 EXIT_CRITICAL();//退出臨界區
13}
14/
*
15 * Function: Fuction2
16 * Description: 功能函數
17 * Author: bug菌
18 ********************************************/
19void Fuction2(void)
20{
21 ENTER_CRITICAL();//進入臨界區
22
23 ......
24 Fuction1();
25
26 ......
27 //do something~
28
29 EXIT_CRITICAL();//退出臨界區
30}


這種臨界區的使用是很多朋友常犯的錯誤,當然這里的臨界區操作僅僅只是開關中斷,許多自己公司寫的,或者裁剪的都是這種簡約開關中斷版本,所以當調用Function1函數以后,后面的代碼就不在臨界區內了,此時就有可能會存在共享問題。



當然目前的開源OS都會提供一種把相關嵌套標記保存在局部變量中的處理方式,如下代碼所示:


1//來源于ucos源碼
2#define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR())
3#define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr))
4
5/*********************************************
6 * Function: Fuction1
7 * Description:功能函數
8 * Author: bug菌
9 ********************************************/
10void Fuction1(void)
11{
12 int cpu_sr;
13
14 OS_ENTER_CRITICAL();//進入臨界區
15
16 //do something~
17
18 OS_EXIT_CRITICAL();//退出臨界區
19}
20
21/*********************************************
22 * Function: Fuction2
23 * Description: 功能函數
24 * Author: bug菌
25 ********************************************/
26void Fuction2(void)
27{
28 int cpu_sr;
29
30 OS_ENTER_CRITICAL();//進入臨界區
31
32 Fuction1(void);
33
34 OS_EXIT_CRITICAL();//退出臨界區
35
36}


為了更好的理解,我寫了一下下面的偽代碼,供大家參數~


1//中斷寄存器register原本是1, 向register寫0關中斷,向register寫1開中斷
2
3void Fuction2(void)
4{
5 int cpu_sr1 = 0;
6
7 cpu_sr1 = register;
8 register = 0; //register == 0;cpu_sr1 == 1;
9
10 void Fuction1(void)
11 {
12 int cpu_sr1 = 0;
13
14 cpu_sr2 = register;
15 register = 0; //register == 0;cpu_sr2 == 0;
16
17
18 register = cpu_sr2;
19 cpu_sr2 = 0;//register == 0;cpu_sr2 == 0;
20 }
21
22 register = cpu_sr1;
23 cpu_sr1 = 0;//register == 1;cpu_sr1 == 0;
24
25}



不同的OS可能具體實現有所差異,大體上都一樣~



來源:公眾號,最后一個bug

審核編輯:湯梓紅

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

    關注

    456

    文章

    50884

    瀏覽量

    424147
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10872

    瀏覽量

    211989
  • RTOS
    +關注

    關注

    22

    文章

    815

    瀏覽量

    119689
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68678

原文標題:RTOS中臨界區的使用是門技術活~

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread記錄(五、RT-Thread 臨界保護)

    本文聊聊臨界,以及RT-Thread對臨界的處理
    的頭像 發表于 06-20 16:06 ?5127次閱讀
    RT-Thread記錄(五、RT-Thread <b class='flag-5'>臨界</b><b class='flag-5'>區</b>保護)

    【安富萊】【RTX操作系統教程】第11章 臨界段,任務鎖和中斷鎖

    中有臨界段的話,會給系統帶來什么問題呢?比如此時某個任務正在調用系統API函數,而且此時中斷正好關閉了,也就是進入到了臨界,這個時候如果有一個緊急的中斷事件被觸發,這個中斷就不能得
    發表于 01-25 16:52

    RTOS臨界段知識詳解

    執行完畢后,要立即打開中斷。 臨界段的作用 其實在RTOS,使用最多的臨界段是OS本身的調用,但是我們用戶也是需要對臨界資源進行保護的(
    發表于 10-09 11:02

    ucos測試例程臨界掛起

    ); //創建信號量集 OSStatInit();//初始化統計任務.這里會延時1秒鐘左右 OS_ENTER_CRITICAL();//進入臨界(無法被中斷打斷)OSTaskCreate(led_task
    發表于 05-06 00:01

    【設計技巧】rtos的核心原理簡析

    其他外設中斷也能夠立刻切換。二、 臨界 切換是可以了,但是現在我的任務運行一個東西就是不能夠被打斷的,怎么呢? 好了,rtos又有了一東西叫臨界
    發表于 07-23 08:00

    為什么臨界可以觸發PENDSV中斷?

    OSCtxSw OSIntCtxSw都在臨界,而這兩個函數都是觸發中斷函數PendSV處理的。臨界不是關中斷啦嗎,為什么還可以觸發Pe
    發表于 10-09 21:02

    淺析RT_Thread系統臨界資源和臨界

    物聯網嵌入式系統:RT_Thread系統臨界資源和臨界(1)-禁止調度和禁止中斷使用互斥特性保護臨界:信號量二值信號量創建二值信號量,為
    發表于 12-22 06:13

    RTThread開關中斷的具體實現過程以及進入臨界的相關操作說明

    ……rt_hw_interrupt_enable(0);//(4)開中斷//退出臨界1……示例2存在的問題就是在第(1)步 的時候關閉了中斷,在第(3)部的時候開啟了中斷。這樣的結果跟我們的意愿是不相符的,我們期望到第(4)
    發表于 05-27 14:52

    代碼進入臨界時還可以搶占臨界資源嗎

    ;#endif /RT_USING_SMP/RTM_EXPORT(rt_enter_critical);看了代碼, 發現進入臨界的時候, 中斷disable然后又enable, 所以, 進入臨界
    發表于 11-25 10:36

    求助,cmsis_RTOS v1版本怎么進臨界

    這個cmsis_RTOS v1版本怎么進臨界? 難道是把所有任務掛起嗎? V2 還可以鎖內核
    發表于 11-02 06:15

    什么是臨界RTOS臨界段的作用是什么

    代碼的臨界段也稱為臨界,指處理時不可分割的代碼區域,一旦這部分代碼開始執行,則不允許任何中斷打斷。為確保臨界段代碼的執行不被中斷,在進入臨界
    的頭像 發表于 10-06 14:38 ?1.2w次閱讀
    什么是<b class='flag-5'>臨界</b>段 <b class='flag-5'>RTOS</b><b class='flag-5'>臨界</b>段的作用是什么

    Cortex-M裸機環境下臨界保護的三種實現

    對特別眼熟,在 RTOS 里常常會有多任務(進程)處理,有些情況下一些特殊操作(比如 XIP 下 Flash 擦寫、低功耗模式切換)不能被隨意打斷,或者一些共享數據不能被無序訪問(A 任務正在讀,B 任務卻要寫),這時候就要用到臨界
    的頭像 發表于 09-08 09:23 ?3167次閱讀
    Cortex-M裸機環境下<b class='flag-5'>臨界</b><b class='flag-5'>區</b>保護的三種實現

    什么是RTOS臨界

    代碼的臨界段也稱為臨界,指處理時不可分割的代碼區域,一旦這部分代碼開始執行,則不允許任何中斷打斷。為確保臨界段代碼的執行不被中斷,在進入臨界
    的頭像 發表于 02-14 09:48 ?1116次閱讀
    什么是<b class='flag-5'>RTOS</b><b class='flag-5'>臨界</b>段

    分享一下Cortex-M裸機環境下臨界保護的幾種實現方法

    RTOS臨界,裸機依然有臨界。今天給大家分享一下Cortex-M裸機環境下臨界
    發表于 06-13 09:08 ?785次閱讀
    分享一下Cortex-M裸機環境下<b class='flag-5'>臨界</b><b class='flag-5'>區</b>保護的幾種實現方法

    RTOS臨界段知識詳解

    代碼的臨界段也稱為臨界,指處理時不可分割的代碼區域,一旦這部分代碼開始執行,則不允許任何中斷打斷。
    的頭像 發表于 06-13 14:07 ?1180次閱讀
    <b class='flag-5'>RTOS</b><b class='flag-5'>臨界</b>段知識詳解
    主站蜘蛛池模板: AV无码九九久久| 91福利国产在线观看网站| 亚洲精品第五页中文字幕| Chinesetube国产中文| 久久精品国产亚洲AV蜜臀 | 久久久久激情免费观看| 亚洲精品AV无码重口另类| 国产精品人妻久久无码不卡| 日本XXXXZZX片免费观看| 99久久免费精品国产免费| 美女拉开腿让男生桶到爽| 曰本老头同性xxxxx| 久久精品视频15人人爱在线直播| 亚洲一区免费看| 精品国产中文字幕在线视频| 亚洲第一伊人| 国精产品一区一区三区有限在线| 亚在线观看免费视频入口| 国产午夜永久福利视频在线观看 | 深夜草逼逼| 日本一本道高清码v| 不知火舞vs精子| 热思思| 法国剧丝袜情版h级在线电影| 日日摸夜夜添无码AVA片| 白人大战34厘米黑人BD| 色多多污污下载| 国产麻豆精品人妻无码A片| 亚洲黄色高清| 久久免费资源福利资源站| 69精品国产人妻蜜桃国产毛片| 男人吃奶摸下挵进去啪啪| qvod在线电影| 少女亚洲free| 國產麻豆AVMDXMDX| 中文字幕久久熟女人妻AV免费| 欧美高清vivoesosexo10| 国产v综合v亚洲欧美大片| 亚洲精品乱码8久久久久久日本 | 美女被黑人巨大进入| 啊灬啊灬啊灬快灬深高潮啦|