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

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