成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高能預警,一篇五千字長文帶你認識RTOS系統

系統 OpenHarmony
實時操作系統(Real-time operating system, RTOS),又稱即時操作系統,它會按照排序運行、管理系統資源,并為開發應用程序提供一致的基礎。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

在學習openharmony南向開發的時候,很多小伙伴不明白學習liteos-m內核編程代表什么,是什么意思,以及為什么要學習這個,今天以rtos的角度為新手掃盲。

什么是LITEOS-M?

根據openharmony倉庫的解釋,??文檔地址??:

OpenHarmony LiteOS-M內核是面向IoT領域構建的輕量級物聯網操作系統內核,具有小體積、低功耗、高性能的特點,其代碼結構簡單,主要包括內核最小功能集、內核抽象層、可選組件以及工程目錄等,分為硬件相關層以及硬件無關層,硬件相關層提供統一的HAL(Hardware Abstraction Layer)接口,提升硬件易適配性,不同編譯工具鏈和芯片架構的組合分類,滿足AIoT類型豐富的硬件和編譯工具鏈的拓展。

LiteOS-M內核就是一款RTOS,關于RTOS內核是這樣描述的:
實時操作系統(Real-time operating system, RTOS),又稱即時操作系統,它會按照排序運行、管理系統資源,并為開發應用程序提供一致的基礎。
實時操作系統與一般的操作系統相比,最大的特色就是“實時性”,如果有一個任務需要執行,實時操作系統會馬上(在較短時間內)執行該任務,不會有較長的延時。這種特性保證了各個任務的及時執行。

RTOS有什么特點?

維基百科上關于實時性的定義,??地址??

實時運算(Real-time computing)是計算機科學中對受到“實時約束”的計算機硬件和計算機軟件系統的研究,實時約束像是從事件發生到系統回應之間的最長時間限制。實時程序必須保證在嚴格的時間限制內響應。

實時操作系統中都要包含一個實時任務調度器,這個任務調度器與其它操作系統的最大不同是強調:嚴格按照優先級來分配CPU時間,并且時間片輪轉不是實時調度器的一個必選項。
提出實時操作系統的概念,可以至少解決兩個問題:

  • 一個是早期的CPU任務切換的開銷太大,實時調度器可以避免任務頻繁切換導致CPU時間的浪費;
  • 另一個是在一些特殊的應用場景中,必須要保證重要的任務優先被執行。

在這樣的背景下,實時操作系統就被設計出來了,典型的實時操作系統有VxWorks,RT-Thread,uCOS,QNX,WinCE等。
實時任務調度器是實時操作系統的一個必選項,但不代表只要設計出來一個實時調度器就足夠了。事實上設計一個實時調度內核并不是一個多么復雜的任務,實時操作系統的特性是在整個操作系統的設計思路上都要時刻關注實時性。
這些設計思路包括:

#創作者激勵# 高能預警,一篇5k字長文帶你認識RTOS系統-開源基礎軟件社區

為什么要使用RTOS系統?

為什么搞清楚為什么使用RTOS系統,首先來看一下傳統的芯片上開發程序是如何的?

#include <stdio.h>
#include .....
//定義一些FALG變量
int flag_a=0,
int flag_b=0;
int timer_count=0;
....
//某個中斷程序
int ISRxx_callback()
{
//把某個flag置位
flag_a = 1;
}

//另一個中斷程序
int ISRxx_callback()
{
//把某個flag置位
flag_b = 1;
//把某個定時器的計數值賦值
timerCount = 100;
}
int main(){
//初始化某某某
Init_xxx();
Init_yyy();
//運行一個死循環處理事情
while(1){

if(flag_a == 1)
{
//TODO 執行出現a中斷

}
if(flag_b == 1)
{
//TODO 執行出現b中斷

}
if(timerCount > 0)
{
timerCount--;
if(tiemrCount == 0)
{
//TODO 執行定時器到期的操作
}
}

delayMS(100);系統休眠一定時間
}

}

可以看到,系統靠一個大while循環進行包裹,然后通過判斷各種各樣的flag或者計數值進行輪詢處理,在這種編程框架上,如果我們的產品的功能比較簡單,確實可以這樣做,而且需要這么做,不建議引入rtos操作系統,因為那會帶來額外的資源消耗以及封裝.上面這種編程范式業界一般稱為前后臺系統。

