當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式微處理器
[導(dǎo)讀]本文來聊一下關(guān)于單片機(jī)與嵌入式、操作系統(tǒng)與RTOS之間的那些事兒。通過這篇文章,讓你操作系統(tǒng)的實時性有一個系統(tǒng)、全面的理解!

  • 一、前言

  • 二、關(guān)于單片機(jī)與嵌入式系統(tǒng)之間界定

    • 1. 單片機(jī)

    • 2.?嵌入式系統(tǒng)

    • 3. 嵌入式 Linux

  • 三、非實時、軟實時、硬實時

  • 四、x86 Linux 系統(tǒng)的調(diào)度策略

    • 1. 為什么 Linux 系統(tǒng)是軟實時?

    • 2. Linux 系統(tǒng)如何改造成硬實時?

      • (1)?RT-Preempt

      • (2) Xenomai

  • 五、RTOS 的優(yōu)勢

  • 六、總結(jié)

一、前言

前幾天和一個在某研究所的發(fā)小聊天,他說:現(xiàn)在的航空、航天和導(dǎo)彈等武器裝備中,控制系統(tǒng)幾乎都是用單片機(jī),而不是嵌入式系統(tǒng)

乍一聽,和我們的直覺有矛盾?。耗敲锤叽笊系脑O(shè)備,其中的控制邏輯一定很復(fù)雜,不用嵌入式系統(tǒng)怎么來完成那么復(fù)雜的功能控制?。咳缓笞屑?xì)了解了一下,才明白答案是:安全+可控。

這篇文章我們就來聊一下關(guān)于單片機(jī)與嵌入式、操作系統(tǒng)與 RTOS?之間的那些事!通過這篇文章,讓你操作系統(tǒng)的實時性有一個系統(tǒng)、全面的理解!

二、關(guān)于單片機(jī)與嵌入式系統(tǒng)之間界定

說實話,關(guān)于它倆的區(qū)分,沒有人可以給出一個標(biāo)準(zhǔn)的、正確的答案。每個人理解的單片機(jī)與嵌入式系統(tǒng),都是略有差別的。

拋開硬件,從應(yīng)用程序開發(fā)的角度來看,我是這樣來理解的:

單片機(jī):可以直接使用狀態(tài)機(jī)來實現(xiàn)程序框架,也可以利用一些 RTOS(ucOS、FreeRTOS、vxWorks、RT-Thread)等來完成一些調(diào)度功能。

嵌入式系統(tǒng):利用嵌入式 Linux?操作系統(tǒng)以及一些變種來編寫應(yīng)用程序。

我知道自己的理解可能是不對的,至少不嚴(yán)謹(jǐn)、范圍狹隘,既然沒有標(biāo)準(zhǔn)答案,那姑且引用維基百科中的定義吧,畢竟概念是死的,更重要的是我們如何根據(jù)實際的需要來進(jìn)行選擇。

1. 單片機(jī)

  1. 單片機(jī),全稱單片微型計算機(jī)(single-chip microcomputer),又稱微控制器單元 MCU(microcontroller unit)。
  2. 把中央處理器、存儲器、定時/計數(shù)器、各種輸入輸出接口等都集成在一塊集成電路芯片上的微型計算機(jī)。
  3. 由于其發(fā)展非常迅速,舊的單片機(jī)的定義已不能滿足,所以在很多應(yīng)用場合被稱為范圍更廣的微控制器;

2. 嵌入式系統(tǒng)

  1. 嵌入式系統(tǒng)(Embedded System),是一種嵌入機(jī)械或電氣系統(tǒng)內(nèi)部、具有專一功能和實時計算性能的計算機(jī)系統(tǒng)。
  2. 嵌入式系統(tǒng)常被用于高效控制許多常見設(shè)備,被嵌入的系統(tǒng)通常是包含數(shù)字硬件和機(jī)械部件的完整設(shè)備,例如汽車的防鎖死剎車系統(tǒng)。
  3. 現(xiàn)代嵌入式系統(tǒng)通常是基于微控制器(如含集成內(nèi)存和/或外設(shè)接口的中央處理單元)的,但在較復(fù)雜的系統(tǒng)中普通微處理器(使用外部存儲芯片和外設(shè)接口電路)也很常見。

3. 嵌入式Linux

  1. 嵌入式Linux(英語:Embedded Linux)是一類嵌入式操作系統(tǒng)的概稱,這類型的操作系統(tǒng)皆以Linux內(nèi)核為基礎(chǔ),被設(shè)計來使用于嵌入式設(shè)備。
  2. 與電腦端運行的linux系統(tǒng)本質(zhì)上是一樣的,雖然經(jīng)過了一些功能上的裁剪,但是本質(zhì)上是一樣的,主要利用 Linux 內(nèi)核中的的任務(wù)調(diào)度、內(nèi)存管理、硬件抽象等功能。

4. RTOS

  1. 實時操作系統(tǒng)(RTOS),又稱即時操作系統(tǒng),它會按照排序運行、管理系統(tǒng)資源,并為開發(fā)應(yīng)用程序提供一致的基礎(chǔ)。
  2. 實時操作系統(tǒng)與一般的操作系統(tǒng)相比,最大的特色就是“實時性”,如果有一個任務(wù)需要執(zhí)行,實時操作系統(tǒng)會馬上(在較短時間內(nèi))執(zhí)行該任務(wù),不會有較長的延時。這種特性保證了各個任務(wù)的及時執(zhí)行。

三、非實時、軟實時、硬實時

首先要明白什么叫實時性?實時性考慮的不是速度、性能、吞吐量,而是確定性,也就是說:當(dāng)一個事件發(fā)生的時候,可以確定性的保證在多長時間內(nèi)得到處理,只要能滿足這個要求,就可以成為硬實時。比如:

操作系統(tǒng)1:當(dāng)中斷發(fā)生時,可以保證在 1 秒內(nèi)得到這里,那么它就是硬實時系統(tǒng),雖然響應(yīng)時間長,但它是確定的;
操作系統(tǒng)2:當(dāng)中斷發(fā)生時,幾乎都可以在 1 毫秒內(nèi)完成,那么那就不能成為硬實系統(tǒng),雖然響應(yīng)時間短,但是它不確定。

也看到有文章說:應(yīng)該取消軟實時這個模棱兩可的說法,要么是實時,要么是非實時!

操作系統(tǒng)包含的功能很多:任務(wù)調(diào)度、內(nèi)存管理、文件管理等等,其中最核心的就是任務(wù)調(diào)度,這也是非實時、軟實時、硬實時的最大區(qū)別。

也就是說,衡量實時性的指標(biāo)就是:

1. 中斷延時:一個外部事件引發(fā)的中斷發(fā)生時,到相應(yīng)的中斷處理程序第一條指令被執(zhí)行時,所經(jīng)過的時間;
2. 任務(wù)搶占延時:當(dāng)一個高優(yōu)先級的任務(wù)準(zhǔn)備就緒時,從正在執(zhí)行的低優(yōu)先級任務(wù)中搶奪 CPU 資源所經(jīng)過的時間;

不同的操作系統(tǒng),其任務(wù)調(diào)度機(jī)制也是不一樣的,而這個調(diào)度機(jī)制的策略,又是與實際的使用場景相關(guān)的。因此,并不存在哪個好、哪個不好這樣的說法,合適的就是最好的!

比如:我們的桌面系統(tǒng),需要考慮的是多任務(wù)、并發(fā),需要同時執(zhí)行多個程序,哪個程序慢一點,用戶無所謂,甚至覺察不到;但是對于一個導(dǎo)彈控制系統(tǒng),當(dāng)一個外部傳感器輸入信號,觸發(fā)一個事件時,對應(yīng)的處理必須立刻執(zhí)行,否則耽擱 1 毫秒,結(jié)果可能就是差之千里!

四、x86 Linux 系統(tǒng)的調(diào)度策略

