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

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RTOS中臨界區(qū)的使用技巧

嵌入式情報(bào)局 ? 來源:最后一個(gè)bug ? 2023-12-12 10:09 ? 次閱讀

1裸機(jī)與RTOS的理解

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

玩RTOS的朋友都知道,裸機(jī)與OS的最大區(qū)別就是實(shí)現(xiàn)多任務(wù)的并發(fā),其實(shí)你說裸機(jī)就不能實(shí)現(xiàn)任務(wù)的并發(fā)嗎 ? 這個(gè)需要看所站的角度吧,只是說RTOS并發(fā)的粒度可以更加細(xì),因?yàn)榘崖銠C(jī)的任務(wù)拆分成多塊運(yùn)行,其實(shí)也是一種并發(fā)方式。

從宏觀上雖然RTOS的每個(gè)任務(wù)都是在并發(fā)執(zhí)行,其實(shí)微觀上還是一條一條指令在順序執(zhí)行著,如下圖所示:

21bda9a6-982f-11ee-8b88-92fbcf53809c.png
而對(duì)于目前主流的RTOS,如UCOS或者FreeRTOS,所實(shí)現(xiàn)的都是多任務(wù),更多的是一種多線程的并發(fā)執(zhí)行而非多進(jìn)程,所以對(duì)應(yīng)到Linux平臺(tái)上稱他們?yōu)閠hread


2并發(fā)帶來的問題

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


而任何事物都有其利弊,多個(gè)任務(wù)在沒有同步處理的情況下,任務(wù)之間是無序運(yùn)行的,無序也就意味著狀態(tài)的多樣性和復(fù)雜度。


當(dāng)然bug菌這里所說的無序是一個(gè)相對(duì)的過程,比如對(duì)于CPU而言,它就是順序的去執(zhí)行一條一條的指令,所以在這個(gè)層面它是有序的、確定的。


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


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


所以對(duì)比看來RTOS確實(shí)會(huì)帶來編程上的難度~



3臨界區(qū)

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


bug菌一直覺得,其實(shí)對(duì)于裸機(jī)而言,如果把中斷服務(wù)函數(shù)看成一個(gè)更高優(yōu)先級(jí)的搶占式任務(wù),其實(shí)裸機(jī)主任務(wù)與中斷任務(wù)就形成了一種兩任務(wù)的并發(fā),所以中斷與任務(wù)之間也是有共享問題需要類似處理的。


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

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



4臨界區(qū)嵌套


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



參考偽代碼:


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


這種臨界區(qū)的使用是很多朋友常犯的錯(cuò)誤,當(dāng)然這里的臨界區(qū)操作僅僅只是開關(guān)中斷,許多自己公司寫的,或者裁剪的都是這種簡(jiǎn)約開關(guān)中斷版本,所以當(dāng)調(diào)用Function1函數(shù)以后,后面的代碼就不在臨界區(qū)內(nèi)了,此時(shí)就有可能會(huì)存在共享問題。



當(dāng)然目前的開源OS都會(huì)提供一種把相關(guān)嵌套標(biāo)記保存在局部變量中的處理方式,如下代碼所示:


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:功能函數(shù)
8 * Author: bug菌
9 ********************************************/
10void Fuction1(void)
11{
12 int cpu_sr;
13
14 OS_ENTER_CRITICAL();//進(jìn)入臨界區(qū)
15
16 //do something~
17
18 OS_EXIT_CRITICAL();//退出臨界區(qū)
19}
20
21/*********************************************
22 * Function: Fuction2
23 * Description: 功能函數(shù)
24 * Author: bug菌
25 ********************************************/
26void Fuction2(void)
27{
28 int cpu_sr;
29
30 OS_ENTER_CRITICAL();//進(jìn)入臨界區(qū)
31
32 Fuction1(void);
33
34 OS_EXIT_CRITICAL();//退出臨界區(qū)
35
36}


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


1//中斷寄存器register原本是1, 向register寫0關(guān)中斷,向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可能具體實(shí)現(xiàn)有所差異,大體上都一樣~



來源:公眾號(hào),最后一個(gè)bug

審核編輯:湯梓紅

聲明:本文內(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)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    456

    文章

    50873

    瀏覽量

    424097
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10871

    瀏覽量

    211944
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    814

    瀏覽量

    119687
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4791

    瀏覽量

    68669

原文標(biāo)題:RTOS中臨界區(qū)的使用是門技術(shù)活~

