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

📄 os_core.s

📁 非剥夺型占先式minOS_iccavr avr单片机 icc编译环境
💻 S
字号:
	.module OS_Core.c
	.area text(rom, con, rel)
	.dbfile C:\icc\minOS_iccavr\OS_Core.c
	.dbfunc s OSInit _OSInit fI
;              i -> R16
;        pOS_TCB -> R18,R19
	.even
_OSInit::
	.dbline -1
	.dbline 18
; /*
; *********************************************************************************************************
; *                                      minOS 0.01v
; *                                The Real-Time OS Kernel
; *                                  All Rights Reserved
; * File : OS_Core.C
; * 作者 : 21icbbs网友 LM7556 ,2004年7月   by : LM7556 , China , 2004-2004 
; *
; *********************************************************************************************************
; */
; 
; 
; #define  OS_GLOBALS                           /* Declare GLOBAL variables   */
; #include "OS_Includes.h"
; 
; // initialization OSTCB --- 初始化任务控制块.
; void OSInit(void) 
; {	INT8U i;
	.dbline 20
;     OS_TCB *pOS_TCB;
; 	pOS_TCB=OSTCB;
	ldi R18,<_OSTCB
	ldi R19,>_OSTCB
	.dbline 21
; 	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	clr R16
	rjmp L6
L3:
	.dbline 22
	.dbline 23
	clr R2
	clr R3
	mov R30,R18
	mov R31,R19
	std z+0,R2
	std z+1,R3
	.dbline 24
	ldi R24,253
	std z+2,R24
	.dbline 25
	clr R2
	std z+3,R2
	std z+4,R3
	.dbline 26
L4:
	.dbline 21
	inc R16
	subi R18,251  ; offset = 5
	sbci R19,255
L6:
	.dbline 21
	cpi R16,5
	brlo L3
	.dbline -2
	.dbline 27
; 	{
; 		pOS_TCB->OSStkTop=(INT16U)NULL;
; 		pOS_TCB->OSTaskStatus=OS_TASK_Suspend;
; 		pOS_TCB->OSTimeDly=0;
; 	}
; }
L2:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbsym r pOS_TCB 18 pX
	.dbfunc s OSStart _OSStart fI
	.even
_OSStart::
	.dbline -1
	.dbline 31
; 
; //Start OS --- 启动OS
; void OSStart(void) 
; {
	.dbline 32
; 	Init_OS_Timer();
	rcall _InitOSTimer
	.dbline 33
; 	OS_TASK_CrtPrio=Task_main_Prio;
	clr R2
	sts _OS_TASK_CrtPrio,R2
	.dbline 34
; 	OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_Run;
	mov R18,R2
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB+2
	ldi R25,>_OSTCB+2
	add R30,R24
	adc R31,R25
	ldi R24,251
	std z+0,R24
	.dbline 35
; 	OS_INT_ENABLE();
	.dbline 36
; 	OS_TASK_INT();
	rcall _OSCtxSw
	.dbline -2
	.dbline 37
; }
L7:
	.dbline 0 ; func end
	ret
	.dbfunc s OSPrioHighRdy _OSPrioHighRdy fI
;              i -> R16
;        pOS_TCB -> R18,R19
	.even
_OSPrioHighRdy:
	rcall push_gset2
	.dbline -1
	.dbline 41
; 
; //返回优先级最高的处于就绪态任务的优先级,否则返回no_TASK_Rdy。
; static INT8U OSPrioHighRdy(void) 
; { INT8U i;
	.dbline 43
;     OS_TCB *pOS_TCB;
; 	pOS_TCB=OSTCB;
	ldi R18,<_OSTCB
	ldi R19,>_OSTCB
	.dbline 44
; 	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	clr R16
	rjmp L13
L10:
	.dbline 45
; 	{
	.dbline 46
; 		if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
	mov R30,R18
	mov R31,R19
	ldd R2,z+0
	ldd R3,z+1
	tst R2
	brne X0
	tst R3
	breq L16
X0:
	ldi R22,1
	ldi R23,0
	rjmp L17
L16:
	clr R22
	clr R23
L17:
	mov R30,R18
	mov R31,R19
	ldd R24,z+2
	cpi R24,252
	brne L18
	ldi R20,1
	ldi R21,0
	rjmp L19
L18:
	clr R20
	clr R21
L19:
	mov R2,R22
	mov R3,R23
	and R2,R20
	and R3,R21
	tst R2
	brne X1
	tst R3
	breq L14
X1:
	.dbline 46
	.dbline 46
	clr R17
	rjmp L9
L14:
	.dbline 47
L11:
	.dbline 44
	inc R16
	subi R18,251  ; offset = 5
	sbci R19,255
L13:
	.dbline 44
	cpi R16,5
	brlo L10
	.dbline 48
; 	}
; 	return no_TASK_Rdy;
	ldi R16,255
	ldi R17,0
	.dbline -2
L9:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbsym r pOS_TCB 18 pX
	.dbfunc s OSTimeTick _OSTimeTick fI
;              i -> R20
;        pOS_TCB -> R22,R23
	.even
_OSTimeTick::
	rcall push_gset2
	.dbline -1
	.dbline 54
; }
; 
; //Task OSTimeDly Decrease 1 per Time Tick --- 每个时钟节拍,任务等待延时的时间OSTimeDly减1.
; //如果任务的OSTimeDly减到0,把任务设置为准备就绪OS_TASK_Rdy。
; void OSTimeTick(void) 
; { INT8U i;
	.dbline 56
;     OS_TCB *pOS_TCB;
; 	pOS_TCB=OSTCB;
	ldi R22,<_OSTCB
	ldi R23,>_OSTCB
	.dbline 57
; 	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	clr R20
	rjmp L24
L21:
	.dbline 58
; 	{
	.dbline 59
; 		if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut) 
	mov R30,R22
	mov R31,R23
	ldd R2,z+3
	ldd R3,z+4
	tst R2
	brne X2
	tst R3
	breq L25
X2:
	.dbline 60
; 		{
	.dbline 61
; 			if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
	mov R24,R22
	mov R25,R23
	adiw R24,3
	mov R2,R24
	mov R3,R25
	mov R30,R2
	mov R31,R3
	ldd R24,z+0
	ldd R25,z+1
	sbiw R24,1
	mov R4,R24
	mov R5,R25
	std z+0,R4
	std z+1,R5
	tst R4
	brne L27
	tst R5
	brne L27
	.dbline 61
	.dbline 61
	ldi R24,252
	mov R30,R22
	mov R31,R23
	std z+2,R24
	.dbline 61
L27:
	.dbline 62
; 		}
L25:
	.dbline 63
L22:
	.dbline 57
	inc R20
	subi R22,251  ; offset = 5
	sbci R23,255
L24:
	.dbline 57
	cpi R20,5
	brlo L21
	.dbline 64
; 	}
; 	OS_TASK_HighPri=OSPrioHighRdy();
	rcall _OSPrioHighRdy
	mov R2,R16
	mov R3,R17
	sts _OS_TASK_HighPri,R2
	.dbline -2
	.dbline 65
; }
L20:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r pOS_TCB 22 pX
	.dbfunc s OSTimeDly _OSTimeDly fI
;           Tdly -> R20,R21
	.even
_OSTimeDly::
	rcall push_gset1
	mov R20,R16
	mov R21,R17
	.dbline -1
	.dbline 70
