chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

裸機(jī)與RTOS的理解和并發(fā)帶來(lái)的問(wèn)題

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

掃碼添加小助手

加入工程師交流群

1

裸機(jī)與RTOS的理解

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

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

2

并發(fā)帶來(lái)的問(wèn)題

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

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

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

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

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

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

3

臨界區(qū)

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

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

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

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

4

臨界區(qū)嵌套

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

參考偽代碼:

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

4 * Author: bug菌 5 ********************************************/ 6void Fuction1(void)7{ 8 ENTER_CRITICAL();//進(jìn)入臨界區(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();//進(jìn)入臨界區(qū)2223... 24 Fuction1(); 2526. 27 //do something~2829 EXIT_CRITICAL();//退出臨界區(qū)30}

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

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

1//來(lái)源于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();//進(jìn)入臨界區(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();//進(jìn)入臨界區(qū)3132 Fuction1(void); 3334 OS_EXIT_CRITICAL();//退出臨界區(qū)

3536}

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

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    68

    文章

    11213

    瀏覽量

    222761
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    862

    瀏覽量

    122561
  • 裸機(jī)程序
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7138

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    學(xué)習(xí)RTOS的意義?

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

    RTOS 必學(xué)概念:任務(wù)、信號(hào)量、隊(duì)列一次搞懂

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

    裸機(jī)方式的缺點(diǎn)有哪些

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

    深度技術(shù)解析nRF Connect SDK裸機(jī)選項(xiàng)方案

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

    深度技術(shù)解析低功耗藍(lán)牙廠商nordic的nRF Connect SDK裸機(jī)選項(xiàng)方案

    RTOS方面。 由于裸機(jī)選項(xiàng)的開(kāi)發(fā)與基于Zephyr RTOS的開(kāi)發(fā)在核心機(jī)制上高度一致,當(dāng)用戶認(rèn)為RTOS能為新應(yīng)用或開(kāi)發(fā)流程帶來(lái)額外價(jià)值
    發(fā)表于 10-29 21:17

    請(qǐng)問(wèn)編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?

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

    【STM32單片機(jī)學(xué)習(xí)進(jìn)階路線】FreeRTOS嵌入式開(kāi)發(fā)指南:從入門(mén)到智能循跡避障小車項(xiàng)目實(shí)戰(zhàn)(含文檔代碼)

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

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

    初學(xué)者學(xué)STM32時(shí),有一個(gè)好的學(xué)習(xí)路線是非常重要的,推薦"裸機(jī)開(kāi)發(fā)--裸機(jī)項(xiàng)目--RTOS開(kāi)發(fā)--RTOS項(xiàng)目"這個(gè)體系化路線,從基礎(chǔ)技能到項(xiàng)目實(shí)戰(zhàn)一步步進(jìn)階,能讓學(xué)習(xí)更有
    的頭像 發(fā)表于 05-27 17:09 ?1141次閱讀
    STM32<b class='flag-5'>裸機(jī)</b>及FreeRTOS項(xiàng)目分享:U575智能手表+F103智能循跡避障小車(附全套教程/代碼)

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個(gè)關(guān)鍵特性,通過(guò)該函數(shù),用戶可以增強(qiáng)對(duì)任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?815次閱讀

    DeepSeek企業(yè)級(jí)部署RakSmart裸機(jī)云環(huán)境準(zhǔn)備指南

    RakSmart裸機(jī)云環(huán)境中部署DeepSeek的企業(yè)級(jí)環(huán)境準(zhǔn)備指南,內(nèi)容涵蓋關(guān)鍵步驟和注意事項(xiàng),主機(jī)推薦小編為您整理發(fā)布DeepSeek企業(yè)級(jí)RakSmart裸機(jī)云部署指南。
    的頭像 發(fā)表于 03-24 10:07 ?742次閱讀

    RTOS中的本地存儲(chǔ)指針使用

    本地存儲(chǔ)指針是RTOS中的一個(gè)重要特性,增強(qiáng)了任務(wù)管理和數(shù)據(jù)處理能力。在RTOS上下文中,本地存儲(chǔ)是指存儲(chǔ)在本地的特定任務(wù)或?qū)ο蟮臄?shù)據(jù)。通常與任務(wù)本地存儲(chǔ)(Task Local Storage,TLS)有關(guān),其中數(shù)據(jù)存儲(chǔ)在任務(wù)控制塊(TCB)中,允許每個(gè)任務(wù)具有私有的、特
    的頭像 發(fā)表于 02-28 16:33 ?1158次閱讀
    <b class='flag-5'>RTOS</b>中的本地存儲(chǔ)指針使用

    美國(guó)裸機(jī)云服務(wù)器是什么詳細(xì)介紹

    美國(guó)裸機(jī)云服務(wù)器是一種高性能的計(jì)算資源,在云計(jì)算領(lǐng)域逐漸受到企業(yè)和開(kāi)發(fā)者的青睞。主機(jī)推薦小編為您整理發(fā)布美國(guó)裸機(jī)云服務(wù)器的詳細(xì)介紹,希望對(duì)您了解美國(guó)裸機(jī)云服務(wù)器是什么有幫助。
    的頭像 發(fā)表于 02-07 15:56 ?597次閱讀

    “國(guó)產(chǎn)雙系統(tǒng)”出爐!復(fù)旦微FMQL20SM非對(duì)稱AMP:Linux + 裸機(jī)

    Linux + RTOS/裸機(jī),但需一個(gè)主核心來(lái)控制整個(gè)系統(tǒng)以及其它從核心。每個(gè)處理器核心相互隔離,擁有屬于自己的內(nèi)存,既可各自獨(dú)立運(yùn)行不同的任務(wù),又可多個(gè)核心之間進(jìn)行核間通信。 圖 1 FMQL20SM AMP異構(gòu)多核框架示意圖 “非對(duì)稱 AMP” 對(duì)工業(yè)的重大意義 更
    的頭像 發(fā)表于 01-24 13:46 ?1155次閱讀
    “國(guó)產(chǎn)雙系統(tǒng)”出爐!復(fù)旦微FMQL20SM非對(duì)稱AMP:Linux + <b class='flag-5'>裸機(jī)</b>

    【新品發(fā)布】啟明云端WT01C202-AI-S1模組來(lái)襲,為智能語(yǔ)音產(chǎn)品開(kāi)發(fā)帶來(lái)新可能!

    的高性能模組——啟明云端WT01C202-AI-S1,它將為智能語(yǔ)音產(chǎn)品開(kāi)發(fā)帶來(lái)新的可能!基于ESP32-C2芯片設(shè)計(jì)啟明云端WT01C202-AI-S1模組基于樂(lè)鑫E
    的頭像 發(fā)表于 01-10 17:58 ?1891次閱讀
    【新品發(fā)布】啟明云端WT01C202-AI-S1模組來(lái)襲,為智能語(yǔ)音產(chǎn)品開(kāi)<b class='flag-5'>發(fā)帶來(lái)</b>新可能!

    RZ T2H PCIe裸機(jī)程序開(kāi)發(fā)和Linux下的配置介紹

    瑞薩電子最新推出RZ/T2H工業(yè)專用MPU,單芯片提供強(qiáng)大應(yīng)用處理性能,多協(xié)議工業(yè)網(wǎng)絡(luò)及高達(dá)9軸高精度實(shí)時(shí)控制,支持Linux,RTOS及baremetal操作。除了強(qiáng)大CPU性能和9軸控制外設(shè)外
    的頭像 發(fā)表于 12-18 11:14 ?2468次閱讀
    RZ T2H PCIe<b class='flag-5'>裸機(jī)</b>程序開(kāi)發(fā)和Linux下的配置介紹