但是在當今物聯網時代,我們的產品功能已經比較復雜,而且出現了更多的交互方式比如觸摸屏,無線網絡數據處理等等,并且在某些情況下產品的響應也需要很快,如果采用這樣的while循環的方式無疑就不滿足要求了.仔細看,假如出現某個操作在flag_a里面比較耗時,那么整個系統的節奏也會被拉慢,那么這時候就需要一款RTOS系統來進行管理了。

那么我們來看一下通常RTOS系統的編程范式:

#include <stdio.h>
#include .....

....
//某個中斷程序
int ISRxx_callback()
{
//發送一個消息
send_message(balabala);
}

//另一個中斷程序
int ISRxx_callback()
{
//把某個flag置位
send_event(xx);
//啟動某個軟件定時器
start_timer(id,100);
}

int thread_aa_callback()
{
while(1)
{
//TODO 阻塞接受某個消息,并可指定超時時間
recv_message()
}

}

int thread_bb_callback()
{
while(1){
//TODO 阻塞等待某個事件,并可指定超時時間
wait_event()
}

}

while(1)
{
//初始化某某某
Init_xxx();
Init_yyy();
//啟動線程或任務
start_thread(thread_aa_callback);
start_thread(thread_bb_callback);
}

可以看出在RTOS的編程框架下,不再是一個大的while去進行個種flag的輪詢,產品所做的操作被分成了一個個的線程或任務,線程或任務又通過所謂的事件或者消息進行傳遞數據,整個系統的運行不再由一個flag去區分時間片,而且通過線程間的同步或通信機制去進行高效的配合,所以能夠應對物聯網時代產品功能日趨豐富,場景越來越復雜的情況。

RTOS這么好,好學嗎?

答案:其實rtos系統是不好學的,因為RTOS相比傳統的單片機裸機開發方式,多了很多概念,比如線程啊,線程同步啊,互斥鎖啊,消息隊列啊等等,聽起來就很復雜,但是我們學習一定要掌握一定的思路,任何事物或者機制的出現都是有原因的,簡單概括一下,RTOS系統間各概念是如下關系:

  • 因為要實現RTOS系統,就必須引入多線程或多任務的概念。
  • 多任務編程比單線程復雜,多線程切換就產生了上下文的保存恢復和資源訪問。
  • 為了保存上下文就必須有線程棧
  • 在線程棧之外又有全局棧,多線程程序訪問全局棧就產生了數據一致性問題,為了解決數據一致性問題就有了線程間同步。
  • 為了避免過度使用全局棧要讓線程間共享資源就又有了線程間通信的方式。
  • 既然可以多線程了那中斷就可以實現快如快出了,中斷分為了上下片。
    可以看出來這主要的知識點都是一環套一環,新手如果不理解這其中的因果關系,而是一章一章的去看教程很容易產生云山霧罩的感覺,下面就幾個主要知識點做簡單總結,鑒于篇幅和理解深度的原因,有的地方只能是點到為止,有說錯地方,還望各位踴躍指正。

線程是什么?多線程又是什么?為什么要多線程?

通俗來講,線程就是任務,系統為了實現多任務就要引入多線程。

那么怎么形容這個任務呢:領導叫你給客戶倒杯水可以認為是一個任務,給孩子在網上買一包紙尿褲可以是一個任務,說人話就是事情,那么對應到計算機甚至是我們的嵌入式系統里面,任務就是:點個燈?發送一串串口數據或者是執行一次復位重啟也能算一個任務。

那么多線程其實省略了"同時執行"這幾個字,為什么多線程,顯然是為了執行更多的任務.那有同學要說:以前我們不帶系統的時候也可以做到一個板子做多個事情呀.哈哈,別忘了,這里面還有一個實時呢,關于這部分內容可以查看一下關于前后臺系統和實時系統的解析。

那多線程的程序是怎么運行的?中斷是什么線程?

其實在單核芯片內部多線程并不是同時運行的,而是根據系統調度規則保持在某一個時刻只有一個線程在運行,那有同學就問了,什么是調度?我們可以理解為調控和分配,打個比方,春晚有一個小品叫<<裝修>>,黃大錘先拿大錘破磚,再拿小錘摳縫,這個從大錘變到小錘就是一個調度,發現墻破的差不多了,停止大錘活動,小錘上場繼續.對應到計算機上,就是一個任務執行完了,系統自動將當前任務停止,轉而去執行另一個線程。

中斷不屬于任何一個線程,中斷的優先級大于所有的線程,拿手機去對比:哪怕你馬上要吃雞成功或者王者榮耀正在進行激烈的團戰,只要有電話進來,你的手機都會把游戲停止,讓你決定是否接聽電話,因為在手機的設定中,接打電話是最高優先級事件,所有的其他任務都得給這個事件讓路。

