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

📄 minitos.s

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