📄 minitos.s
字号:
1000b64: ebffff95 bl 10009c0 <lock_int> ptrCurrProc->status|=0x8000; //0x8000位表示进程已经运行结束了
1000b68: e5942000 ldr r2, [r4] 1000b6c: e5923054 ldr r3, [r2, #84] unready(ptrCurrProc); //把本进程unready
1000b70: e1a00002 mov r0, r2 1000b74: e3833902 orr r3, r3, #32768 ; 0x8000 1000b78: e5823054 str r3, [r2, #84] 1000b7c: ebfffed6 bl 10006dc <unready> sched(); //调度最高优先级任务运行
1000b80: ebfffea8 bl 1000628 <sched> unlock_int();
1000b84: ebffff91 bl 10009d0 <unlock_int> }
1000b88: eafffff5 b 1000b64 <ProcShell+0x24> 1000b8c: 010088f4 streqsh r8, [r0, -r4] 1000b90: e91ba810 ldmdb r11, {r4, r11, sp, pc}01000b94 <InitProcIPtoNULL>: 1000b94: e1a0c00d mov r12, sp 1000b98: e92dd800 stmdb sp!, {r11, r12, lr, pc} 1000b9c: e24cb004 sub r11, r12, #4 ; 0x4}
/*************************************************
**Function:开机启动把Proc[i].IP初始化
**input:
*************************************************/
void InitProcIPtoNULL(void)
{
int i;
for(i=0;i<N_PROC;i++)
1000ba0: e3a01000 mov r1, #0 ; 0x0 1000ba4: e3a0201d mov r2, #29 ; 0x1d 1000ba8: e59f300c ldr r3, [pc, #c] ; 1000bbc <InitProcIPtoNULL+0x28> 1000bac: e403108c str r1, [r3], -#140 1000bb0: e2522001 subs r2, r2, #1 ; 0x1 1000bb4: 5afffffc bpl 1000bac <InitProcIPtoNULL+0x18> {
Proc[i].IP=NULL;
}
}
1000bb8: e91ba800 ldmdb r11, {r11, sp, pc} 1000bbc: 01008878 tsteq r0, r8, ror r801000bc0 <CreateProcess>: 1000bc0: e1a0c00d mov r12, sp 1000bc4: e92dd8f0 stmdb sp!, {r4, r5, r6, r7, r11, r12, lr, pc} 1000bc8: e24cb004 sub r11, r12, #4 ; 0x4
/*************************************************************************
**Function:建立进程
**Input: proc--
argc--
argv--不能用局部变量,防止退出时已经释放空间
**return :Not NULL -- pointer for create process.
NULL-- Error
***************************************************************************/
PROC * CreateProcess(void (*proc)(int,void*),int argc,void *argv,char *StkBottom,
int prio,int RunTicks,char RunNow)
{
int i;
for(i=0;i<N_PROC;i++)
1000bcc: e3a04000 mov r4, #0 ; 0x0 1000bd0: e1a05001 mov r5, r1 {
if(Proc[i].IP==NULL)
1000bd4: e59fe168 ldr lr, [pc, #168] ; 1000d44 <CreateProcess+0x184> 1000bd8: e1a06002 mov r6, r2 1000bdc: e59ec010 ldr r12, [lr, #16] 1000be0: e1a01003 mov r1, r3 1000be4: e59b7008 ldr r7, [r11, #8] 1000be8: e15c0004 cmp r12, r4 1000bec: e1a0c000 mov r12, r0 1000bf0: 0a000006 beq 1000c10 <CreateProcess+0x50> break;
1000bf4: e28e2010 add r2, lr, #16 ; 0x10 1000bf8: e2844001 add r4, r4, #1 ; 0x1 1000bfc: e354001d cmp r4, #29 ; 0x1d 1000c00: ca000002 bgt 1000c10 <CreateProcess+0x50> 1000c04: e5b2308c ldr r3, [r2, #140]! 1000c08: e3530000 cmp r3, #0 ; 0x0 1000c0c: 1afffff9 bne 1000bf8 <CreateProcess+0x38> }
if(i==N_PROC)
1000c10: e354001e cmp r4, #30 ; 0x1e 1000c14: 0a000048 beq 1000d3c <CreateProcess+0x17c> return NULL; //Proc slot is full.
Proc[i].SP=StkBottom; //stack bottom,little endian,bug????
1000c18: e0843104 add r3, r4, r4, lsl #2 1000c1c: e0633183 rsb r3, r3, r3, lsl #3 1000c20: e1a03103 mov r3, r3, lsl #2 1000c24: e28e2008 add r2, lr, #8 ; 0x8
Proc[i].IP=ProcEntry; //task
Proc[i].CPSR=SVCMODE; //CPSR value bug??????? SVCMODE
1000c28: e28e0004 add r0, lr, #4 ; 0x4 1000c2c: e7821003 str r1, [r2, r3] 1000c30: e3a01013 mov r1, #19 ; 0x13 1000c34: e7801003 str r1, [r0, r3] Proc[i].SPSR=SVCMODE;
Proc[i].r0=(int)proc; //进程作为ProcShell第一个参数
1000c38: e28e2014 add r2, lr, #20 ; 0x14 1000c3c: e78e1003 str r1, [lr, r3] Proc[i].r1=argc; //作为ProcShell第2个参数
1000c40: e28e1018 add r1, lr, #24 ; 0x18 1000c44: e782c003 str r12, [r2, r3] Proc[i].r2=(int)argv; //作为ProcShell第3个参数
1000c48: e28e201c add r2, lr, #28 ; 0x1c 1000c4c: e7815003 str r5, [r1, r3] Proc[i].r3=0x33;
1000c50: e28e1020 add r1, lr, #32 ; 0x20 1000c54: e7826003 str r6, [r2, r3] 1000c58: e3a02033 mov r2, #51 ; 0x33 Proc[i].r4=0x34;
1000c5c: e28e0024 add r0, lr, #36 ; 0x24 1000c60: e7812003 str r2, [r1, r3] 1000c64: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r5=0x35;
1000c68: e28e1028 add r1, lr, #40 ; 0x28 1000c6c: e7802003 str r2, [r0, r3] 1000c70: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r6=0x36;
1000c74: e28e002c add r0, lr, #44 ; 0x2c 1000c78: e7812003 str r2, [r1, r3] 1000c7c: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r7=0x37;
1000c80: e28e1030 add r1, lr, #48 ; 0x30 1000c84: e7802003 str r2, [r0, r3] 1000c88: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r8=0x38;
1000c8c: e28e0034 add r0, lr, #52 ; 0x34 1000c90: e7812003 str r2, [r1, r3] 1000c94: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r9=0x39;
1000c98: e08e1002 add r1, lr, r2 1000c9c: e7802003 str r2, [r0, r3] 1000ca0: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r10=0x3a;
1000ca4: e28e003c add r0, lr, #60 ; 0x3c 1000ca8: e7812003 str r2, [r1, r3] 1000cac: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r11=0x3b;
1000cb0: e28e1040 add r1, lr, #64 ; 0x40 1000cb4: e7802003 str r2, [r0, r3] 1000cb8: e2822001 add r2, r2, #1 ; 0x1 Proc[i].r12=0x3c;
1000cbc: e28e0044 add r0, lr, #68 ; 0x44 1000cc0: e7812003 str r2, [r1, r3] 1000cc4: e2822001 add r2, r2, #1 ; 0x1 Proc[i].lr=0x3e;
1000cc8: e28e100c add r1, lr, #12 ; 0xc 1000ccc: e7802003 str r2, [r0, r3] 1000cd0: e2822002 add r2, r2, #2 ; 0x2 1000cd4: e7812003 str r2, [r1, r3] Proc[i].priority=prio;
1000cd8: e28e0048 add r0, lr, #72 ; 0x48 1000cdc: e59b2004 ldr r2, [r11, #4] Proc[i].RunTicksInit=RunTicks;
1000ce0: e28e1068 add r1, lr, #104 ; 0x68 1000ce4: e7802003 str r2, [r0, r3] Proc[i].RunTicksCount=Proc[i].RunTicksInit;
1000ce8: e28e2064 add r2, lr, #100 ; 0x64 1000cec: e7817003 str r7, [r1, r3]
//signal初始化
Proc[i].SignalInRun=FALSE;
1000cf0: e28e1070 add r1, lr, #112 ; 0x70 1000cf4: e7827003 str r7, [r2, r3] 1000cf8: e3a00000 mov r0, #0 ; 0x0 1000cfc: e7810003 str r0, [r1, r3] Proc[i].EnableSignal=0;
1000d00: e28e2074 add r2, lr, #116 ; 0x74 1000d04: e7820003 str r0, [r2, r3] Proc[i].SignalHandler=NULL;
1000d08: e28e1078 add r1, lr, #120 ; 0x78 1000d0c: e7810003 str r0, [r1, r3] Proc[i].signal=0;
1000d10: e28e207c add r2, lr, #124 ; 0x7c 1000d14: e7820003 str r0, [r2, r3]
//
//if(RunNow==MO_RUN)
{
//lock_int();
ready(&Proc[i]); //
1000d18: e083400e add r4, r3, lr 1000d1c: e59f1024 ldr r1, [pc, #24] ; 1000d48 <CreateProcess+0x188> 1000d20: e1a00004 mov r0, r4 1000d24: e591c000 ldr r12, [r1] 1000d28: e28e2010 add r2, lr, #16 ; 0x10 1000d2c: e782c003 str r12, [r2, r3] 1000d30: ebfffe43 bl 1000644 <ready> //unlock_int();
}
return (&Proc[i]);
1000d34: e1a00004 mov r0, r4 1000d38: e91ba8f0 ldmdb r11, {r4, r5, r6, r7, r11, sp, pc} 1000d3c: e3a00000 mov r0, #0 ; 0x0}
1000d40: e91ba8f0 ldmdb r11, {r4, r5, r6, r7, r11, sp, pc} 1000d44: 0100788c tsteq r0, r12, lsl #17 1000d48: 01000544 tsteq r0, r4, asr #1001000d4c <ChangeTimeSlice>: 1000d4c: e1a0c00d mov r12, sp 1000d50: e92dd800 stmdb sp!, {r11, r12, lr, pc} 1000d54: e24cb004 sub r11, r12, #4 ; 0x4
/*
修改时间片值,返回原来的时间片值
*/
int ChangeTimeSlice(PROC * proc,int TimeSlice)
{
int ret;
ret=proc->RunTicksInit;
if(TimeSlice<=0)TimeSlice=1;
1000d58: e3510000 cmp r1, #0 ; 0x0 1000d5c: e5903068 ldr r3, [r0, #104] 1000d60: d3a01001 movle r1, #1 ; 0x1 proc->RunTicksInit=TimeSlice;
1000d64: e5801068 str r1, [r0, #104] return ret;
1000d68: e1a00003 mov r0, r3}
1000d6c: e91ba800 ldmdb r11, {r11, sp, pc}01000d70 <SuspendProcess>: 1000d70: e1a0c00d mov r12, sp 1000d74: e92dd830 stmdb sp!, {r4, r5, r11, r12, lr, pc}
int SuspendProcess(PROC *proc)
{
1000d78: e1a04000 mov r4, r0 //判断进程是否已经挂起或退出
if(proc->status!=0)
1000d7c: e5945054 ldr r5, [r4, #84] 1000d80: e24cb004 sub r11, r12, #4 ; 0x4 1000d84: e3550000 cmp r5, #0 ; 0x0 1000d88: 1a000008 bne 1000db0 <SuspendProcess+0x40> { //status!=0表示已经挂起
return 0;
}
lock_int();
1000d8c: ebffff0b bl 10009c0 <lock_int> unready(proc); //挂起进程
1000d90: e1a00004 mov r0, r4 1000d94: ebfffe50 bl 10006dc <unready> proc->status|=0x40; //置挂起标志,目前该标志位只有1位
1000d98: e5943054 ldr r3, [r4, #84] 1000d9c: e3833040 orr r3, r3, #64 ; 0x40 1000da0: e5843054 str r3, [r4, #84] sched(); //需要调度,防止挂起的是本进程,如果挂起的是本进程需要让出cpu
1000da4: ebfffe1f bl 1000628 <sched> //status标志必须在ResumeProcess中清除,因为一进入ready就必须清除该标志
return 0;
1000da8: e1a00005 mov r0, r5 1000dac: e91ba830 ldmdb r11, {r4, r5, r11, sp, pc} 1000db0: e3a00000 mov r0, #0 ; 0x0 1000db4: e91ba830 ldmdb r11, {r4, r5, r11, sp, pc}01000db8 <ResumeProcess>: 1000db8: e1a0c00d mov r12, sp 1000dbc: e92dd810 stmdb sp!, {r4, r11, r12, lr, pc}}
int ResumeProcess(PROC *proc)
{
1000dc0: e1a04000 mov r4, r0 //判断进程是否已经挂起
if( (proc->status|0x40)!=0x40 )
1000dc4: e5943054 ldr r3, [r4, #84] 1000dc8: e24cb004 sub r11, r12, #4 ; 0x4 1000dcc: e3833040 orr r3, r3, #64 ; 0x40 1000dd0: e3530040 cmp r3, #64 ; 0x40 1000dd4: 1a000009 bne 1000e00 <ResumeProcess+0x48> { //没有挂起
return 1;
}
lock_int();
1000dd8: ebfffef8 bl 10009c0 <lock_int> ready(proc); //read 挂起的进程
1000ddc: e1a00004 mov r0, r4 1000de0: ebfffe17 bl 1000644 <ready> //清除标志
proc->status&=~0x40; //清楚挂起标志,目前该标志位只有1位
1000de4: e5943054 ldr r3, [r4, #84] 1000de8: e3c33040 bic r3, r3, #64 ; 0x40 1000dec: e5843054 str r3, [r4, #84] sched(); //需要调度,如果需要让出cpu
1000df0: ebfffe0c bl 1000628 <sched> unlock_int();
1000df4: ebfffef5 bl 10009d0 <unlock_int> return 0;
1000df8: e3a00000 mov r0, #0 ; 0x0 1000dfc: e91ba810 ldmdb r11, {r4, r11, sp, pc} 1000e00: e3a00001 mov r0, #1 ; 0x1 1000e04: e91ba810 ldmdb r11, {r4, r11, sp, pc}01000e08 <TerminateProcess>: 1000e08: e1a0c00d mov r12, sp 1000e0c: e92dd800 stmdb sp!, {r11, r12, lr, pc} 1000e10: e24cb004 sub r11, r12, #4 ; 0x4}
int TerminateProcess(PROC *proc)
{
return 0;
1000e14: e3a00000 mov r0, #0 ; 0x0 1000e18: e91ba800 ldmdb r11, {r11, sp, pc}01000e1c <DelayTicks>: 1000e1c: e1a0c00d mov r12, sp 1000e20: e92dd830 stmdb sp!, {r4, r5, r11, r12, lr, pc} 1000e24: e24cb004 sub r11, r12, #4 ; 0x4#endif
//挂起进程等待ticks个定时中断。
void DelayTicks(int Ticks)
{
1000e28: e1a04000 mov r4, r0 PROC * ptrTmp,*ptrTmpOld;
lock_int();
ptrCurrProc->status|=0x80; //bit0.7 is suspend for timetick
1000e2c: e59f506c ldr r5, [pc, #6c] ; 1000ea0 <DelayTicks+0x84> 1000e30: ebfffee2 bl 10009c0 <lock_int> 1000e34: e5950000 ldr r0, [r5] 1000e38: e5903054 ldr r3, [r0, #84] ptrCurrProc->SleepTicks=Ticks;
1000e3c: e5804060 str r4, [r0, #96] 1000e40: e3833080 orr r3, r3, #128 ; 0x80 1000e44: e5803054 str r3, [r0, #84]
//first unready current process,or will make err.
//because change ptrCurrProc->ptrNextProc value.
unready(ptrCurrProc);
1000e48: ebfffe23 bl 10006dc <unready>
if(ptrSleepProc==NULL)
1000e4c: e59f1050 ldr r1, [pc, #50] ; 1000ea4 <DelayTicks+0x88> 1000e50: e5912000 ldr r2, [r1] 1000e54: e3520000 cmp r2, #0 ; 0x0 { //原来没有sleep的进程,第一个进入sleep的进程
ptrSleepProc=ptrCurrProc;
1000e58: 05953000 ldreq r3, [r5] 1000e5c: 05813000 streq r3, [r1] ptrSleepProc->ptrNextProc=NULL;
}else
1000e60: 0a000005 beq 1000e7c <DelayTicks+0x60> {
ptrTmpOld=ptrSleepProc;
ptrTmp=ptrSleepProc;
while(ptrTmp!=NULL)
{ //find last sleep process,找sleep链表的最后一个
ptrTmpOld=ptrTmp;
1000e64: e1a01002 mov r1, r2 ptrTmp=ptrTmp->ptrNextProc;
1000e68: e5912050 ldr r2, [r1, #80] }
1000e6c: e3520000 cmp r2, #0 ; 0x0 1000e70: 1afffffb bne 1000e64 <DelayTicks+0x48> ptrTmpOld->ptrNextProc=ptrCurrProc; //加入链表最后位置
1000e74: e5953000 ldr r3, [r5] 1000e78: e5813050 str r3, [r1, #80] (ptrTmpOld->ptrNextProc)->ptrNextProc=NULL;
1000e7c: e5832050 str r2, [r3, #80] }
if(ptrProcRdy==NULL)
;//SendOneChar(1,'t');
else ;//SendOneChar(1,'d');
sched();
1000e80: ebfffde8 bl 1000628 <sched> lock_int();
1000e84: ebfffecd bl 10009c0 <lock_int> ptrCurrProc->status&=0x7F;
1000e88: e5952000 ldr r2, [r5] 1000e8c: e5923054 ldr r3, [r2, #84] 1000e90: e203307f and r3, r3, #127 ; 0x7f 1000e94: e5823054 str r3, [r2, #84] unlock_int();
1000e98: ebfffecc bl 10009d0 <unlock_int>
}
1000e9c: e91ba830 ldmdb r11, {r4, r5, r11, sp, pc} 1000ea0: 010088f4 streqsh r8, [r0, -r4] 1000ea4: 01006060 tsteq r0, r0, rrx01000ea8 <Delay100ms>: 1000ea8: e1a0c00d mov r12, sp 1000eac: e92dd800 stmdb sp!, {r11, r12, lr, pc} 1000eb0: e24cb004 sub r11, r12, #4 ; 0x4//挂起进程等待I个100ms.
void Delay100ms(int i)
{
DelayTicks(i*10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -