⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 minitos.s

📁 minitos是一个实时的嵌入式操作系统
💻 S
📖 第 1 页 / 共 5 页
字号:
 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 + -