一、PendSv的作用
PendSv中斷通常在高優先級中斷中設置,但是會在高優先級處理完成後執行。通常情況下,是在SysTick中產生節拍,當有任務進入就緒態後,觸發PendSv中斷。來實現上下文切換。
二、如何掛起PendSv異常
通過寫ICSR寄存器的PENDSVSET 位,來掛起PendSv異常。實現代碼如下:
.align 2
.global osEE_cortex_m_trigger_pend_sv
.type osEE_cortex_m_trigger_pend_sv, %function
osEE_cortex_m_trigger_pend_sv:
/*
* Trigger the PendSV exception (causes context switch)
*/
LDR R0, =NVIC_INT_CTRL
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
BX LR
.size osEE_cortex_m_trigger_pend_sv, . - osEE_cortex_m_trigger_pend_sv
三、OSEK的任務類型
OSEK 將內核定義爲四種類型。分別是BCC1 BCC2 ECC1 ECC2。
BCC1: 只存在BASIC TASK,並且每個任務只有一個激活請求,和一個優先級。並且所有任務具有不同的優先級
BCC2: 與BCC1類似,但是每個任務允許有多個優先級和激活
ECC1: 與BCC1類似,但是包含了extended TASK
ECC2 : 與ECC1類似,但是每個任務允許多個優先級和激活
1、BASIC任務
BASIC TASK將任務劃分爲三個狀態。running ready suspend
running: 在running狀態,CPU的使用權屬於這個任務。在同一時間,CPU只能執行同一個任務。
ready: 任務在Runnnig狀態被搶佔,就會進入Reay狀態。
Suspended: 通過接口進入Suspended狀態,該任務就不會被重新調度。直到調用接口重新激活
用戶可以通過接口TerminateTask 將任務掛起,進入Suspended狀態。然後可以通過ActivateTask接口,重新進入Ready態。
2、EXTENDED任務
EXTENDED TASK多一個waiting狀態。waitting狀態是爲了等待某個Event的置位。因此Extend任務至少需要依賴一個event。
四、事件機制
event機制是一種同步機制,只作用與extended TASK。主要負責將任務由waitting狀態切換到ready狀態。event是由OS去管理,每個extended TASK都擁有至少一個event。event之間通過Name或者mask來區分。通過WaitEvent 和GetEvent這兩個接口來獲取event的狀態。
激活了TASK之後,OS會將event清除。
可以通過Alarm 關聯一個event,然後在通過TASK關聯event來實現任務的定時觸發或者是事件觸發。一個event可以關聯多個Alarm,他們通過event 的mask來區分,EventMask是一個U32的數,每個BIT都可以代表不同的Alarm.
五、Alarm機制
TODO