文章出處:【微信號(hào):嵌入式情報(bào)局,微信公眾號(hào):嵌入式情報(bào)局】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread記錄(五、RT-Thread 臨界區(qū)保護(hù))

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

    【安富萊】【RTX操作系統(tǒng)教程】第11章 臨界段,任務(wù)鎖和中斷鎖

    中有臨界段的話,會(huì)給系統(tǒng)帶來什么問題呢?比如此時(shí)某個(gè)任務(wù)正在調(diào)用系統(tǒng)API函數(shù),而且此時(shí)中斷正好關(guān)閉了,也就是進(jìn)入到了臨界區(qū),這個(gè)時(shí)候如果有一個(gè)緊急的中斷事件被觸發(fā),這個(gè)中斷就不能得
    發(fā)表于 01-25 16:52

    RTOS臨界段知識(shí)詳解

    執(zhí)行完畢后,要立即打開中斷。 臨界段的作用 其實(shí)在RTOS,使用最多的臨界段是OS本身的調(diào)用,但是我們用戶也是需要對(duì)臨界資源進(jìn)行保護(hù)的(
    發(fā)表于 10-09 11:02

    ucos測(cè)試?yán)?b class='flag-5'>中在臨界區(qū)掛起

    ); //創(chuàng)建信號(hào)量集 OSStatInit();//初始化統(tǒng)計(jì)任務(wù).這里會(huì)延時(shí)1秒鐘左右 OS_ENTER_CRITICAL();//進(jìn)入臨界區(qū)(無法被中斷打斷)OSTaskCreate(led_task
    發(fā)表于 05-06 00:01

    【設(shè)計(jì)技巧】rtos的核心原理簡(jiǎn)析

    其他外設(shè)中斷也能夠立刻切換。二、 臨界區(qū) 切換是可以了,但是現(xiàn)在我的任務(wù)運(yùn)行一個(gè)東西就是不能夠被打斷的,怎么呢? 好了,rtos又有了一東西叫臨界區(qū)
    發(fā)表于 07-23 08:00

    為什么臨界區(qū)可以觸發(fā)PENDSV中斷?

    OSCtxSw OSIntCtxSw都在臨界區(qū),而這兩個(gè)函數(shù)都是觸發(fā)中斷函數(shù)PendSV處理的。臨界區(qū)不是關(guān)中斷啦嗎,為什么還可以觸發(fā)Pe
    發(fā)表于 10-09 21:02

    淺析RT_Thread系統(tǒng)臨界資源和臨界區(qū)

    物聯(lián)網(wǎng)嵌入式系統(tǒng):RT_Thread系統(tǒng)臨界資源和臨界區(qū)(1)-禁止調(diào)度和禁止中斷使用互斥特性保護(hù)臨界區(qū):信號(hào)量二值信號(hào)量創(chuàng)建二值信號(hào)量,為
    發(fā)表于 12-22 06:13

    RTThread開關(guān)中斷的具體實(shí)現(xiàn)過程以及進(jìn)入臨界區(qū)的相關(guān)操作說明

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

    代碼進(jìn)入臨界區(qū)時(shí)還可以搶占臨界區(qū)資源嗎

    ;#endif /RT_USING_SMP/RTM_EXPORT(rt_enter_critical);看了代碼, 發(fā)現(xiàn)進(jìn)入臨界區(qū)的時(shí)候, 中斷disable然后又enable, 所以, 進(jìn)入臨界
    發(fā)表于 11-25 10:36

    求助,cmsis_RTOS v1版本怎么進(jìn)臨界

    這個(gè)cmsis_RTOS v1版本怎么進(jìn)臨界? 難道是把所有任務(wù)掛起嗎? V2 還可以鎖內(nèi)核
    發(fā)表于 11-02 06:15

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

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

    Cortex-M裸機(jī)環(huán)境下臨界區(qū)保護(hù)的三種實(shí)現(xiàn)

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

    什么是RTOS臨界

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

    分享一下Cortex-M裸機(jī)環(huán)境下臨界區(qū)保護(hù)的幾種實(shí)現(xiàn)方法

    RTOS臨界區(qū),裸機(jī)依然有臨界區(qū)。今天給大家分享一下Cortex-M裸機(jī)環(huán)境下臨界
    發(fā)表于 06-13 09:08 ?785次閱讀
    分享一下Cortex-M裸機(jī)環(huán)境下<b class='flag-5'>臨界</b><b class='flag-5'>區(qū)</b>保護(hù)的幾種實(shí)現(xiàn)方法

    RTOS臨界段知識(shí)詳解

    代碼的臨界段也稱為臨界區(qū),指處理時(shí)不可分割的代碼區(qū)域,一旦這部分代碼開始執(zhí)行,則不允許任何中斷打斷。
    的頭像 發(fā)表于 06-13 14:07 ?1180次閱讀
    <b class='flag-5'>RTOS</b><b class='flag-5'>臨界</b>段知識(shí)詳解
    主站蜘蛛池模板: 天堂国产| 怡红院黄色| 4hc44四虎www亚洲| 国产一区二区高清在线| 激情综合五月婷婷| 国产精品9999久久久久仙踪林| 国产美女免费| 女人张腿让男子桶免费动态图| 亚洲三级免费观看| 性做久久久久久网站| 久久久久免费观看| 新版天堂资源中文8在线| 午夜网站在线播放| xxx性欧美| 精品xxxxxbbbb欧美中文| 国产三级视频| 五月天婷婷在线播放| 99久久精品久久久久久婷婷| 亚洲最大毛片| 久操免费视频| 天天拍天天干| 免费jlzzjlzz在线播放视频| 午夜a级毛片| 久久人人爽爽爽人久久久| 欧美系列在线观看| 久久在线精品| 深爱五月综合网| 亚洲bbbbbxxxxx精品三十七| lsj老司机精品视频在线观看| 一级毛片在播放免费| 99久久免费中文字幕精品| 亚洲第一页在线| 五月激情综合婷婷| 女毛片| 国产国语videosex另类| 天天曰天天爽| 天堂资源地址在线| 爽爽爽爽爽爽a成人免费视频| 99久久伊人一区二区yy5099| 国产自在自线午夜精品视频| 久久免费国产|