OSEK Os的任務調度

一、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章