📄 minitos.s
字号:
return;
}
}
1000878: eaffffe1 b 1000804 <ChangeProcPos+0x48> 100087c: 01007860 tsteq r0, r0, ror #16 1000880: 01007880 tsteq r0, r0, lsl #17 1000884: 01007884 tsteq r0, r4, lsl #1701000888 <SwitchTaskTimeOver>: 1000888: e1a0c00d mov r12, sp 100088c: e92dd800 stmdb sp!, {r11, r12, lr, pc}/*******************************************************************
**Function:if process priority is same,time slice down come,let other same priority
process run.
本子程序必须在time中断中调用。放在OnTime子程序之后,使从sleep进程ready后
先运行。
本子程序必须在定时中断中调用。如果在中断中加入,可实现同一优先级的时间轮询调度。
**
*********************************************************************/
void SwitchTaskTimeOver(void)
{
if(ptrCurrProc->RunTicksCount)
1000890: e59f0034 ldr r0, [pc, #34] ; 10008cc <SwitchTaskTimeOver+0x44> 1000894: e5902000 ldr r2, [r0] 1000898: e5923064 ldr r3, [r2, #100] 100089c: e24cb004 sub r11, r12, #4 ; 0x4 10008a0: e3530000 cmp r3, #0 ; 0x0 ptrCurrProc->RunTicksCount--;
10008a4: 12433001 subne r3, r3, #1 ; 0x1 10008a8: 15823064 strne r3, [r2, #100] if(ptrCurrProc->RunTicksCount==0)
10008ac: e5900000 ldr r0, [r0] 10008b0: e5903064 ldr r3, [r0, #100] 10008b4: e3530000 cmp r3, #0 ; 0x0 10008b8: 191ba800 ldmnedb r11, {r11, sp, pc} {
ptrCurrProc->RunTicksCount=ptrCurrProc->RunTicksInit;
10008bc: e5903068 ldr r3, [r0, #104] 10008c0: e5803064 str r3, [r0, #100] ChangeProcPos(ptrCurrProc);
10008c4: ebffffbc bl 10007bc <ChangeProcPos> }
10008c8: e91ba800 ldmdb r11, {r11, sp, pc} 10008cc: 010088f4 streqsh r8, [r0, -r4]010008d0 <FindLastPos>: 10008d0: e1a0c00d mov r12, sp 10008d4: e92dd800 stmdb sp!, {r11, r12, lr, pc} 10008d8: e24cb004 sub r11, r12, #4 ; 0x4}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/*******************************************************************
**Function:
**Input: head--
**Output:ptrLastPos
**return: 链表中共有几项,0--空表,>0项数
********************************************************************/
PROC * FindLastPos(PROC *head)
{
PROC *ptrTmp,*ptrTmpOld;
if(head==NULL)
10008dc: e3500000 cmp r0, #0 ; 0x0 10008e0: 091ba800 ldmeqdb r11, {r11, sp, pc} return NULL; //空表
ptrTmp=head;
ptrTmpOld=head;
while(ptrTmp!=NULL)
{
ptrTmpOld=ptrTmp;
10008e4: e1a03000 mov r3, r0 ptrTmp=ptrTmp->ptrNextProc;
10008e8: e5930050 ldr r0, [r3, #80] }
10008ec: e3500000 cmp r0, #0 ; 0x0 10008f0: 1afffffb bne 10008e4 <FindLastPos+0x14> //现在ptrTmpOld指向链表最后一个位置
return ptrTmpOld;
10008f4: e1a00003 mov r0, r3}
10008f8: e91ba800 ldmdb r11, {r11, sp, pc}010008fc <FindProcPos>: 10008fc: e1a0c00d mov r12, sp 1000900: e92dd800 stmdb sp!, {r11, r12, lr, pc} 1000904: e24cb004 sub r11, r12, #4 ; 0x4
/*******************************************************************
**Function:
**Input: head--
rp--要找的指针
**Output:ptrPos-指向rp的前一个项的指针
如图: ptrPos->A->B
rp->B
**return: 链表中第几项,-1--空表,0,第一项,1--第二项...
********************************************************************/
PROC * FindProcPos(PROC *head,PROC *rp,int *cnt)
{
PROC *ptrTmp,*ptrTmpOld;
*cnt=-1;
1000908: e3e03000 mvn r3, #0 ; 0x0 if(head==NULL)
100090c: e3500000 cmp r0, #0 ; 0x0 1000910: e5823000 str r3, [r2] 1000914: 091ba800 ldmeqdb r11, {r11, sp, pc} return NULL; //空表,ERR
*cnt=0;
ptrTmp=head;
ptrTmpOld=head;
1000918: e1a0c000 mov r12, r0 while(ptrTmp!=rp)
100091c: e1500001 cmp r0, r1 1000920: e3a03000 mov r3, #0 ; 0x0 1000924: e5823000 str r3, [r2] 1000928: 091ba800 ldmeqdb r11, {r11, sp, pc} {
(*cnt)+=1;
100092c: e5923000 ldr r3, [r2] 1000930: e2833001 add r3, r3, #1 ; 0x1 1000934: e5823000 str r3, [r2] ptrTmpOld=ptrTmp;
1000938: e1a0000c mov r0, r12 ptrTmp=ptrTmp->ptrNextProc;
100093c: e590c050 ldr r12, [r0, #80] }
1000940: e15c0001 cmp r12, r1 1000944: 1afffff8 bne 100092c <FindProcPos+0x30>
return ptrTmpOld;
}
1000948: e91ba800 ldmdb r11, {r11, sp, pc}0100094c <AddLinkToProcLastPos>: 100094c: e1a0c00d mov r12, sp 1000950: e92dd810 stmdb sp!, {r4, r11, r12, lr, pc} 1000954: e24cb004 sub r11, r12, #4 ; 0x4
/*******************************************************************
**Function:
**Input: head--
pProc--要加的进程指针
**Output:
none
**return:
********************************************************************/
PROC * AddLinkToProcLastPos(PROC *head,PROC *pProc)
{
1000958: e1a04001 mov r4, r1 PROC *ptrTmp;
ptrTmp=FindLastPos(head);
100095c: ebffffdb bl 10008d0 <FindLastPos> if(ptrTmp==NULL)
1000960: e2503000 subs r3, r0, #0 ; 0x0 1000964: 0a000004 beq 100097c <AddLinkToProcLastPos+0x30> return NULL;
//加入到尾部
ptrTmp->ptrNextProc=pProc;
pProc->ptrNextProc=NULL;
return pProc;
1000968: e1a00004 mov r0, r4 100096c: e5834050 str r4, [r3, #80] 1000970: e3a03000 mov r3, #0 ; 0x0 1000974: e5843050 str r3, [r4, #80] 1000978: e91ba810 ldmdb r11, {r4, r11, sp, pc} 100097c: e1a00003 mov r0, r3}
1000980: e91ba810 ldmdb r11, {r4, r11, sp, pc}01000984 <RemoveProcFromProcLink>: 1000984: e1a0c00d mov r12, sp 1000988: e92dd810 stmdb sp!, {r4, r11, r12, lr, pc} 100098c: e24cb004 sub r11, r12, #4 ; 0x4/*******************************************************************
**Function:
**Input: head--
pProc--要删的进程指针
**Output:
none
**return: <0 空表
=0 在第一项
>0 成功
********************************************************************/
int RemoveProcFromProcLink(PROC *head,PROC *pProc)
{
1000990: e1a04001 mov r4, r1 int i;
PROC * ptrTmpProc;
ptrTmpProc=FindProcPos(head,pProc,&i);
1000994: e24b2014 sub r2, r11, #20 ; 0x14 1000998: e24dd004 sub sp, sp, #4 ; 0x4 100099c: ebffffd6 bl 10008fc <FindProcPos> if(i<0) return i; //空表
10009a0: e51b3014 ldr r3, [r11, -#20] 10009a4: e3530000 cmp r3, #0 ; 0x0 10009a8: b1a00003 movlt r0, r3 10009ac: ba000002 blt 10009bc <RemoveProcFromProcLink+0x38> if(i==0)
{ //删除第一个
head=pProc->ptrNextProc;
}else
{ //删除rp所指向的项
ptrTmpProc->ptrNextProc=pProc->ptrNextProc;
10009b0: 15943050 ldrne r3, [r4, #80] 10009b4: 15803050 strne r3, [r0, #80] }
return i;
10009b8: e51b0014 ldr r0, [r11, -#20]}
10009bc: e91ba810 ldmdb r11, {r4, r11, sp, pc}010009c0 <lock_int>: 10009c0: e1a0c00d mov r12, sp 10009c4: e92dd800 stmdb sp!, {r11, r12, lr, pc} 10009c8: e24cb004 sub r11, r12, #4 ; 0x4 10009cc: e91ba800 ldmdb r11, {r11, sp, pc}010009d0 <unlock_int>: 10009d0: e1a0c00d mov r12, sp 10009d4: e92dd800 stmdb sp!, {r11, r12, lr, pc} 10009d8: e24cb004 sub r11, r12, #4 ; 0x4 10009dc: e91ba800 ldmdb r11, {r11, sp, pc}010009e0 <idle_forever>: 10009e0: e1a0c00d mov r12, sp 10009e4: e92dd800 stmdb sp!, {r11, r12, lr, pc} 10009e8: e24cb004 sub r11, r12, #4 ; 0x4}
*/
void idle_forever(void)
{
for(;;)
10009ec: eafffffe b 10009ec <idle_forever+0xc> 10009f0: e91ba800 ldmdb r11, {r11, sp, pc}010009f4 <MO_InitSystem>: 10009f4: e1a0c00d mov r12, sp 10009f8: e92ddff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, lr, pc} 10009fc: e24cb004 sub r11, r12, #4 ; 0x4 {
}
}
//初始化PROC,并建立系统进程
void MO_InitSystem(void)
{
int i;
InitTaskRdyPtrToNULL();
1000a00: ebfffef6 bl 10005e0 <InitTaskRdyPtrToNULL>// InitProcIPtoNULL(); //初始化所有的外部进程为NULL
SysProcess[0]=idle_forever;
for (i=0;i<N_SYSPROC;i++)
1000a04: e59f9120 ldr r9, [pc, #120] ; 1000b2c <MO_InitSystem+0x138> 1000a08: e3a05000 mov r5, #0 ; 0x0 1000a0c: e59f211c ldr r2, [pc, #11c] ; 1000b30 <MO_InitSystem+0x13c> 1000a10: e1a06005 mov r6, r5 1000a14: e59f3118 ldr r3, [pc, #118] ; 1000b34 <MO_InitSystem+0x140> 1000a18: e1a0e005 mov lr, r5 1000a1c: e59f8114 ldr r8, [pc, #114] ; 1000b38 <MO_InitSystem+0x144> 1000a20: e1a0a002 mov r10, r2 1000a24: e1a07003 mov r7, r3 1000a28: e2484f46 sub r4, r8, #280 ; 0x118 1000a2c: e1a0c004 mov r12, r4 1000a30: e5823000 str r3, [r2] { //初始化系统进程表
SysProcess[i]=idle_forever;
SysProc[i].SP=SysProcStk[i];
1000a34: e0863009 add r3, r6, r9 SysProc[i].SP+=(100-1)*4; //stack bottom,little endian,bug????
1000a38: e2833f63 add r3, r3, #396 ; 0x18c
SysProc[i].IP=SysProcess[i]; //task
1000a3c: e28c2010 add r2, r12, #16 ; 0x10 1000a40: e5843008 str r3, [r4, #8] SysProc[i].CPSR=SVCMODE; //CPSR value bug??????? SVCMODE
1000a44: e28c1004 add r1, r12, #4 ; 0x4 1000a48: e782700e str r7, [r2, lr] 1000a4c: e3a03013 mov r3, #19 ; 0x13 1000a50: e781300e str r3, [r1, lr] SysProc[i].SPSR=SVCMODE;
SysProc[i].r0=0x30;
1000a54: e28c2014 add r2, r12, #20 ; 0x14 1000a58: e5843000 str r3, [r4] 1000a5c: e283301d add r3, r3, #29 ; 0x1d SysProc[i].r1=0x31;
1000a60: e28c1018 add r1, r12, #24 ; 0x18 1000a64: e782300e str r3, [r2, lr] 1000a68: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r2=0x32;
1000a6c: e28c201c add r2, r12, #28 ; 0x1c 1000a70: e781300e str r3, [r1, lr] 1000a74: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r3=0x33;
1000a78: e28c1020 add r1, r12, #32 ; 0x20 1000a7c: e782300e str r3, [r2, lr] 1000a80: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r4=0x34;
1000a84: e28c2024 add r2, r12, #36 ; 0x24 1000a88: e781300e str r3, [r1, lr] 1000a8c: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r5=0x35;
1000a90: e28c1028 add r1, r12, #40 ; 0x28 1000a94: e782300e str r3, [r2, lr] 1000a98: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r6=0x36;
1000a9c: e28c202c add r2, r12, #44 ; 0x2c 1000aa0: e781300e str r3, [r1, lr] 1000aa4: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r7=0x37;
1000aa8: e28c1030 add r1, r12, #48 ; 0x30 1000aac: e782300e str r3, [r2, lr] 1000ab0: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r8=0x38;
1000ab4: e28c2034 add r2, r12, #52 ; 0x34 1000ab8: e781300e str r3, [r1, lr] 1000abc: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r9=0x39;
1000ac0: e08c1003 add r1, r12, r3 1000ac4: e782300e str r3, [r2, lr] 1000ac8: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r10=0x3a;
1000acc: e28c203c add r2, r12, #60 ; 0x3c 1000ad0: e781300e str r3, [r1, lr] 1000ad4: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r11=0x3b;
1000ad8: e28c1040 add r1, r12, #64 ; 0x40 1000adc: e782300e str r3, [r2, lr] 1000ae0: e2833001 add r3, r3, #1 ; 0x1 SysProc[i].r12=0x3c;
1000ae4: e28c0044 add r0, r12, #68 ; 0x44 1000ae8: e781300e str r3, [r1, lr] 1000aec: e2833001 add r3, r3, #1 ; 0x1 1000af0: e780300e str r3, [r0, lr] SysProc[i].lr=0x3e;
1000af4: e3a0203e mov r2, #62 ; 0x3e 1000af8: e584200c str r2, [r4, #12] 1000afc: e284408c add r4, r4, #140 ; 0x8c 1000b00: e2866e19 add r6, r6, #400 ; 0x190 1000b04: e28ee08c add lr, lr, #140 ; 0x8c 1000b08: e78a7105 str r7, [r10, r5, lsl #2] 1000b0c: e2855001 add r5, r5, #1 ; 0x1 1000b10: e3550002 cmp r5, #2 ; 0x2 1000b14: daffffc6 ble 1000a34 <MO_InitSystem+0x40> }
ptrIdle= &SysProc[2]; //Idle3 will run forever
1000b18: e59f301c ldr r3, [pc, #1c] ; 1000b3c <MO_InitSystem+0x148> 1000b1c: e5838000 str r8, [r3] SysProc[2].priority=IDLE_PRIO;
1000b20: e2422034 sub r2, r2, #52 ; 0x34 1000b24: e5882048 str r2, [r8, #72]//Now Idle proc have been created.
//Create Other System proc.
//#define TESTIPC
#ifdef TESTIPC
SysProc[0].priority=PROC_PRIO;//SERVER_PRIO;
SysProc[0].RunTicksInit=1;
SysProc[0].RunTicksCount=SysProc[0].RunTicksInit;
SysProc[1].priority=PROC_PRIO;
SysProc[1].RunTicksInit=1;
SysProc[1].RunTicksCount=SysProc[1].RunTicksInit;
ready(&SysProc[0]);
ready(&SysProc[1]);
#endif
}
1000b28: e91baff0 ldmdb r11, {r4, r5, r6, r7, r8, r9, r10, r11, sp, pc} 1000b2c: 01008f40 tsteq r0, r0, asr #30 1000b30: 01006068 tsteq r0, r8, rrx 1000b34: 010009e0 tsteq r0, r0, ror #19 1000b38: 01008ab4 streqh r8, [r0, -r4] 1000b3c: 01007888 tsteq r0, r8, lsl #1701000b40 <ProcShell>: 1000b40: e1a0c00d mov r12, sp 1000b44: e92dd810 stmdb sp!, {r4, r11, r12, lr, pc} 1000b48: e24cb004 sub r11, r12, #4 ; 0x4 argc--参数1
argv--参数2
**************************************************/
void ProcShell(void (*proc)(int,void*) ,int argc,void*argv)
{
1000b4c: e1a03000 mov r3, r0 proc(argc,argv);
1000b50: e1a00001 mov r0, r1 1000b54: e1a01002 mov r1, r2 1000b58: e1a0e00f mov lr, pc 1000b5c: e1a0f003 mov pc, r3 1000b60: e59f4024 ldr r4, [pc, #24] ; 1000b8c <ProcShell+0x4c> //用户进程结束,把本进程从Ready表中删除。while(1)是为了防止被别的进程意外调度,继续运行
while(1)
{
lock_int();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -