CP AUTOSAR OS 是用于車載 ECU的實時操作系統, 在協議棧中屬于 System Services 中的一個模塊。
CP AUTOSAR OS 是基于 OSEK/VDX 的 Operating System, ?其基礎原理可以參考 OSEK OS 相關文檔。OSEK OS 是基于事件觸發的操作系統,可以靈活的對任務進行調度。需要注意的是,CP AUTOSAR OS 不支持動態創建任務,所有 OS 行為需要在編譯時進行定義。CP AUTOSAR OS 支持多核。下圖所示為,CP AUTOSAR 概覽圖。CP AUTOSAR OS 根據是否支持時間保護和內存保護分為四個 ClassMemoryProtection 是指用于防止不同的 OS Application 異常訪問其他不允許的程序段或數據段。Timing Protection 用于監控任務或者中斷是否超時 (超過規定的時間 deadline)
OS Application 是程序應用的單元,每個 OS Application 包含如下內容:
- Countersand Alarms (時基和警報器)
OS Application 各項關系圖如下圖所示:
Counters(時基)是 OSEK OS 中一個組件,在軟件中可理解為 Ticks。
Alarm(警報器)是由 Counter 驅動的,多個 Alarm 可以連接到同一個 Counter。Counter 每次累加都會觸發相關聯 Alarm 的檢查,如果滿足觸發條件,Alarm 會被觸發。Alarm 向上關聯到 1 個任務,激活的 Alarm 可以觸發一次任務執行(BCC task)或者觸發一次事件(Set Event)? –Relative(相對時間Alarm):對比當前時基又過了 Tick 數量后觸發。? –Absolute(絕對時間Alarm):當 Counter 到達固定數值后觸發,或者周期固定間隔觸發。
上述代碼啟動了一個 1 秒的周期類型的 RelativeAlarm此 Alarm 與 Core0_App_100msTask 連接用于周期性的激活任務。CounterType: 采用硬件時鐘并關聯到硬件 TimerCounter Tick Per Base: 每 100 個硬件 TimerCounter 觸發 OS Counter 累加Seconds Per Tick: 1us, 為了增加 OS 調度速度,精度不宜過小。
基礎任務英文縮寫為:BCCtask,主要包括以下特性:

Task Activation 是指同時只允許一次任務激活Priority 指任務優先級, 高優先級任務可以搶占低優先級任務(如果低優先級任務配置成支持搶占類型)Stack Size 設置為1K (根據當前任務所需要 Stack 進行設置,如果 Stack 產生Overflow,OS 會在任務切換時報錯掛死)Type 類型為 Basic Task(基礎任務)Event 主要用于擴展類型任務的觸發執行(從Waiting狀態到Run狀態)
擴展任務經常是運行在 while 循環中的,一般不會結束,但視應用場景也可以結束。?擴展任務可以進入 Waiting 狀態,待事件觸發后,繼續執行
Task Activation?指同時只允許一次任務激活Priority 指任務優先級, 高優先級任務可以搶占低優先級任務(如果低優先級任務配置成支持搶占類型)Stack Size: 1K (根據當前任務所需要 Stack 進行設置,如果 Stack 產生Overflow,OS 會再任務切換時報錯掛死)
- 任務激活方式,同時激活的任務按優先級排隊執行,擴展類型任務可以由軟件控制執行-?任務切換時任務現場會保存再對應任務的 Task Stack 中,右側下圖 Task T2 黃色部分為任務切換程序執行。搶占過多會造成任務切換過多導致 CPURuntime 的損失。
任務同步管理用于管理多個任務共享的資源(數據和外設等),防止task1再讀取共享數據的時候被 Task2 改寫。常規方法包含 (ExclusiveArea Handling):
中斷服務程序再 OSEK OS 中具有高于任務的優先級Category1, 不要 OS 接管,不受 OS 中斷優先級等管理Category2,中端觸發后,OS 接管,受 OS 控制

如上述代碼所示,中斷向量表不直接指定中斷服務程序,而是指向 Os_Hal_IsrRun程序由 OS 接管中斷服務程序。?
AUTOSAR 協議棧中的 OS 啟動如下圖所示:
1、執行 Os_InitMemory 初始化 OS 參數(OS 使用到的變量等)2、執行 Call Os_Init() 初始化OS. (變量,OS 中斷控制器,MPU 等)3、執行 EcuM_Init() 初始化部分硬件模塊(Port,Dio,Adc…)4、執行 EcuM_StartOS() 啟動 OS5、再 OS 開始執行后 Task_Init 會首先被調用.?? 執行 EcuM_StartupTwo() ,此函數會調用?BswM_Init() 來初始化其他硬件模塊(CAN/LIN/NVM…).6、再 BswM_Init 函數最后執行 Rte_Start() 用于啟動所有任務。

1、使能兩個核并關聯到到不同的 EcucParatition2、建立兩個 OSApplication 并分配到不同的 EcucParatition3、每個 OSApplication 可關聯不同的 Task/ISR 等,這樣關聯的任務就會在相應核執行核間通信(已 Core0 到 Core1 通信為例)流程:1、Core0 發送方通過RTE將數據寫入 IOC 并觸發 Core1 任務2、Core1 執行完任務將結果通過 RTE 反饋到 IOC 并觸發 Core0 任務