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