我們?nèi)粘J褂玫?PC 機(jī),它的主要目標(biāo)是并行執(zhí)行多任務(wù),強(qiáng)調(diào)的是吞吐率(盡可能多的執(zhí)行很多應(yīng)用程序的代碼),因此,采用的是分時操作系統(tǒng),也就是每個任務(wù)都有一個時間片,當(dāng)一個任務(wù)分配的時間片用完了,就自動換出(調(diào)度),然后執(zhí)行下一個任務(wù)。

我們平常在寫 x86 平臺上寫普通的客戶端程序時,很少需要指定應(yīng)用程序的調(diào)度策略和優(yōu)先級,使用的是系統(tǒng)默認(rèn)的調(diào)度機(jī)制。反過來說,也就是在某些需要的場合下,是可以設(shè)置進(jìn)程的調(diào)度策略和優(yōu)先級的。

例如在 Linux 系統(tǒng)中,可以通過?sched_setscheduler()?系統(tǒng)函數(shù)?設(shè)置 3 種調(diào)度策略:

1. SCHED_OTHER: 系統(tǒng)默認(rèn)的調(diào)度策略,計算動態(tài)優(yōu)先級(counter+20-nice),當(dāng)時間片用完之后放在就緒隊列尾;
2. SCHED_FIFO: 實時調(diào)度策略,根據(jù)優(yōu)先級進(jìn)行調(diào)度,一旦占用CPU就一直執(zhí)行,直到自己放棄執(zhí)行或者有更高優(yōu)先級的任務(wù)需要執(zhí)行;
3. SCHED_RR: 也是實時調(diào)度策略,在 SCHED_FIFO 的基礎(chǔ)上添加了時間片。在執(zhí)行時,可以被更高優(yōu)先級的任務(wù)打斷,如果沒有更高優(yōu)先級的任務(wù),那么當(dāng)任務(wù)的執(zhí)行時間片用完之后,就會查找相同優(yōu)先級的任務(wù)來執(zhí)行。

1. 為什么 Linux 系統(tǒng)是軟實時的?

可能有小伙伴會有疑問:既然 Linux 系統(tǒng)中提供了?SCHED_FIFO?基于優(yōu)先級的調(diào)度策略,為什么仍然不能稱之為真正的硬實時操作系統(tǒng)?這就要從 Linux 的發(fā)展歷史說起了。

Linux 操作系統(tǒng)在設(shè)計之初,就是為了桌面應(yīng)用而開發(fā)的,在那個時代,多個終端(電傳打字機(jī)和屏幕)連接到同一個電腦主機(jī),需要處理的是多任務(wù)、并行操作,并不需要考慮實時性,因此,在 Linux 內(nèi)核中的一些基因,嚴(yán)重影響了它的實時性,例如有如下幾個因素:

(1) 內(nèi)核不可搶占

我們知道,一個應(yīng)用程序在執(zhí)行時,可以在用戶態(tài)和內(nèi)核態(tài)執(zhí)行(當(dāng)調(diào)用一個系統(tǒng)函數(shù),例如:write 時,就會進(jìn)入內(nèi)核態(tài)執(zhí)行),此時任務(wù)是不可搶占的。

即使有優(yōu)先級更高的任務(wù)準(zhǔn)備就緒,當(dāng)前的任務(wù)也不能立刻停止執(zhí)行。而是必須等到當(dāng)前這個任務(wù)返回到用戶態(tài),或者在內(nèi)核態(tài)中需要等待某個資源而睡眠時,高優(yōu)先級任務(wù)才可以執(zhí)行。

因此,這就很顯然無法保證高優(yōu)先級任務(wù)的實時性了。

(2) 自旋鎖

自旋鎖是用于多線程同步的一種鎖,用來對共享資源的一種同步機(jī)制,線程反復(fù)檢查鎖變量是否可用。由于線程在這一過程中保持執(zhí)行,因此是一種忙等待。一旦獲取了自旋鎖,線程會一直保持該鎖,直至顯式釋放自旋鎖。

