Nucleus Task切换及中断之上下文保存
来源:互联网 发布:淘宝帐号管理在那里 编辑:程序博客网 时间:2024/05/20 01:36
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时保存的上下文为
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
- Nucleus Task切换及中断之上下文保存
- java 并发编程之上下文切换
- ucos-iii学习之上下文切换
- linux进程管理之上下文切换(context switching)
- Nucleus中断处理过程!!!!
- Nucleus中断处理过程!!!!
- nucleus 学习 中断
- Android之上下文菜单
- Nucleus源代码分析 - Task(1)
- Nucleus源代码分析 - Task(2)
- .NET组件程序设计之上下文
- 第十五章之上下文菜单
- hibernate之上下文初始化失败
- Nucleus
- 文法系列之上下文无关语法简介
- flask源码剖析之上下文全局变量
- android基础学习之上下文菜单
- Android之上下文菜单(ContextMenu)
- Android 的系统属性(SystemProperties)设置分析
- Hibernate 更新部分更改的字段 hibernate update
- 第一次写文章
- 个人写的单键模式模版的例子
- zoj3131 Digital Clock(2)
- Nucleus Task切换及中断之上下文保存
- 独立博客如何申请谷歌Adsense
- 敏捷测试
- php过滤提交信息防注入
- 栈和堆的区别
- 让你的C程序更有效率的10种方法
- Usaco 1.4.2 时钟(The Clocks)
- jvav中奖取数字游戏
- crontab编译器修改