日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內不再提示

裸機與RTOS的理解和并發(fā)帶來的問題

Q4MP_gh_c472c21 ? 來源:最后一個bug ? 作者:bug菌 ? 2021-06-13 15:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1

裸機與RTOS的理解

首先這里只針對單核CPU架構的芯片展開討論,大部分是MCU吧,而多核CPU的討論相對比較復雜,暫不涉及~玩RTOS的朋友都知道,裸機與OS的最大區(qū)別就是實現(xiàn)多任務的并發(fā),其實你說裸機就不能實現(xiàn)任務的并發(fā)嗎 ? 這個需要看所站的角度吧,只是說RTOS并發(fā)的粒度可以更加細,因為你把裸機的任務拆分成多塊運行,其實也是一種并發(fā)方式。從宏觀上雖然RTOS的每個任務都是在并發(fā)執(zhí)行,其實微觀上還是一條一條指令在順序執(zhí)行著。

而對于目前主流的RTOS,如UCOS或者FreeRTOS,所實現(xiàn)的都是多任務,更多的是一種多線程的并發(fā)執(zhí)行而非多進程,所以對應到Linux平臺上稱他們?yōu)閠hread。

2

并發(fā)帶來的問題

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

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

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

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

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

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

3

臨界區(qū)

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

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

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

1ENTER_CRITICAL();//進入臨界區(qū)23//臨界區(qū)代碼45EXIT_CRITICAL();//退出臨界區(qū)

4

臨界區(qū)嵌套

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

參考偽代碼:

1/********************************************* 2 * Function: Fuction1 3 * Description:功能函數(shù)

4 * Author: bug菌 5 ********************************************/ 6void Fuction1(void)7{ 8 ENTER_CRITICAL();//進入臨界區(qū) 910 //do something~1112 EXIT_CRITICAL();//退出臨界區(qū)

13} 14/********************************************* 15 * Function: Fuction2 16 * Description: 功能函數(shù) 17 * Author: bug菌 18 ********************************************/19void Fuction2(void) 20{ 21 ENTER_CRITICAL();//進入臨界區(qū)2223... 24 Fuction1(); 2526. 27 //do something~2829 EXIT_CRITICAL();//退出臨界區(qū)30}

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

當然目前的開源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:功能函數(shù) 8 * Author: bug菌 9 ********************************************/10void Fuction1(void) 11{ 12 int cpu_sr; 1314 OS_ENTER_CRITICAL();//進入臨界區(qū)

1516 //do something~1718 OS_EXIT_CRITICAL();//退出臨界區(qū)

19} 2021/********************************************* 22 * Function: Fuction2 23 * Description: 功能函數(shù) 24 * Author: bug菌

25 ********************************************/26void Fuction2(void) 27{ 28 int cpu_sr; 2930 OS_ENTER_CRITICAL();//進入臨界區(qū)3132 Fuction1(void); 3334 OS_EXIT_CRITICAL();//退出臨界區(qū)

3536}

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

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; 910 void Fuction1(void) 11 { 12 int cpu_sr1 = 0; 1314 cpu_sr2 = register; 15 register = 0; //register == 0;cpu_sr2 == 0;

161718 register = cpu_sr2; 19 cpu_sr2 = 0;//register == 0;

cpu_sr2 == 0;20 } 2122 register = cpu_sr1; 23 cpu_sr1 = 0;//register == 1;cpu_sr1 == 0;2425}

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

原文標題:同事在RTOS“臨界區(qū)嵌套使用”栽了跟頭~

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

責任編輯:haq

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

    關注

    68

    文章

    11332

    瀏覽量

    225982
  • RTOS
    +關注

    關注

    25

    文章

    871

    瀏覽量

    123232
  • 裸機程序
    +關注

    關注

    0

    文章

    5

    瀏覽量

    7169

原文標題:同事在RTOS"臨界區(qū)嵌套使用"栽了跟頭~

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Nginx高并發(fā)連接調優(yōu)實戰(zhàn)手冊

    Nginx 的高性能源自其事件驅動架構。與 Apache 的"每連接一線程"模型不同,Nginx 使用單線程事件循環(huán)處理數(shù)千個并發(fā)連接。理解這套架構是調優(yōu)的前提。
    的頭像 發(fā)表于 03-16 15:28 ?490次閱讀

    Nordic nRF Connect SDK裸機選項v1.0.0版本的亮點

    我們近期發(fā)布了nRF Connect SDK裸機選項的新版本(v1.0.0)。本次更新帶來了令人興奮的新功能和改進,希望您會喜歡。
    的頭像 發(fā)表于 01-16 11:18 ?1663次閱讀

    【瑞薩FPB-RA6E2試用】【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實時操作系統(tǒng))《線程》個人理解及項目實現(xiàn)

    【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實時操作系統(tǒng))《線程》個人理解及項目實現(xiàn) 1. RTOS(Real-Time Operating
    發(fā)表于 01-14 11:50

    搞嵌入式的為啥要一定要學習RTOS

    專業(yè)的最后大部分都進入嵌入式這個領域,入門首先接觸的是單片機編程,尤其是C51單片機,基礎的單片機編程通常都是指裸機編程,即不加入任何 RTOS(Real Time Operating System
    發(fā)表于 01-05 06:42

    使用RTOS時需要注意的幾點內容分享

    兩個方面:內核和設備驅動器調試以及操作系統(tǒng)感知。 內核調試對設備驅動器的創(chuàng)建和支持以及內核強化很重要。在許多情況,為處理RTOS的內核,需要專用調試器。它也要求能理解內核環(huán)境以及應用環(huán)境。 OS感知可
    發(fā)表于 12-23 06:34

    裸機前后臺的系統(tǒng)

    裸機系統(tǒng)中,所有的操作都是在一個無限的大循環(huán)里面實現(xiàn),支持中斷檢測。外部中斷緊急事件在中斷里面標記或者響應,中斷服務稱為前臺,main 函數(shù)里面的while(1)無限循環(huán)稱為后臺,按順序處理業(yè)務
    發(fā)表于 12-08 07:34

    請問rtos效率能有裸機的多少啊?

    rtos效率能有裸機的多少???
    發(fā)表于 12-05 07:37

    學習RTOS的意義?

    對于嵌入式軟件工程師,學習RTOS非常有必要。 1. 項目需要 隨著產(chǎn)品要實現(xiàn)的功能越來越多,單純的裸機系統(tǒng)已經(jīng)不能完美地解決問題,反而會使編程變得更加復雜,如果想降低編程的難度,就必須引入
    發(fā)表于 11-27 08:16

    RTOS 必學概念:任務、信號量、隊列一次搞懂

    如果你剛接觸RTOS(實時操作系統(tǒng)),很可能會有這樣的困惑:“RTOS裸機程序到底有什么區(qū)別?”“任務是線程嗎?為什么要分任務?”“信號量和互斥鎖有什么區(qū)別,不都是同步手段嗎?”“隊列是不是就是一
    的頭像 發(fā)表于 11-17 10:53 ?709次閱讀
    <b class='flag-5'>RTOS</b> 必學概念:任務、信號量、隊列一次搞懂

    裸機方式的缺點有哪些

    理解。 超級循環(huán)使得應用程序變得非常復雜,因此難以擴展: 一個簡單的更改就可能產(chǎn)生不可預測的副作用,對這種副作用進行分析非常耗時。 超級循環(huán)概念的這些缺點可以通過使用實時操作系統(tǒng) (RTOS) 來解決。
    發(fā)表于 11-17 06:11

    深度技術解析nRF Connect SDK裸機選項方案

    設計,例如需要連接功能的直接數(shù)據(jù)交換應用(如醫(yī)療設備、運動可穿戴設備、追蹤器或信標等場景),此類應用毋須使用RTOS或高級功能。 裸機選項已集成至nRF Connect for VS Code開發(fā)環(huán)境
    發(fā)表于 10-31 23:11

    深度技術解析低功耗藍牙廠商nordic的nRF Connect SDK裸機選項方案

    RTOS方面。 由于裸機選項的開發(fā)與基于Zephyr RTOS的開發(fā)在核心機制上高度一致,當用戶認為RTOS能為新應用或開發(fā)流程帶來額外價值
    發(fā)表于 10-29 21:17

    請問編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?

    編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?
    發(fā)表于 07-11 07:22

    【STM32單片機學習進階路線】FreeRTOS嵌入式開發(fā)指南:從入門到智能循跡避障小車項目實戰(zhàn)(含文檔代碼)

    STM32的學習路徑一般是先掌握裸機開發(fā),再進階學習RTOS。簡單的功能可通過裸機實現(xiàn),而復雜產(chǎn)品則需借助RTOS來完成。隨著RTOS應用場
    的頭像 發(fā)表于 05-29 11:46 ?1581次閱讀
    【STM32單片機學習進階路線】FreeRTOS嵌入式開發(fā)指南:從入門到智能循跡避障小車項目實戰(zhàn)(含文檔代碼)

    STM32裸機及FreeRTOS項目分享:U575智能手表+F103智能循跡避障小車(附全套教程/代碼)

    初學者學STM32時,有一個好的學習路線是非常重要的,推薦"裸機開發(fā)--裸機項目--RTOS開發(fā)--RTOS項目"這個體系化路線,從基礎技能到項目實戰(zhàn)一步步進階,能讓學習更有
    的頭像 發(fā)表于 05-27 17:09 ?1792次閱讀
    STM32<b class='flag-5'>裸機</b>及FreeRTOS項目分享:U575智能手表+F103智能循跡避障小車(附全套教程/代碼)
    白山市| 麻江县| 巴里| 清流县| 威宁| 贵溪市| 辽阳县| 天水市| 仪征市| 老河口市| 云安县| 武义县| 莱西市| 巴青县| 芦溪县| 漳平市| 茂名市| 上犹县| 离岛区| 漳州市| 开封县| 彩票| 福建省| 永顺县| 长武县| 武山县| 罗甸县| 六枝特区| 铁岭县| 沅陵县| 广西| 阜平县| 梨树县| 梁平县| 海晏县| 师宗县| 洞头县| 太原市| 屯门区| 铜鼓县| 襄城县|