非實時、軟實時、硬實時
首先要明白什么叫實時性?實時性考慮的不是速度、性能、吞吐量,而是確定性,也就是說:當一個事件發生的時候,可以確定性的保證在多長時間內得到處理,只要能滿足這個要求,就可以成為硬實時。比如:
操作系統1:當中斷發生時,可以保證在 1 秒內得到這里,那么它就是硬實時系統,雖然響應時間長,但它是確定的;
操作系統2:當中斷發生時,幾乎都可以在 1 毫秒內完成,那么那就不能成為硬實系統,雖然響應時間短,但是它不確定。
也看到有文章說:應該取消軟實時這個模棱兩可的說法,要么是實時,要么是非實時!
操作系統包含的功能很多:任務調度、內存管理、文件管理等等,其中最核心的就是任務調度,這也是非實時、軟實時、硬實時的區別。
也就是說,衡量實時性的指標就是:
1. 中斷延時:一個外部事件引發的中斷發生時,到相應的中斷處理程序條指令被執行時,所經過的時間;
2. 任務搶占延時:當一個高優先級的任務準備就緒時,從正在執行的低優先級任務中搶奪 CPU 資源所經過的時間;
不同的操作系統,其任務調度機制也是不一樣的,而這個調度機制的策略,又是與實際的使用場景相關的。因此,并不存在哪個好、哪個不好這樣的說法,合適的就是的!
比如:我們的桌面系統,需要考慮的是多任務、并發,需要同時執行多個程序,哪個程序慢一點,用戶無所謂,甚至覺察不到;但是對于一個控制系統,當一個外部傳感器輸入信號,觸發一個事件時,對應的處理必須立刻執行,否則耽擱 1 毫秒,結果可能就是差之千里!
四、x86 Linux 系統的調度策略
我們日常使用的 PC 機,它的主要目標是并行執行多任務,強調的是吞吐率(盡可能多的執行很多應用程序的代碼),因此,采用的是分時操作系統,也就是每個任務都有一個時間片,當一個任務分配的時間片用完了,就自動換出(調度),然后執行下一個任務。
我們平常在寫 x86 平臺上寫普通的客戶端程序時,很少需要應用程序的調度策略和優先級,使用的是系統默認的調度機制。反過來說,也就是在某些需要的場合下,是可以設置進程的調度策略和優先級的。
例如在 Linux 系統中,可以通過 sched_setscheduler() 系統函數 設置 3 種調度策略:
1. SCHED_OTHER: 系統默認的調度策略,計算動態優先級(counter+20-nice),當時間片用完之后放在就緒隊列尾;
2. SCHED_FIFO: 實時調度策略,根據優先級進行調度,一旦占用CPU就一直執行,直到自己放棄執行或者有更高優先級的任務需要執行;
3. SCHED_RR: 也是實時調度策略,在 SCHED_FIFO 的基礎上添加了時間片。在執行時,可以被更高優先級的任務打斷,如果沒有更高優先級的任務,那么當任務的執行時間片用完之后,就會查找相同優先級的任務來執行。
1. 為什么 Linux 系統是軟實時的?
可能有小伙伴會有疑問:既然 Linux 系統中提供了 SCHED_FIFO 基于優先級的調度策略,為什么仍然不能稱之為真正的硬實時操作系統?這就要從 Linux 的發展歷史說起了。
Linux 操作系統在設計之初,就是為了桌面應用而開發的,在那個時代,多個終端(電傳打字機和屏幕)連接到同一個電腦主機,需要處理的是多任務、并行操作,并不需要考慮實時性,因此,在 Linux 內核中的一些基因,嚴重影響了它的實時性,例如有如下幾個因素:
(1) 內核不可搶占
我們知道,一個應用程序在執行時,可以在用戶態和內核態執行(當調用一個系統函數,例如:write 時,就會進入內核態執行),此時任務是不可搶占的。
即使有優先級更高的任務準備就緒,當前的任務也不能立刻停止執行。而是必須等到當前這個任務返回到用戶態,或者在內核態中需要等待某個資源而睡眠時,高優先級任務才可以執行。
因此,這就很顯然無法保證高優先級任務的實時性了。
(2) 自旋鎖
自旋鎖是用于多線程同步的一種鎖,用來對共享資源的一種同步機制,線程反復檢查鎖變量是否可用。由于線程在這一過程中保持執行,因此是一種忙等待。一旦獲取了自旋鎖,線程會一直保持該鎖,直至顯式釋放自旋鎖。
自旋鎖避免了進程上下文的調度開銷,因此對于線程只會阻塞很短時間的場合是有效的,也就是說,只能在阻塞很短的時間才適合使用自旋鎖。
但是,在自旋鎖期間,任務搶占將會失效,這就是說,即使自旋鎖的阻塞時間很短,但是這仍然會增加任務搶占延時,讓調度變得不確定。
(3) 中斷的優先級是最高的
任何時刻,只要中斷發生,就會立刻執行中斷服務程序,也就是中斷的優先級是最高的。只有當所有的外部中斷和軟終端都處理結束了,正常的任務才能得到執行。
這看起來是好事情,但是想一想,如果有比中斷優先級更高的任務呢?假如系統在運行中,網口持續接收到數據,那么中斷就一直被執行,那么其他任務就可能一直得不到執行的機會,這是影響 Linux 系統實時性的巨大挑戰。
(4) 同步操作時關閉中斷
如果去看 Linux 內核的代碼,可以看到在很多地方都執行了關中斷指令,如果在這期間發生了中斷,那么中斷響應時間就沒法保證了。
A03B-0819-C152 S7-200
6ES7 211-0AA23-0XB0 CPU221 DC/DC/DC,6輸入/4輸出
6ES7 211-0BA23-0XB0 CPU221 繼電器輸出,6輸入/4輸出
6ES7 212-1AB23-0XB8 CPU222 DC/DC/DC,8輸入/6輸出
6ES7 212-1BB23-0XB8 CPU222 繼電器輸出,8輸入/6輸出
6ES7 214-1AD23-0XB8 CPU224 DC/DC/DC,14輸入/10輸出
6ES7 214-1BD23-0XB8 CPU224 繼電器輸出,14輸入/10輸出
6ES7 214-2AD23-0XB8 CPU224XP DC/DC/DC,14DI/10DO,2AI/1AO
6ES7 214-2BD23-0XB8 CPU224XP 繼電器輸出,14DI/10DO,2AI/1AO
6ES7 216-2AD23-0XB8 CPU226 DC/DC/DC,24輸入/16輸出
6ES7 216-2BD23-0XB8 CPU226 繼電器輸出,24輸入/16輸出
擴展模塊
6ES7 221-1BH22-0XA8 EM221 16入 24VDC,開關量
6ES7 221-1BF22-0XA8 EM221 8入 24VDC,開關量
6ES7 221-1EF22-0XA0 EM221 8入 120/230VAC,開關量
6ES7 222-1BF22-0XA8 EM222 8出 24VDC,開關量
6ES7 222-1EF22-0XA0 EM222 8出 120V/230VAC,0.5A 開關量
6ES7 222-1HF22-0XA8 EM222 8出 繼電器
6ES7 222-1BD22-0XA0 EM222 4出 24VDC 固態-MOSFET
6ES7 222-1HD22-0XA0 EM222 4出 繼電器 干觸點
6ES7 223-1BF22-0XA8 EM223 4入/4出 24VDC,開關量
6ES7 223-1HF22-0XA8 EM223 4入 24VDC/4出 繼電器
6ES7 223-1BH22-0XA8 EM223 8入/8出 24VDC,開關量
6ES7 223-1PH22-0XA8 EM223 8入 24VDC/8出 繼電器
6ES7 223-1BL22-0XA8 EM223 16入/16出 24VDC,開關量
6ES7 223-1PL22-0XA8 EM223 16入 24VDC/16出 繼電器
6ES7 223-1BM22-0XA8 EM223 32入/32出 24VDC,開關量
6ES7 223-1PM22-0XA8 EM223 32入 24VDC/32出 繼電器
6ES7 231-0HC22-0XA8 EM231 4入*12位精度,模擬量
6ES7 231-7PB22-0XA8 EM231 2入*熱電阻,模擬量
6ES7 231-7PD22-0XA8 EM231 4入*熱電偶,模擬量
6ES7 232-0HB22-0XA8 EM232 2出*12位精度,模擬量
6ES7 235-0KD22-0XA8 EM235 4入/1出*12位精度,模擬量
6ES7 277-0AA22-0XA0 EM277 PROFIBUS-DP接口模塊
6GK7 243-2AX01-0XA0 CP243-2 AS-i接口模塊
6ES7 253-1AA22-0XA0 EM253 位控模塊
6ES7 241-1AA22-0XA0 EM241 調制解調器模塊
6GK7 243-1EX00-0XE0 CP243-1 工業以太網模塊
6GK7 243-1GX00-0XE0 CP243-1IT 工業以太網模塊
附件
6ES7 291-8GF23-0XA0 MC291,新CPU22x存儲器盒,64K
6ES7 297-1AA23-0XA0 CC292,CPU22x時鐘/日期電池盒
6ES7 291-8BA20-0XA0 BC293,CPU22x電池盒
6ES7 290-6AA20-0XA0 擴展電纜,I/O擴展,0.8米,CPU22x/EM
序號
名稱
描述
訂貨號
1
CPU222 CN
CPU222 DC / DC / DC8 輸入/ 6 輸出
6ES72121AB230XB8
2
CPU222 CN
CPU222 AC / DC/Relay8 輸入/ 6 繼電器
6ES72121BB230XB8
3
CPU224 CN
CPU224 DC / DC / DC14 輸入/10 輸出
6ES72141AD230XB8
4
CPU224 CN
CPU224 AC / DC/Relay14 輸入/ 10 繼電器
6ES72141BD230XB8
5
CPU224XP CN
CPU224 XP DC / DC / DC14 輸入/ 10 輸出
6ES72142AD230XB8
6
CPU224XP CN
CPU224 XP AC / DC / 繼電器14 輸入/ 10 繼電器輸出
6ES72142BD230XB8
7
CPU226XP CN
CPU226 DC / DC / DC24 輸入/ 16 輸出
6ES72162AD230XB8
8
CPU226XP CN
CPU226 AC / DC / 繼電器24 輸入/ 16 繼電器
6ES72162BD230XB8
9
CPU221
CPU 221 DC / DC/DC 6 輸入/ 4 輸出
6ES72110AA230XB0
10
CPU221
CPU 221 AC / DC / 繼電器6 輸入/ 4 輸
6ES72110BA230XB0
11
CPU222
CPU222 DC / DC / DC8 輸入/ 6 輸出
6ES72121AB230XB0
12
CPU222
CPU222 AC / DC/Relay8 輸入/ 6 繼電器
6ES72121BB230XB0
13
CPU224
CPU224 DC / DC / DC14 輸入/10 輸出
6ES72141AD230XB0
14
CPU224
CPU224 AC / DC/Relay14 輸入/ 10 繼電器
6ES72141BD230XB0
15
CPU224XP
CPU224 XP DC / DC / DC14 輸入/ 10 輸出
6ES72142AD230XB0
16
CPU224XP
CPU224 XP AC / DC / 繼電器14 輸入/ 10 繼電器輸出
6ES72142BD230XB0
17
CPU226XP
CPU226 DC / DC / DC24 輸入/ 16 輸出
6ES72162AD230XB0
18
CPU226XP
CPU226 AC / DC / 繼電器24 輸入/ 16 繼電器
6ES72162BD230XB0
S7-200擴展模塊:
6ES7221-1BF22-0XA8 EM 221 數字量輸入模塊,8 輸入24V DC
6ES7221-1BH22-0XA8 EM 221 數字量輸入模塊,16 輸入24 VDC
6ES7222-1BF22-0XA8 EM 222 數字量輸出模塊,8 輸出24 VDC
6ES7222-1HF22-0XA8 EM 222 數字量輸出模塊,8 輸出繼電器
6ES7223-1BF22-0XA0 EM 223 數字量輸入/ 輸出模塊,4 輸入/4 輸出24V DC
6ES7223-1HF22-0XA8 EM 223 數字量輸入/ 輸出模塊,4 輸入24 VDC/4 繼電器輸出 6ES7223-1BH22-0XA8 EM 223 數字量輸入/ 輸出模塊,8 輸入/8 輸出24 VDC
6ES7223-1PH22-0XA8 EM 223 數字量輸入/ 輸出模塊,8 輸入24 VDC/8 繼電器輸出 6ES7223-1BL22-0XA8 EM 223 數字量輸入/ 輸出模塊,16 輸入/16 輸出24 VDC
6ES7223-1PL22-0XA8 EM 223 數字量輸入/ 輸出模塊,16 輸入24 VDC/16 繼電器輸出
6ES7231-0HC22-0XA8 EM 231 模擬量輸入模塊,4 輸入
6ES7231-7PB22-0XA8 EM 231 2 路輸入熱電阻
6ES7231-7PD22-0XA8 EM 231 4 路輸入熱電偶
6ES7232-0HB22-0XA8 EM 232 模擬量輸出模塊,2 輸出
6ES7235-0KD22-0XA8 EM 235 模擬量輸入/ 輸出模塊4 輸入/1 輸出
6ES7241-1AA22-0XA0 EM 241 調制解調器模塊
6ES7253-1AA22-0XA0 EM 253 定位模塊
6ES7277-0AA22-0XA0 EM 277 PROFIBUS-DP 模塊
6GK7243-1EX00-0XE0 CP 243-1 以太網模塊
6GK7243-1GX00-0XE0 CP 243-1 IT 版以太網模塊
6GK7243-2AX01-0XA0 CP 243-2 AS-i 接口模塊
6ES7291-8GE20-0XA0 MC 291,32K x 8 EEPROM 存儲器盒
6ES7291-8GF23-0XA0 存儲卡,64 Kbytes
6ES7291-8GH23-0XA0 存儲卡,256 Kbytes
6ES7297-1AA20-0XA0 CC 292,CPU 22x 時鐘/ 日期電池盒
6ES7297-1AA23-0XA0 新CPU 221 和222 時鐘卡(包括電池卡功能)
6ES7291-8BA20-0XA0 BC 293,CPU 22x 電池盒
6ES7290-6AA20-0XA0 擴展電纜,I/O 擴展,0.8 米,CPU 22x/EM
6ES7901-3CB30-0XA0 編程通訊電纜,PC/PPI,RS232/485 轉換,帶光電隔離,