📄 minitos.s
字号:
1000604: e59f2014 ldr r2, [pc, #14] ; 1000620 <InitTaskRdyPtrToNULL+0x40> ptrProcRdy=NULL;
1000608: e59f1014 ldr r1, [pc, #14] ; 1000624 <InitTaskRdyPtrToNULL+0x44> 100060c: e3a03000 mov r3, #0 ; 0x0 1000610: e5823000 str r3, [r2] 1000614: e5813000 str r3, [r1]}
1000618: e91ba800 ldmdb r11, {r11, sp, pc} 100061c: 01007860 tsteq r0, r0, ror #16 1000620: 01007880 tsteq r0, r0, lsl #17 1000624: 01007884 tsteq r0, r4, lsl #1701000628 <sched>: 1000628: e1a0c00d mov r12, sp 100062c: e92dd800 stmdb sp!, {r11, r12, lr, pc} 1000630: e24cb004 sub r11, r12, #4 ; 0x4
//进程调度函数,调用本子程序实现进程调度。
void sched(void)
{
lock_int();
1000634: eb0000e1 bl 10009c0 <lock_int> switch_task();
1000638: ebffff92 bl 1000488 <switch_task> unlock_int();
100063c: eb0000e3 bl 10009d0 <unlock_int> 1000640: e91ba800 ldmdb r11, {r11, sp, pc}01000644 <ready>: 1000644: e1a0c00d mov r12, sp 1000648: e92dd870 stmdb sp!, {r4, r5, r6, r11, r12, lr, pc}}
/***************************************************************************
**Function: 把rp所指的进程加到就绪表中使进程可运行。
**input:
**output:
***************************************************************************/
void ready(PROC *rp)
{
100064c: e1a04000 mov r4, r0/*
int prio;
prio=rp->priority;
if(prio<SERVER_PRIO)
{ //TASK
ptrTaskRdy[prio]=rp; //ptrTaskRdy[priority]指向rp
return;
}
if(prio==SERVER_PRIO)
{
ptrServerRdy=rp; //ptrServerRdy指向rp
return;
}
if(prio==PROC_PRIO)
{
ptrProcRdy=rp; //ptrProcRdy指向rp
return;
}
*/
int prio;
PROC *ptrTmpOld;
prio=rp->priority;
1000650: e5943048 ldr r3, [r4, #72] 1000654: e24cb004 sub r11, r12, #4 ; 0x4 //SendOneChar(1,prio+'0');
if(prio<SERVER_PRIO)
1000658: e3530007 cmp r3, #7 ; 0x7 100065c: ca00000a bgt 100068c <ready+0x48> { //TASK,加到Ready链表的末尾
if( (ptrTmpOld=FindLastPos(ptrTaskRdy[prio]))==NULL)
1000660: e59f6068 ldr r6, [pc, #68] ; 10006d0 <ready+0x8c> 1000664: e1a05103 mov r5, r3, lsl #2 1000668: e7960005 ldr r0, [r6, r5] 100066c: eb000097 bl 10008d0 <FindLastPos> 1000670: e3500000 cmp r0, #0 ; 0x0 {
ptrTaskRdy[prio]=rp;
1000674: 07864005 streq r4, [r6, r5] }else
1000678: 0a000000 beq 1000680 <ready+0x3c> {
//现在ptrTmpOld指向链表最后一个位置
ptrTmpOld->ptrNextProc=rp;
100067c: e5804050 str r4, [r0, #80] }
rp->ptrNextProc=NULL;
1000680: e3a03000 mov r3, #0 ; 0x0 1000684: e5843050 str r3, [r4, #80] //rp加入ptrTaskRdy[priority]链表的最后一个位置
return;
1000688: e91ba870 ldmdb r11, {r4, r5, r6, r11, sp, pc} }
if(prio==SERVER_PRIO)
100068c: e3530008 cmp r3, #8 ; 0x8 1000690: 1a000006 bne 10006b0 <ready+0x6c> {
if( (ptrTmpOld=FindLastPos(ptrServerRdy))==NULL)
1000694: e59f5038 ldr r5, [pc, #38] ; 10006d4 <ready+0x90> 1000698: e5950000 ldr r0, [r5] 100069c: eb00008b bl 10008d0 <FindLastPos> 10006a0: e3500000 cmp r0, #0 ; 0x0 10006a4: 1afffff4 bne 100067c <ready+0x38> {
ptrServerRdy=rp;
10006a8: e5854000 str r4, [r5] }else
10006ac: eafffff3 b 1000680 <ready+0x3c> {
//现在ptrTmpOld指向链表最后一个位置
ptrTmpOld->ptrNextProc=rp;
}
rp->ptrNextProc=NULL;
//rp加入ptrServerRdy链表的最后一个位置
return;
}
if(prio==PROC_PRIO)
10006b0: e3530009 cmp r3, #9 ; 0x9 10006b4: 191ba870 ldmnedb r11, {r4, r5, r6, r11, sp, pc} {
if( (ptrTmpOld=FindLastPos(ptrProcRdy))==NULL)
10006b8: e59f5018 ldr r5, [pc, #18] ; 10006d8 <ready+0x94> 10006bc: e5950000 ldr r0, [r5] 10006c0: eb000082 bl 10008d0 <FindLastPos> 10006c4: e3500000 cmp r0, #0 ; 0x0 10006c8: 0afffff6 beq 10006a8 <ready+0x64> {
ptrProcRdy=rp;
}else
{
//现在ptrTmpOld指向链表最后一个位置
ptrTmpOld->ptrNextProc=rp;
}
rp->ptrNextProc=NULL;
//rp加入ptrProcRdy链表的最后一个位置
return;
}
}
10006cc: eaffffea b 100067c <ready+0x38> 10006d0: 01007860 tsteq r0, r0, ror #16 10006d4: 01007880 tsteq r0, r0, lsl #17 10006d8: 01007884 tsteq r0, r4, lsl #17010006dc <unready>: 10006dc: e1a0c00d mov r12, sp 10006e0: e92dd870 stmdb sp!, {r4, r5, r6, r11, r12, lr, pc}
/***************************************************************************
**Function:把rp所指的进程从就绪表中去掉,使不可运行。
**input:
**output:
***************************************************************************/
void unready(PROC *rp)
{
10006e4: e1a04000 mov r4, r0 10006e8: e24dd004 sub sp, sp, #4 ; 0x4/*
int prio;
prio=rp->priority;
if(prio<SERVER_PRIO)
{
ptrTaskRdy[prio]=NULL;
return;
}
if(prio==SERVER_PRIO)
{
ptrServerRdy=NULL;
return;
}
if(prio==PROC_PRIO)
{
ptrProcRdy=NULL;
return;
}
*/
int prio,i;
PROC * ptrTmpOld;
prio=rp->priority;
10006ec: e5943048 ldr r3, [r4, #72] 10006f0: e24cb004 sub r11, r12, #4 ; 0x4 if(prio<SERVER_PRIO)
10006f4: e3530007 cmp r3, #7 ; 0x7 10006f8: ca00000c bgt 1000730 <unready+0x54> {
//ptrTaskRdy[prio]=NULL;
ptrTmpOld=FindProcPos(ptrTaskRdy[prio],rp,&i);
10006fc: e1a01004 mov r1, r4 1000700: e59f609c ldr r6, [pc, #9c] ; 10007a4 <unready+0xc8> 1000704: e1a05103 mov r5, r3, lsl #2 1000708: e7960005 ldr r0, [r6, r5] 100070c: e24b201c sub r2, r11, #28 ; 0x1c 1000710: eb000079 bl 10008fc <FindProcPos> if(i<0)return ;
1000714: e51b301c ldr r3, [r11, -#28] 1000718: e3530000 cmp r3, #0 ; 0x0 100071c: ba000025 blt 10007b8 <unready+0xdc> if(i==0)
1000720: 1a000022 bne 10007b0 <unready+0xd4> { //删除第一个
ptrTaskRdy[prio]=rp->ptrNextProc;
1000724: e5943050 ldr r3, [r4, #80] 1000728: e7863005 str r3, [r6, r5] }else
100072c: ea000021 b 10007b8 <unready+0xdc> { //删除rp所指向的项
ptrTmpOld->ptrNextProc=rp->ptrNextProc;
}
return;
}
if(prio==SERVER_PRIO)
1000730: e3530008 cmp r3, #8 ; 0x8 1000734: 1a00000b bne 1000768 <unready+0x8c> {
//ptrServerRdy=NULL;
ptrTmpOld=FindProcPos(ptrServerRdy,rp,&i);
1000738: e59f5068 ldr r5, [pc, #68] ; 10007a8 <unready+0xcc> 100073c: e1a01004 mov r1, r4 1000740: e5950000 ldr r0, [r5] 1000744: e24b201c sub r2, r11, #28 ; 0x1c 1000748: eb00006b bl 10008fc <FindProcPos> if(i<0)return ;
100074c: e51b301c ldr r3, [r11, -#28] 1000750: e3530000 cmp r3, #0 ; 0x0 1000754: ba000017 blt 10007b8 <unready+0xdc> if(i==0)
1000758: 1a000014 bne 10007b0 <unready+0xd4> { //删除第一个
ptrServerRdy=rp->ptrNextProc;
100075c: e5943050 ldr r3, [r4, #80] 1000760: e5853000 str r3, [r5] }else
1000764: ea000013 b 10007b8 <unready+0xdc> { //删除rp所指向的项
ptrTmpOld->ptrNextProc=rp->ptrNextProc;
}
return;
}
if(prio==PROC_PRIO)
1000768: e3530009 cmp r3, #9 ; 0x9 100076c: 1a000011 bne 10007b8 <unready+0xdc> {
//ptrProcRdy=NULL;
ptrTmpOld=FindProcPos(ptrProcRdy,rp,&i);
1000770: e59f5034 ldr r5, [pc, #34] ; 10007ac <unready+0xd0> 1000774: e1a01004 mov r1, r4 1000778: e5950000 ldr r0, [r5] 100077c: e24b201c sub r2, r11, #28 ; 0x1c 1000780: eb00005d bl 10008fc <FindProcPos>// SendOneChar(1,i+'0');
if(i<0)return ;
1000784: e51b301c ldr r3, [r11, -#28] 1000788: e3530000 cmp r3, #0 ; 0x0 100078c: ba000009 blt 10007b8 <unready+0xdc> if(i==0)
1000790: 1a000006 bne 10007b0 <unready+0xd4> { //删除第一个
ptrProcRdy=ptrProcRdy->ptrNextProc;
1000794: e5953000 ldr r3, [r5] 1000798: e5932050 ldr r2, [r3, #80] 100079c: e5852000 str r2, [r5] //SendOneChar(1,'f');
}else
10007a0: ea000004 b 10007b8 <unready+0xdc> 10007a4: 01007860 tsteq r0, r0, ror #16 10007a8: 01007880 tsteq r0, r0, lsl #17 10007ac: 01007884 tsteq r0, r4, lsl #17 { //删除rp所指向的项
ptrTmpOld->ptrNextProc=rp->ptrNextProc;
10007b0: e5943050 ldr r3, [r4, #80] 10007b4: e5803050 str r3, [r0, #80] //SendOneChar(1,'k');
}
return;
}
}
10007b8: e91ba870 ldmdb r11, {r4, r5, r6, r11, sp, pc}010007bc <ChangeProcPos>: 10007bc: e1a0c00d mov r12, sp 10007c0: e92dd870 stmdb sp!, {r4, r5, r6, r11, r12, lr, pc}
//调用本子程序时,是处于定时时间片,rp一定处于该优先级rdy表的第一个位置
void ChangeProcPos(PROC *rp)
{
10007c4: e1a05000 mov r5, r0 int prio;
PROC *ptrTmpOld;
prio=rp->priority;
10007c8: e5953048 ldr r3, [r5, #72] 10007cc: e24cb004 sub r11, r12, #4 ; 0x4
if(prio<SERVER_PRIO)
10007d0: e3530007 cmp r3, #7 ; 0x7 10007d4: ca00000e bgt 1000814 <ChangeProcPos+0x58> {
ptrTmpOld=FindLastPos(ptrTaskRdy[prio]);
10007d8: e59f609c ldr r6, [pc, #9c] ; 100087c <ChangeProcPos+0xc0> 10007dc: e1a04103 mov r4, r3, lsl #2 10007e0: e7960004 ldr r0, [r6, r4] 10007e4: eb000039 bl 10008d0 <FindLastPos> if(ptrTmpOld==NULL)
10007e8: e3500000 cmp r0, #0 ; 0x0 10007ec: 091ba870 ldmeqdb r11, {r4, r5, r6, r11, sp, pc} { //i==0空表
return ; //在SwitchTaskTimeOver调用不可能出现
}else
if(ptrTmpOld==ptrTaskRdy[prio])
10007f0: e7963004 ldr r3, [r6, r4] 10007f4: e1500003 cmp r0, r3 10007f8: 091ba870 ldmeqdb r11, {r4, r5, r6, r11, sp, pc} { //最后一项等于第一项,只有一项,就是自己,不用改变
return;
}else
{
ptrTaskRdy[prio]=rp->ptrNextProc; //删除处于开头的rp
10007fc: e5953050 ldr r3, [r5, #80] 1000800: e7863004 str r3, [r6, r4] //现在ptrTmpOld指向链表最后一个位置
ptrTmpOld->ptrNextProc=rp; //rp加入ptrTaskRdy[priority]链表的最后一个位置
1000804: e5805050 str r5, [r0, #80] rp->ptrNextProc=NULL;
1000808: e3a03000 mov r3, #0 ; 0x0 100080c: e5853050 str r3, [r5, #80] }
return;
1000810: e91ba870 ldmdb r11, {r4, r5, r6, r11, sp, pc} }
if(prio==SERVER_PRIO)
1000814: e3530008 cmp r3, #8 ; 0x8 1000818: 1a00000a bne 1000848 <ChangeProcPos+0x8c> {
ptrTmpOld=FindLastPos(ptrServerRdy);
100081c: e59f405c ldr r4, [pc, #5c] ; 1000880 <ChangeProcPos+0xc4> 1000820: e5940000 ldr r0, [r4] 1000824: eb000029 bl 10008d0 <FindLastPos> if(ptrTmpOld==NULL)
1000828: e3500000 cmp r0, #0 ; 0x0 100082c: 091ba870 ldmeqdb r11, {r4, r5, r6, r11, sp, pc} { //i==0空表
return ; //在SwitchTaskTimeOver调用不可能为出现
}else
if(ptrTmpOld==ptrServerRdy)
1000830: e5943000 ldr r3, [r4] 1000834: e1500003 cmp r0, r3 1000838: 091ba870 ldmeqdb r11, {r4, r5, r6, r11, sp, pc} { //只有一项,就是自己,不用改变
return;
}else
{
ptrServerRdy=rp->ptrNextProc; //删除处于开头的rp
100083c: e5953050 ldr r3, [r5, #80] 1000840: e5843000 str r3, [r4] //现在ptrTmpOld指向链表最后一个位置
ptrTmpOld->ptrNextProc=rp; //rp加入ptrServerRdy链表的最后一个位置
rp->ptrNextProc=NULL;
}
return;
1000844: eaffffee b 1000804 <ChangeProcPos+0x48>
}
if(prio==PROC_PRIO)
1000848: e3530009 cmp r3, #9 ; 0x9 100084c: 191ba870 ldmnedb r11, {r4, r5, r6, r11, sp, pc} {
ptrTmpOld=FindLastPos(ptrProcRdy);
1000850: e59f402c ldr r4, [pc, #2c] ; 1000884 <ChangeProcPos+0xc8> 1000854: e5940000 ldr r0, [r4] 1000858: eb00001c bl 10008d0 <FindLastPos> if(ptrTmpOld==NULL)
100085c: e3500000 cmp r0, #0 ; 0x0 1000860: 091ba870 ldmeqdb r11, {r4, r5, r6, r11, sp, pc} { //i==0空表
return ; //在SwitchTaskTimeOver调用不可能为出现
}else
if(ptrTmpOld==ptrProcRdy)
1000864: e5943000 ldr r3, [r4] 1000868: e1500003 cmp r0, r3 100086c: 091ba870 ldmeqdb r11, {r4, r5, r6, r11, sp, pc} { //只有一项,就是自己,不用改变
return;
}else
{
ptrProcRdy=rp->ptrNextProc; //删除处于开头的rp
1000870: e5953050 ldr r3, [r5, #80] 1000874: e5843000 str r3, [r4] //现在ptrTmpOld指向链表最后一个位置
ptrTmpOld->ptrNextProc=rp; //rp加入ptrProcRdy链表的最后一个位置
rp->ptrNextProc=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -