MTK上用的实时操作系统是Nucleus操作系统。
1.操作系统自身调度
在Task切换(即操作系统调度,如当前msg queue为空,kal_retrieve_eg_events未获取到符合条件的事件,又或obtain semaphore失败等等)时,
操作系统会保存必要的上下文, 以供下次重新调度到该任务时,能继续执行,即实现了操作系统的基本功能, 多任务调度。
如接收消息形势如下:
void
mmi_task_main( task_entry_struct *task_entry_ptr)
{
......
while (1) {
......
receive_msg_ext_q();
......
}
......
}
若当前Task queue中没有msg, 则该task就会挂起, 保存上下文, 并切换到操作系统调度。
可参考如下call stack:
TCT_Control_To_System()
TCC_Suspend_Task()
QUC_Receive_From_Queue()
QUCE_Receive_From_Queue()
kal_deque_msg()
receive_msg_ext_q()
mmi_task_main()
参看TCT_Control_To_System汇编
TCT_Control_To_System:
;禁止fiq和irq
mrs r0,cpsr
orr r0,r0,#0xC0
msr cpsr_cxsf,r0
;保存最少的必要的上下文
stmdb r13!,{r4-r12,r14}
;保存r14的状态,最后一位为0还是1
mov r2,r14
mov r2,r2,lsl #0x1F
mov r2,r2,lsr #0x1A
str r2,[r13,#-0x4]!
;操作系统调度的上下文切换,栈顶最后flag置为0
mov r2,#0x0
str r2,[r13,#-0x4]!
........
;之后会保存该r13, 并且切换到系统堆栈进行os调度(即_TCT_Schedule)
即os调度模式下切换task时保存的上下文为
Status = 0
|
r14.last bit <<5
|
R4
|
R5
|
R6
|
R7
|
R8
|
R9
|
R10
|
R11
|
R12
|
R15 (PC)
|
ORR r0,r0,r2 ; Set appropriate state
Undef_Instr_Addr DCD Undef_Instr_ISR
SWI_Addr DCD SWI_ISR
Prefetch_Abort_Addr DCD Prefetch_Abort_ISR
Data_Abort_Addr DCD Data_Abort_ISR
Undefined_Addr DCD 0 ; NO LONGER USED
IRQ_Handler_Addr DCD INT_IRQ_Parse
FIQ_Handler_Addr DCD INT_FIQ_Parse
BL isrC_Main
B TCT_Interrupt_Context_Restore