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

📄 os_cpu_c.s

📁 UCOS/II for ICCAVR - The version of UCOS/II is 2.04 - the original port was done by Ole Saether
💻 S
字号:
	.module os_cpu_c.c
	.area text(rom, con, rel)
	.dbfile F:\开发工具\AVR开发工具\RTOSIC~1\source\os_cpu_c.c
	.dbfunc e OSTaskStkInit _OSTaskStkInit fpc
;           stks -> R10,R11
;            tmp -> R22,R23
;            stk -> R20,R21
;            opt -> y+10
;           ptos -> y+8
;          pdata -> R12,R13
;           task -> R22,R23
	.even
_OSTaskStkInit::
	xcall push_gset4
	mov R12,R18
	mov R13,R19
	mov R22,R16
	mov R23,R17
	.dbline -1
	.dbline 60
; /*
; ********************************************************************************
; *                               uC/OS-II
; *                          The Real-Time Kernel
; * 
; *                         ATmega103 Specific code
; *
; * File:			OS_CPU_C.C
; * By:			Ole Saether
; * Modified by:	Joerg Meyer
; * Revision:		0
; *
; *
; *
; ********************************************************************************
; */
; 
; #define  OS_CPU_GLOBALS
; #include "includes.h"
; 
; /*
; ********************************************************************************
; *                     INITIALIZE A TASK'S STACK
; *
; * Description:
; *	This function is called by either OSTaskCreate() or OSTaskCreateExt() to
; *	initialize the stack frame of the task being created. This function is
; *	highly processor specific.
; *
; * Arguments:
; *	task - 	is a pointer to the task code
; *
; *	pdata -	is a pointer to a user supplied data area that will be passed to the
; *			 task when the task first executes.
; *
; *	ptos - 	is a pointer to the top of stack. It is assumed that 'ptos' points to
; *			the highest valid address on the stack.
; *
; *	opt - 	specifies options that can be used to alter the behavior of 
; 			OSTaskStkInit(). (see uCOS_II.H for OS_TASK_OPT_???).
; *
; * Returns:
; *	Always returns the location of the new top-of-stack' once the processor 
; *	registers have been placed on the stack in the proper order.
; *
; * Note(s):
; *	Interrupts are enabled when your task starts executing. You can change this 
; * 	by setting the SREG to 0x00 instead. In this case, interrupts would be 
; *	disabled upon task startup. The application code would be responsible for 
; *	enabling interrupts at the beginning of the task code. You will need to 
; *	modify OSTaskIdle() and OSTaskStat() so that they enable interrupts. Failure
; *	to do this will make your system crash! The AVR return stack is placed 64 
; *	bytes above the start of the (512 byte) stack. This provides 32 levels of 
; *	function call nesting which should be more than enough for most applications
; *	(see the "read.me" file for more info).
; *
; ********************************************************************************
; */
; OS_STK *OSTaskStkInit (void (*task)(void *pd),
; 						 void *pdata, OS_STK *ptos, INT16U opt){
	.dbline 67
; 
;     INT8U  *stk;
;     INT8U  *stks;		// Temp. variable used for setting up AVR hardware stack
;     INT16U tmp;
; 
; 
;     opt     = opt;			// 'opt' is not used, prevent warning
	.dbline 68
;     stk     = (INT8U *)ptos;		// Wandlung von ptos in Bytezeiger
	ldd R20,y+8
	ldd R21,y+9
	.dbline 70
; 	// AVR return stack ("hardware stack")
;     stks    = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
	mov R24,R20
	mov R25,R21
	subi R24,96
	sbci R25,0
	mov R10,R24
	mov R11,R25
	.dbline 75
; 
; 	// the function address has an extra level of indirection. Fetch the
;     // actual address.
;     //    
;     tmp = *(INT16U const *)task;
	mov R16,R22
	mov R17,R23
	xcall lpm16
	mov R22,R16
	mov R23,R17
	.dbline 78
;    
; 	// 36 Bytes
;     *stks-- = (INT8U)tmp;	//Put task start address on top of hardware stack
	mov R2,R10
	mov R3,R11
	mov R24,R2
	mov R25,R3
	sbiw R24,1
	mov R30,R2
	mov R31,R3
	std z+0,R22
	.dbline 79
;     *stks-- = (INT8U)(tmp >> 8);
	mov R2,R24
	mov R3,R25
	sbiw R24,1
	mov R10,R24
	mov R11,R25
	mov R4,R22
	mov R5,R23
	mov R4,R5
	clr R5
	mov R30,R2
	mov R31,R3
	std z+0,R4
	.dbline 81
; 
;     *stk-- = (INT8U)0x00;		// R0  = 0x00
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	clr R4
	mov R30,R2
	mov R31,R3
	std z+0,R4
	.dbline 82
;     *stk-- = (INT8U)0x01; 
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,1
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 83
;     *stk-- = (INT8U)0x02;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,2
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 84
;     *stk-- = (INT8U)0x03;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,3
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 85
;     *stk-- = (INT8U)0x04;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,4
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 86
;     *stk-- = (INT8U)0x05;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,5
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 87
;     *stk-- = (INT8U)0x06;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,6
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 88
;     *stk-- = (INT8U)0x07;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,7
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 89
;     *stk-- = (INT8U)0x08;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,8
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 90
;     *stk-- = (INT8U)0x09;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,9
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 91
;     *stk-- = (INT8U)0x10;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,16
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 92
;     *stk-- = (INT8U)0x11;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,17
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 93
;     *stk-- = (INT8U)0x12;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,18
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 94
;     *stk-- = (INT8U)0x13;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,19
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 95
;     *stk-- = (INT8U)0x14;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,20
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 96
;     *stk-- = (INT8U)0x15;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,21
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 97
;     tmp    = (INT16U)pdata;
	mov R22,R12
	mov R23,R13
	.dbline 98
;     *stk-- = (INT8U)tmp;	//Simulate call to function with argument
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	mov R30,R2
	mov R31,R3
	std z+0,R22
	.dbline 99
;     *stk-- = (INT8U)(tmp >> 8);
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	mov R4,R22
	mov R5,R23
	mov R4,R5
	clr R5
	mov R30,R2
	mov R31,R3
	std z+0,R4
	.dbline 100
;     *stk-- = (INT8U)0x18;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,24
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 101
;     *stk-- = (INT8U)0x19;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,25
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 102
;     *stk-- = (INT8U)0x20;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,32
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 103
;     *stk-- = (INT8U)0x21;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,33
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 104
;     *stk-- = (INT8U)0x22;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,34
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 105
;     *stk-- = (INT8U)0x23;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,35
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 106
;     *stk-- = (INT8U)0x24;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,36
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 107
;     *stk-- = (INT8U)0x25;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,37
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 108
;     *stk-- = (INT8U)0x26;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,38
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 109
;     *stk-- = (INT8U)0x27;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,39
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 111
; 	// the heap pointer Y=R29:R28 will not be stored
;     *stk-- = (INT8U)0x30;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,48
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 112
;     *stk-- = (INT8U)0x31;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,49
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 113
;     *stk-- = (INT8U)0x3B;
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,59
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 114
;     *stk-- = (INT8U)0x80;	//SREG = Interrupts enabled
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	ldi R24,128
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 116
; 
;     tmp    = (INT16U)(stks);
	mov R22,R10
	mov R23,R11
	.dbline 117
;     *stk-- = (INT8U)(tmp >> 8);
	mov R2,R20
	mov R3,R21
	subi R20,1
	sbci R21,0
	mov R4,R22
	mov R5,R23
	mov R4,R5
	clr R5
	mov R30,R2
	mov R31,R3
	std z+0,R4
	.dbline 118
;     *stk   = (INT8U)(tmp);
	mov R30,R20
	mov R31,R21
	std z+0,R22
	.dbline 119
;     return ((void *)stk);
	mov R16,R30
	mov R17,R31
	.dbline -2
L1:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r stks 10 pc
	.dbsym r tmp 22 i
	.dbsym r stk 20 pc
	.dbsym l opt 10 i
	.dbsym l ptos 8 pc
	.dbsym r pdata 12 pV
	.dbsym r task 22 pfV
	.dbend
	.dbfunc e OSTaskCreateHook _OSTaskCreateHook fV
;         OS_TCB -> R0,R1
	.even
_OSTaskCreateHook::
	.dbline 0 ; func end
	ret
	.dbsym l OS_TCB 0 I
	.dbend
	.dbfunc e OSTaskDelHook _OSTaskDelHook fV
;         OS_TCB -> R0,R1
	.even
_OSTaskDelHook::
	.dbline 0 ; func end
	ret
	.dbsym l OS_TCB 0 I
	.dbend
	.dbfunc e OSTaskSwHook _OSTaskSwHook fV
	.even
_OSTaskSwHook::
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e OSTaskStatHook _OSTaskStatHook fV
	.even
_OSTaskStatHook::
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e OSTimeTickHook _OSTimeTickHook fV
	.even
_OSTimeTickHook::
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e TC2_Init _TC2_Init fV
	.even
_TC2_Init::
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 40
	jmp _OSTickISR
	.area text(rom, con, rel)
	.dbfile F:\开发工具\AVR开发工具\RTOSIC~1\source\os_cpu_c.c

⌨️ 快捷键说明

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