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

📄 os_cpu.s

📁 非剥夺型占先式minOS_iccavr avr单片机 icc编译环境
💻 S
字号:
	.module os_cpu.c
	.area vector(rom, abs)
	.org 14
	rjmp _OSTickISR
	.area text(rom, con, rel)
	.dbfile C:\icc\minOS_iccavr\os_cpu.c
	.dbfunc s InitOSTimer _InitOSTimer fI
	.even
_InitOSTimer::
	.dbline -1
	.dbline 24
; /*
; *********************************************************************************************************
; *                                      minOS 0.01v
; *                                The Real-Time OS Kernel
; *                                  All Rights Reserved
; * File : OS_CPU.C
; * 作者 : 21icbbs网友 LM7556 ,2004年7月   by : LM7556 , China , 2004-2004 
; *
; *********************************************************************************************************
; */
; 
; #define OS_CPU_GLOBALS
; #include "OS_Includes.h"
; 
; #pragma interrupt_handler OSTickISR:8  //uses Timer0 for time ticks.
; 
; //;CPU specific definitions 
; #define C51_CRYSTAL_FREQ   4000000ul
; //;Determine the reload values for timer 0 this is automated by the next macro
; #define T0_RELOAD  C51_CRYSTAL_FREQ / OS_TICKS_PER_SEC / 1024
; #define T0_TCNT0 (256 - (T0_RELOAD & 0xff))
; //Initial OS Timer for time ticks --- 初始化时间节拍定时器。
; void InitOSTimer(void)
; {
	.dbline 25
;   TIMSK |= (1<<1);     // set T0IE0
	in R24,0x39
	ori R24,2
	out 0x39,R24
	.dbline 26
;   TCCR0  = 0x05;       // CTC0=CK/1024
	ldi R24,5
	out 0x33,R24
	.dbline 27
;   TCNT0  = T0_TCNT0;   // (256 - (T0_RELOAD & 0xff))
	ldi R24,122
	out 0x32,R24
	.dbline 28
;   SREG  |= (1<<7);     // SEI
	bset 7
	.dbline -2
	.dbline 29
; }
L2:
	.dbline 0 ; func end
	ret
	.dbfunc s OSTaskCreate _OSTaskCreate fI
;           prio -> y+4
;           tStk -> R22,R23
;          tFunc -> R20,R21
	.even
_OSTaskCreate::
	rcall push_gset2
	mov R22,R18
	mov R23,R19
	mov R20,R16
	mov R21,R17
	.dbline -1
	.dbline 34
; 
; //建立一个任务(Create a Task)。
; //Inport :  tFunc --- function address , tStk --- stack bottom , prio --- Priority .
; void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio) 
; {
	.dbline 35
;  	OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
	ldd R18,y+4
	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 36
; 	OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called             */
	ldd R18,y+4
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB
	ldi R25,>_OSTCB
	add R30,R24
	adc R31,R25
	mov R24,R22
	mov R25,R23
	sbiw R24,1
	sbiw R24,12
	sbiw R24,2
	std z+0,R24
	std z+1,R25
	.dbline 40
;                           -12             /* reserve for to save R0-R5 , R26-R31 registers  */
;                           -sizeof(INT16U) /* The PC value to be loaded                      */
; 					   ;
; 	*--tStk	=  *(INT16U const *)tFunc & 0xff;   /* Save low byte of task function address   */
	mov R24,R22
	mov R25,R23
	sbiw R24,1
	mov R2,R24
	mov R3,R25
	mov R22,R2
	mov R23,R3
	mov R16,R20
	mov R17,R21
	rcall lpm16
	mov R24,R16
	mov R25,R17
	andi R25,0
	mov R30,R2
	mov R31,R3
	std z+0,R24
	.dbline 41
; 	*--tStk	=  *(INT16U const *)tFunc / 0x100;  /* Save high byte of task function address  */
	mov R24,R22
	mov R25,R23
	sbiw R24,1
	mov R2,R24
	mov R3,R25
	mov R22,R2
	mov R23,R3
	mov R16,R20
	mov R17,R21
	rcall lpm16
	mov R4,R16
	mov R5,R17
	mov R4,R5
	clr R5
	mov R30,R2
	mov R31,R3
	std z+0,R4
	.dbline -2
	.dbline 42
; }
L3:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l prio 4 c
	.dbsym r tStk 22 pc
	.dbsym r tFunc 20 pfI
	.dbfunc s OSCtxSw _OSCtxSw fI
	.even
_OSCtxSw::
	.dbline -1
	.dbline 48