什么是搶占式優先級調度和時間片輪轉調度?

很好理解,搶占式就是某一任務很緊急,必須要打斷其他線程的運行,舉例:你正在吃飯或者正在走路的時候,突然肚子痛要拉肚子,那這時候吃飯和走路的優先級就沒有這個要去上廁所的優先級高,那么我們說:吃飯和走路被上廁所搶占運行。
而時間片輪轉調度就更好理解:給某一線程分配一個最大運行時間,時間一到,不管現在的任務進行的如何,如果還有同等優先級的任務要執行,就轉去執行這個同等優先級的任務,可以結合下面寫作業的例子去理解。

再舉個不形象的例子:語文課和數學課地位同等重要,所以在學校不會有語文老師去搶數學老師的課時,頂多拖下堂.—>這就是時間片輪轉調度,而體育課相比之下數學語文這種"正課"顯得重要,所以很多時候數學老師會跟你們說,這節體育課改上數學.–>優先級搶占。

調度理解了,那線程棧是什么,上下文又是什么?

打個比方,上學的時候我們學習語文數學英語,老師規定作業要這樣寫:寫一分鐘語文,一分鐘的數學,然后再去寫一分鐘英語,這樣不段循環,直到所有的作業都寫完.好等到你開始寫了,先打開語文作業本,找到對應的頁碼和題目,開始寫作業,嘀嘀嘀一分鐘很快到了,你不得不把語文作業本合起來,標記一下寫到了哪里,然后打開數學作業本,找到對應的頁碼和題目,開始寫作業,嘀嘀嘀一分鐘又到了,你又不得不合上數學作業本,把頁碼和題目標記起來,開始同樣的動作去寫英語,等到英語的時間到了之后,又得去把語文作業本打開,找到剛剛記錄的頁碼和題目繼續寫.那么我們想象一下有三個竹筒,里面分別裝有語文,數學,英語的作業相關的信息,這個筒子就是線程棧,那這個筒子里記錄的頁碼和題目就是上下文信息.簡單說來:上下文用于保存和恢復線程運行的狀態和結果等信息,是多線程程序的基石,要實現多任務,就必要有上下文。

線程同步是什么,線程間通信又是什么,他們是干嘛的?

上文說了,每一個線程的棧區和上下文是分別獨立存儲的.現在有個問題:怎么確定線程執行的順序,和對資源訪問的一致性?就好比不對里有嚴格的紀律和軍銜來限制士兵的活動一樣,rtos系統基于優先級來控制線程的運行順序,那總不能高優先級程序一直在運行吧,低優先級任務得不到執行叫什么多線程。

放心,這些問題早都有辦法了,高優先級的任務可以通過調用定時器來達到阻塞當前運行,交出cpu的控制權,當控制權交出后,其他線程得以運行,那么用定時器的阻塞有一個問題:假如線程是要獲取某個東西,當時當定時器到期了還沒獲取到或者說不知道這個東西是不是有效的,那怎么辦?

此時,就要用到信號量或者消息隊列等線程同步或者線程通信等手段了。

區別在于:線程同步不攜帶數據,而線程通信攜帶數據。

舉個線程間同步的例子,當某個線程正打算要讀取某個變量的值,突然被一個高優先級的線程搶占,這個高優先級的任務正好會改變這個變量的值,然后高優先級線程執行完畢,又輪到這個線程去執行,然后這個變量因為被變掉了,所以可能造成該線程的錯誤運行,這個時候就需要用到線程同步了,在當前程序在訪問或者修改某個變量或者外設的時候,用信號量等手段把操作保護起來,這樣當正好發生了高優先級線程搶占式運行的時候,能夠提示一下:嘿哥們我還沒完事呢,你等會哈,這時候等待還是不等,等多久就由高優先級去選擇了.通俗的比方:現在有一個公廁只有一個坑,列兵小王正在蹲坑,這時候團長來了,因為不敢得罪團長,小王不得不讓出坑位讓團長先上,有了線程同步之后,相當于公廁上加了一個鎖,小王上廁所的時候,把門一鎖,管你是多大的領導也得給我等著,哈哈。

再舉個線程間通信的例子:食堂有王姨和張姨,王姨管打飯,張姨管打菜,去食堂吃飯先打飯再打菜,如果不建立起一個良好的線程通信機制,可能就是這樣的:張姨不知道王姨現在是在打菜還是等自己的飯,王姨打完一個菜就不知道干嘛了,玩會手機或者跟別人嘮嘮閑嗑都有可能.或者是張姨不知道王姨打飯速度不夠快,使勁裝飯把王姨的工作臺都占滿了,或者張姨打菜慢王姨打完飯老來問飯好了沒有(不停去訪問某一變量看是否有值),這樣的情況顯然是不合理的.那么用線程間通信,王姨打完飯就在那邊阻塞等飯送過來,張姨裝完飯就放在某個地方,等王姨打完一個菜再裝下一個,這里面的盤子就相當與消息隊列或者郵箱里的一份數據,雙方都需要這個數據,然后通過線程間通信機制正確的執行自己的任務。

中斷的上半部和下半部又是什么?不帶rtos系統的程序怎么沒有這說法?

通常在嵌入式編程中,中斷的處理需要遵循快進快出的原則,而不帶rtos系統因為沒有多任務編程的概念,幾乎不會采用上半部和下半部編程(某些狀態機框架可以實現),通俗來說:上半部就是得到數據,下半部就是處理數據,像這樣把數據的產生和數據的處理分成上下兩層的方式就叫上半部和下半部,所以要是現在上半部和下半部編程,最好就是采用多線程編程,因為可以讓一個線程用消息隊列或者郵箱等方式阻塞在數據接收的地方去等待數據過來,在阻塞期間不影響其他線程的運行。

RTOS這么好,一定要學嗎,一定要用嗎?

前面寫了很多字了,那么以這個問題來結尾吧:在當今物聯網時代,從事單片機或者嵌入式編程一定要學會一款RTOS系統,而且基于RTOS的這些特性,一個很明顯的特點是:會了一款,其他的自然就會了,因為RTOS就那么多東西,不同的RTOS只是API接口長的不一樣,在實現機制上也有些許差別,但是思路不統一的,所以,一定要學會RTOS編程,即使在工作中用不上,學習的過程中用來擴展思維也是不一樣的,學編程,思維很重要。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2022-09-06 08:02:40

死鎖順序鎖輪詢鎖

2021-09-15 16:12:11

數字化轉型

2022-09-14 09:01:55

shell可視化

2020-07-09 07:54:35

ThreadPoolE線程池

2022-07-19 16:03:14

KubernetesLinux

2024-08-26 12:53:06

2020-09-25 10:50:56

C++語言代碼

2021-04-23 10:01:19

JavaScript 關鍵字對象

2023-04-20 08:00:00

ES搜索引擎MySQL

2021-05-20 06:57:16

RabbitMQ開源消息

2021-02-26 05:17:38

計算機網絡二進制

2025-07-02 09:50:55

2022-02-14 10:58:30

研究科學家AI

2023-12-04 08:10:34

Spring循環依賴

2021-10-18 11:58:56

負載均衡虛擬機

2021-06-16 08:28:25

unary 方法函數技術

2022-09-08 10:14:29

人臉識別算法

2021-05-17 05:51:31

KubeBuilderOperator測試

2021-05-18 05:40:27

kubebuilderwebhook進階

2025-01-17 07:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 古典武侠第一页久久777 | 一区欧美 | 欧美激情精品久久久久久 | 日韩伦理一区二区三区 | 亚洲视频在线观看 | 久久伊人亚洲 | 在线第一页 | 在线一区观看 | 中文字幕第100页 | 欧美日韩综合一区 | 国产中文字幕网 | 久久婷婷国产麻豆91 | 日韩精品区 | 国产欧美精品一区二区 | 亚洲一区二区综合 | 天堂久久一区 | 亚洲精品乱码8久久久久久日本 | 成人高清视频在线观看 | 国产伦精品一区二区 | www.97zyz.com| 久久精品在线免费视频 | 精品一区二区三区在线播放 | 国产精品日韩欧美一区二区 | 香蕉一区 | 久久久亚洲精品视频 | 久久精品色欧美aⅴ一区二区 | 亚洲欧美日韩精品久久亚洲区 | 夜夜操天天操 | 国产精品久久久久一区二区三区 | 99影视| 中文字幕成人av | 91国内产香蕉 | 久久精品久久精品久久精品 | 精品粉嫩超白一线天av | 中文字幕在线观看 | 精品中文字幕视频 | 国产精品a久久久久 | 亚洲日本免费 | 亚洲国产精品一区二区三区 | www.亚洲.com | 欧美福利久久 |