- 论坛徽章:
- 0
|
/*
程序切换,就是将当前的程序状态保存到当前程序的
堆栈中,这里讲的程序状态指的是当前的寄存器,包
括通用寄存器和特殊寄存器等,然后把下一个要执行
的程序从相应的堆栈中取出来,将相应的状态恢复到
寄存器中,然后cpu开始运行该程序。这样就可以举一
反三,使cpu管理多任务了;
--62行之前都是对程序变量的声明部分,没什么可讲的
当进行任务调度的时候,cpu跳到63行执行---->(let's go)
*/
;//=================================================
;// :Cn.oS[Operating System from China]
;//file : Cn_oS_switch.s
;//function: Just to see this function,it looks like timer.s ,but it don't
;// use the timer5 to switch the processes .
;//
;//
;//
;//
;//
;//author : kaka(sn.kaka@yahoo.com)
;//date : 20080718
;//=================================================
AREA Cn_oS_sw, CODE, READONLY
CODE32
IMPORT kaka ; //show that this variable has been defined
;//in other files
IMPORT Current_Task_P
IMPORT Current_PCB_P
IMPORT Current_PCB_P_NEXT
IMPORT Current_Task_ID
IMPORT Task_Max
IMPORT K_State
IMPORT Save_Info
IMPORT Cn_oS_Start
IMPORT Save_Info
IMPORT Recover_Info
IMPORT Switch_Task
IMPORT Task_Create
IMPORT t
IMPORT TEST
EXPORT TASK_SWITCH
EXPORT ATTEMPER_first ;//this variable can be called in other file
NoInt EQU 0x80
INTT EQU 0x01e00024
; //no interrupt(for CPSR)
SYS32Mode EQU 0x1f ; //SYS32Mode
IRQ32Mode EQU 0x12 ; //IRQ32Mode
SVC32Mode EQU 0x13
TASK_SWITCH
STMFD SP!,{R0-R3,R12,R14};//将寄存器0-3,r12,r14压入堆栈
;//因为后面马上会用到这几个寄存器
;//所以先保存,避免数据丢失
MRS R12,CPSR ;//将cpsr的值放入r12
LDR R0,=Current_PCB_P ;//得到当前程序控制块的标号
LDR R0,[R0] ;//得到当前程序控制块的地址
;//其实你Current_PCB_P
;//就是一个指针,
STR R12,[R0],#8 ;//之所以会有8个便宜是Current_PCB
;//的结构决定
LDR R3,=kaka ;//简单的实现kaka++
LDR R2,[R3,#0]
ADD R2,R2,#1
STR R2,[R3,#0]
LDMFD SP!,{R2,R3}
STMIA R0!,{R2,R3} ;//这里其实是把r0,r1的值放到pcb中
LDMFD SP!,{R2,R3,R12,R14} ;//把r2,r3,r12,r14的值从堆栈中推出
;//这里值得推敲一下,为什么我们
;//进入汇编之后没有看到对sp寄存器
STR R14,[R0,#-12] ;//操作,好了,你可以数一下,
;//我们一共压入6次sp,然后又陆续
;//推出6次,所以sp的值回复到了
;//刚进汇编时候的值
STMIA R0,{R2-R14}^ ;//把r2~r14的值放到pcb中
BL Switch_Task ;//这个函数的主要作用就是
;//得到下一个要执行的程序
;//的程序号
ATTEMPER_first
LDR R1,=Current_PCB_P_NEXT ;//下面做的就是把状态从内存
LDR R1,[R1] ;//中(也就是pcb中)恢复到cpu寄存器
;//中,其实和上面是正好反过来的
LDMIA R1!,{R12,R14} ;/
MSR CPSR_cxsf,R12 ;//
;
LDMIA R1,{R0-R14}^ ;//
NOP ;//
;//
MOV PC,R14 ;//
;//将r14的内容放到pc指针中
;//cpu跳到指定地址去执行,
;//周而复始。。。。哈哈
;//下一回,我们分解
;//函数Switch_Task,和
;//ProcessesControlBlock(PCB)的数据结构
;//
;//
END |
|