自旋鎖避免了進(jìn)程上下文的調(diào)度開銷,因此對于線程只會阻塞很短時間的場合是有效的,也就是說,只能在阻塞很短的時間才適合使用自旋鎖。

但是,在自旋鎖期間,任務(wù)搶占將會失效,這就是說,即使自旋鎖的阻塞時間很短,但是這仍然會增加任務(wù)搶占延時,讓調(diào)度變得不確定。

(3) 中斷的優(yōu)先級是最高的

任何時刻,只要中斷發(fā)生,就會立刻執(zhí)行中斷服務(wù)程序,也就是中斷的優(yōu)先級是最高的。只有當(dāng)所有的外部中斷和軟終端都處理結(jié)束了,正常的任務(wù)才能得到執(zhí)行。

這看起來是好事情,但是想一想,如果有比中斷優(yōu)先級更高的任務(wù)呢?假如系統(tǒng)在運行中,網(wǎng)口持續(xù)接收到數(shù)據(jù),那么中斷就一直被執(zhí)行,那么其他任務(wù)就可能一直得不到執(zhí)行的機(jī)會,這是影響 Linux 系統(tǒng)實時性的巨大挑戰(zhàn)。

(4) 同步操作時關(guān)閉中斷

如果去看 Linux 內(nèi)核的代碼,可以看到在很多地方都執(zhí)行了關(guān)中斷指令,如果在這期間發(fā)生了中斷,那么中斷響應(yīng)時間就沒法保證了。

2. Linux 系統(tǒng)如何改成硬實時?

以上描述的幾個因素,對 Linux 實現(xiàn)真正的實時性構(gòu)成了很大的障礙,但是現(xiàn)實世界又的確有很多場合需要 Linux 具有硬實時,那么就要針對上面的每一個因素提出解決方案。

目前主流的解決方案有 2 個:

  1. 單內(nèi)核解決方案:給 Linux 內(nèi)核打補(bǔ)丁,解決上面提到的幾個問題,例如:RT-Preempt;
  2. 雙內(nèi)核解決方案:在硬件抽象層之上,運行 2 個內(nèi)核:實時內(nèi)核 + Linux 內(nèi)核,它們分別向上層提供 API 函數(shù),例如:Xenomai;

這 2 種解決方案分別有不同的實現(xiàn),從調(diào)研情況來看,RT-Preempt 和 Xenomai?是使用比較多的,下面分別來看一下他們的優(yōu)缺點。

(1)RT-Preempt

這種方式主要是對 Linux 內(nèi)核進(jìn)行打補(bǔ)丁,解決了上面所說的幾個問題:內(nèi)核不可搶占、自旋鎖、關(guān)中斷以及終端優(yōu)先級的問題。

至于每一個問題是如何解決的,由于篇幅關(guān)系,這里就不介紹了,感興趣的小伙伴如果需要的話,可以深入了解一下。

由于是直接在 Linux 內(nèi)核上打補(bǔ)丁(以后肯定會合并到主分支中的),因此對于應(yīng)用程序開發(fā)來說,操作系統(tǒng)向上層提供的?API 接口函數(shù)可以保持不變,這對應(yīng)用程序開發(fā)來說是一件好事情。

(2)Xenomai

Xenomai是一個 Linux 內(nèi)核的實時開發(fā)框架,它希望通過無縫地集成到 Linux 環(huán)境中來給用戶空間應(yīng)用程序提供全面的,與接口無關(guān)的硬實時性能。下面是 Xenomai 的架構(gòu)圖:

在硬件抽象層之上,是 2 個并列的域(內(nèi)核),這 2 個內(nèi)核分別向上層提供自己的 API 接口函數(shù)。

圖中?glibc?是 Linux 系統(tǒng)提供的庫函數(shù),應(yīng)用程序通過調(diào)用庫函數(shù)和系統(tǒng)調(diào)用來編寫程序。

Xenomai 也提供了相應(yīng)的庫函數(shù)?libcobalt?,這個庫函數(shù)是需要我們在用戶層編譯、安裝的,就像安裝第三方庫一樣。

此外,Xenomai 還參考不同的操作系統(tǒng)風(fēng)格,提供了好幾套 API 函數(shù)(之前的說法是:皮膚),API 接口函數(shù)在這里:

從圖中可以看到,Alchemy API?這套接口提供的功能更完善,提供了:定時器、內(nèi)存管理、條件變量、事件、互斥鎖、消息隊列、任務(wù)(可以理解為線程)等 API 函數(shù)。這一套 API 函數(shù)中具體的功能與 POSIX 標(biāo)準(zhǔn)大體相同,在一些細(xì)節(jié)上存在一些差異。

由于 Xenomai 向應(yīng)用層提供的 API 函數(shù)是獨立的一套,因此,如果我們需要創(chuàng)建實時任務(wù),那么就要調(diào)用這一套接口函數(shù)來創(chuàng)建任務(wù),包括使用其中的一些資源(例如:內(nèi)存分配)。而且文檔中也提出了一些注意點,例如:某些資源不能在 Xenomai 與 Linux 系統(tǒng)之間混用。

五、RTOS 的優(yōu)勢

上面已經(jīng)說到,Linux 桌面系統(tǒng)的主要目標(biāo)是吞吐量,在單位時間內(nèi)執(zhí)行更多的代碼。

但是對于單片機(jī)來說,首要目標(biāo)不是吞吐量,而是確定性,因此衡量一個實時操作系統(tǒng)堅固性的重要指標(biāo),是系統(tǒng)從接收一個任務(wù),到完成該任務(wù)所需的時間。也就是說,任務(wù)調(diào)度才是第一考量要素。

在單片機(jī)開發(fā)中,一般有 2 種編程模型:基于狀態(tài)機(jī)(裸跑),基于 RTOS

如果基于狀態(tài)機(jī),就不存在任務(wù)調(diào)度問題了,因為只有一個執(zhí)行序列,所有的操作都是串行執(zhí)行的,唯一需要注意的控制流程就是中斷處理。

如果基于 RTOS,主要利用的就是任務(wù)調(diào)度,實現(xiàn)真正的硬實時。這方面最牛逼的就是VxWorks了,當(dāng)然價格也是非??捎^的,有些公司購買之后,甚至?xí)殉?span style="color: orange;">任務(wù)調(diào)度模塊之外的其他模塊全部重寫一遍,這也足以證明了 VxWorks 在任務(wù)調(diào)度處理上的確很厲害,這也是它的看家本領(lǐng)!

當(dāng)然,對于簡單、需要嚴(yán)格控制執(zhí)行序列的關(guān)鍵程序來說,使用有限狀態(tài)機(jī)的編程框架,一切都在自己的掌握中。只要代碼中沒有 bug,那么理論上,一切行為都是在控制之中的,這也是為什么很多軍事設(shè)備上使用單片機(jī)的原因!

六、總結(jié)

關(guān)于任務(wù)調(diào)度的問題,是一個操作系統(tǒng)的重中之重,其中需要學(xué)習(xí)的內(nèi)容還有很多,最近剛買了一本陳海波老師的新書,也就是華為的鴻蒙系統(tǒng)背后的靈魂人物。

如果有新的學(xué)習(xí)心得,再跟大家分享。


參考文獻(xiàn):

https://linuxfoundation.org/blog/intro-to-real-time-linux-for-embedded-developers/
https://wiki.archlinux.org/index.php/Realtime_kernel_patchset
http://www.faqs.org/faqs/realtime-computing/faq/
https://xenomai.org/documentation/xenomai-3/html/README.INSTALL/


好文章,要轉(zhuǎn)發(fā);越分享,越幸運!???

END

來源:IoT物聯(lián)網(wǎng)小鎮(zhèn),作者:道哥

版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。

推薦閱讀
你怎樣選擇開源免費RTOS?
GD32也開始假貨翻新泛濫了
工程師姓什么很重要!別再叫我“X工”?。?!


→點關(guān)注,不迷路←

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