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

📄 minitos.s

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