1993 - VxWorks 與 POSIX 即時標準(火星車的心臟)#
案件摘要#
1993 年,IEEE 發布 POSIX 1003.1b(即時擴充):優先級搶佔排班、優先級繼承信號量、即時信號成為標準。 同年 Wind River 的 VxWorks 5.x 全面實現這些標準—— API 碎片化的 RTOS 戰國被標準統一;VxWorks 更成為 Sojourner 火星探測車(1997) 的心臟。
前因 -- 為什麼會有這個案子#
- RTOS 的 API 戰國:VRTX、pSOS、iRMX 各家一套 API——換硬體就重寫——彌補的缺陷:碎片化。
- 優先級反轉的理論武器:1990 年 Lui Sha / Rajkumar / Lehoczky 的優先級繼承協定理論成熟——即時排班從經驗變成科學。
- Mars Pathfinder 的硬體契機:JPL 需要一個能跑在 RAD750 前身晶片上、可驗證決定性的 OS——VxWorks 補上這塊。
線索與推理 -- 技術面貌(1993)#
| 技術 | 狀態 | 彌補的缺陷 |
|---|---|---|
| POSIX.1b 即時排班 | SCHED_FIFO / SCHED_RR | 各家 RTOS API 不同 |
| 優先級繼承信號量 | PTHREAD_PRIO_INHERIT | 優先級反轉(火車事件的前科) |
| 即時信號 | SIGRTMIN 可排隊 | 傳統信號不排隊、會丟失 |
| 微秒級延遲 | 中斷延遲可測可驗證 | Linux 排班不確定性 |
| 交叉開發 | Tornado IDE(1995)+ 目標機 agent | printf 除錯時代結束 |
C 範例:優先級繼承——火星車事件的重演與修正#
/* POSIX.1b:優先級繼承信號量(1997 火星車當機的修正) */
#include <pthread.h>
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
/* 沒有這行的話:低優先級任務拿著鎖,
高優先級任務等鎖,中間優先級任務搶跑
=> 高優先級被無限期延遲 => 看門狗重置(火星車事件) */
pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
pthread_mutex_init(&bus_mutex, &attr);
Shell 範例:VxWorks 的即時性驗證#
# 在目標機 shell 上量中斷延遲——決定性是可驗證的
-> priorityTest() # 排班測試
-> intLatencyShow()
max latency: 12 us # 最壞情況可計算——即時的本質
-> taskIdList() # 任務即行程
結案 -- 後果與影響#
- 1997 年 Mars Pathfinder 的優先級反轉當機( watchdog 重置數十次)由 JPL 遠端改用優先級繼承修復——教科書案例流傳至今。
- Linux 後來補上
PREEMPT_RT補丁(2005 起)搶攻軟即時市場——POSIX.1b 讓兩陣營同台。 - 工業、航太、電信設備的標準 OS;Wind River 成為嵌入式軟體龍頭。
- 歷史教訓:標準介面(POSIX.1b)+ 理論(優先級繼承)= 即時系統從工藝變科學。
關鍵人物與文獻#
- L. Sha / R. Rajkumar / J. Lehoczky:Priority Inheritance Protocols (1990)。
- Wind River / J. Fiddler:VxWorks;JPL Mars Pathfinder (1997)。
- 相關案件:
1976-VRTX與即時核心誕生.md、../UNIX/1989-POSIX標準與BSD授權.md、1998-uClinux與RTLinux.md。