; 
; static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.
; 
; //context switch interrupt --- 软中断任务切换
; void OSCtxSw(void) 
; {
	.dbline 49
;     asm("PUSH R31\n"
	PUSH R31
	PUSH R30
	PUSH R29
	PUSH R28
	PUSH R27
	PUSH R26
	PUSH R0
	PUSH R1
	PUSH R2
	PUSH R3
	PUSH R4
	PUSH R5
	IN R31,0x3d
	STS _SaveSP,R31
	IN R31,0x3e
	STS _SaveSP+1,R31
	
	.dbline 70
;         "PUSH R30\n"
;         "PUSH R29\n"
;         "PUSH R28\n"
;         "PUSH R27\n"
;         "PUSH R26\n"
; 
;         "PUSH R0\n"
;         "PUSH R1\n"
;         "PUSH R2\n"
;         "PUSH R3\n"
;         "PUSH R4\n"
;         "PUSH R5\n"
; 
; 		"IN R31,0x3d\n"     //Save SPL
; 		"STS %SaveSP,R31\n"
; 		"IN R31,0x3e\n"     //Save SPH 
; 		"STS %SaveSP+1,R31\n"
; 	
; 	);
; 
; 	OSTCB[OS_TASK_CrtPrio].OSStkTop = SaveSP; //Save the current task top.
	lds R18,_OS_TASK_CrtPrio
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB
	ldi R25,>_OSTCB
	add R30,R24
	adc R31,R25
	lds R3,_SaveSP+1
	lds R2,_SaveSP
	std z+0,R2
	std z+1,R3
	.dbline 72
; 
; 	OS_TASK_CrtPrio=OS_TASK_HighPri;
	lds R2,_OS_TASK_HighPri
	sts _OS_TASK_CrtPrio,R2
	.dbline 75
; 
; // Load context from the stack
;     SaveSP = OSTCB[OS_TASK_CrtPrio].OSStkTop;	//load the high priority task task top.
	mov R18,R2
	clr R19
	ldi R16,5
	ldi R17,0
	rcall mpy16s
	mov R30,R16
	mov R31,R17
	ldi R24,<_OSTCB
	ldi R25,>_OSTCB
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	sts _SaveSP+1,R3
	sts _SaveSP,R2
	.dbline 77
; 
;     asm("CLI\n"						
	CLI
	LDS R31,_SaveSP
	OUT 0x3d,R31
	LDS R31,_SaveSP+1
	OUT 0x3e,R31
	SEI
	POP R5
	POP R4
	POP R3
	POP R2
	POP R1
	POP R0
	POP R26
	POP R27
	POP R28
	POP R29
	POP R30
	POP R31
	
	.dbline -2
	.dbline 98
; 	    "LDS R31,%SaveSP\n" 
; 	    "OUT 0x3d,R31\n"
; 		"LDS R31,%SaveSP+1\n" 
; 	    "OUT 0x3e,R31\n"
; 		"SEI\n"
; 		
;         "POP R5\n"
;         "POP R4\n"
;         "POP R3\n"
;         "POP R2\n"
;         "POP R1\n"
;         "POP R0\n"
; 		
; 	    "POP R26\n"
; 	    "POP R27\n"
;         "POP R28\n"
;         "POP R29\n"
;         "POP R30\n"
;         "POP R31\n"
; 	);
; }
L5:
	.dbline 0 ; func end
	ret
	.dbfunc s OSInitSP _OSInitSP fI
	.even
_OSInitSP::
	.dbline -1
	.dbline 101
; //Initial CPU SP for main() function stack.
; void OSInitSP(void)
; {
	.dbline 102
;     SaveSP = (INT16U)&TASK_main_PrioStk[MAX_STK_SIZE-1];	//load the high priority task task top.
	ldi R24,<_TASK_main_PrioStk+47
	ldi R25,>_TASK_main_PrioStk+47
	sts _SaveSP+1,R25
	sts _SaveSP,R24
	.dbline 103
;     asm("POP R0\n"
	POP R0
	POP R1
	LDS R31,_SaveSP
	OUT 0x3d,R31
	LDS R31,_SaveSP+1
	OUT 0x3e,R31
	PUSH R1
	PUSH R0
	
	.dbline -2
	.dbline 112
; 	    "POP R1\n"
; 	    "LDS R31,%SaveSP\n" 
; 	    "OUT 0x3d,R31\n"
; 		"LDS R31,%SaveSP+1\n" 
; 	    "OUT 0x3e,R31\n"
; 		"PUSH R1\n"
; 		"PUSH R0\n"
; 	);
; }
L6:
	.dbline 0 ; func end
	ret
	.dbfunc s OSTickISR _OSTickISR fI
	.even
_OSTickISR::
	rcall push_lset
	.dbline -1
	.dbline 116
; 
; //OS Time Tick Interrupt,OS 时钟节拍中断.
; void OSTickISR(void) 
; {
	.dbline 117
;     TCNT0  = T0_TCNT0;   // (256 - (T0_RELOAD & 0xff))
	ldi R24,122
	out 0x32,R24
	.dbline 118
; 	AppTickHook();     //Hook file for a time tick --- 用户每个时间节拍的钩子函数

⌨️ 快捷键说明

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