; 
; #if OS_TIME_DLY_EN
; //OS Time Delay --- 使任务延时Tdly个时间节拍
; void OSTimeDly(INT16U Tdly)               /* Delay Tdly clock tick */
; {
	.dbline 71
; 	OSTCB[OS_TASK_CrtPrio].OSTimeDly=Tdly+OS_TASK_TimeOut;
	lds R18,_OS_TASK_CrtPrio
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB+3
	ldi R25,>_OSTCB+3
	add R30,R24
	adc R31,R25
	std z+0,R20
	std z+1,R21
	.dbline 72
; 	OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_WaitTicks;
	lds R18,_OS_TASK_CrtPrio
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB+2
	ldi R25,>_OSTCB+2
	add R30,R24
	adc R31,R25
	ldi R24,250
	std z+0,R24
	.dbline 73
; 	OSSched();
	rcall _OSSched
	.dbline -2
	.dbline 74
; }
L29:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Tdly 20 i
	.dbfunc s OSTaskSuspend _OSTaskSuspend fI
;       TaskPrio -> R20
	.even
_OSTaskSuspend::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 80
; #endif
; 
; #if OS_TASK_SUSPEND_EN>0
; //把正在运行的任务挂起(Suspend a task)。
; void OSTaskSuspend(INT8U TaskPrio) 
; {
	.dbline 81
; 	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Suspend;
	mov R18,R20
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB+2
	ldi R25,>_OSTCB+2
	add R30,R24
	adc R31,R25
	ldi R24,253
	std z+0,R24
	.dbline 82
; 	OSSched();
	rcall _OSSched
	.dbline -2
	.dbline 83
; }
L32:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r TaskPrio 20 c
	.dbfunc s OSTaskResume _OSTaskResume fI
;       TaskPrio -> R20
	.even
_OSTaskResume::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 89
; #endif
; 
; #if OS_TASK_Resume_EN>0
; // 恢复被挂起的任务(resume a task)。
; void OSTaskResume(INT8U TaskPrio) 
; {
	.dbline 90
; 	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Rdy;
	mov R18,R20
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB+2
	ldi R25,>_OSTCB+2
	add R30,R24
	adc R31,R25
	ldi R24,252
	std z+0,R24
	.dbline -2
	.dbline 91
; }
L34:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r TaskPrio 20 c
	.dbfunc s OSSched _OSSched fI
	.even
_OSSched::
	.dbline -1
	.dbline 96
; #endif
; 
; //任务调度,把CPU控制权转到优先级最高的处于就绪态的任务。如果没有处于就绪态的任务,就地等待,
; void OSSched(void) 
; {
L37:
	.dbline 98
; 	do
; 	{
	.dbline 99
; 		OS_TASK_HighPri=OSPrioHighRdy();
	rcall _OSPrioHighRdy
	mov R2,R16
	mov R3,R17
	sts _OS_TASK_HighPri,R2
	.dbline 100
L38:
	.dbline 100
; 	} while (OS_TASK_HighPri==no_TASK_Rdy);
	lds R24,_OS_TASK_HighPri
	cpi R24,255
	breq L37
	.dbline 101
; 	OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
	mov R18,R24
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB+2
	ldi R25,>_OSTCB+2
	add R30,R24
	adc R31,R25
	ldi R24,251
	std z+0,R24
	.dbline 102
; 	OS_TASK_INT();
	rcall _OSCtxSw
	.dbline -2
	.dbline 103
; }
L36:
	.dbline 0 ; func end
	ret
	.area bss(ram, con, rel)
	.dbfile C:\icc\minOS_iccavr\OS_Core.c
_TASK_main_PrioStk::
	.blkb 48
	.dbfile C:\icc\minOS_iccavr/OS_Minos.h
	.dbsym s TASK_main_PrioStk _TASK_main_PrioStk A[48:48]c
_OSTCB::
	.blkb 25
	.dbsym s OSTCB _OSTCB A[25:5]X
_OS_TASK_HighPri::
	.blkb 1
	.dbsym s OS_TASK_HighPri _OS_TASK_HighPri c
_OS_TASK_CrtPrio::
	.blkb 1
	.dbsym s OS_TASK_CrtPrio _OS_TASK_CrtPrio c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -