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

📄 os_cpu_a.lst

📁 一个基于MEGA16的GUI
💻 LST
📖 第 1 页 / 共 2 页
字号:
   1               		.file	"OS_CPU_A.c"
   2               		.arch atmega16
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
 125               	.global	OSIntCtxSw
 127               	OSIntCtxSw:
   1:OS_CPU_A.c    **** /**************************************************************************************************
   2:OS_CPU_A.c    **** **-------------------------------------------------------------------------------------------------
   3:OS_CPU_A.c    **** ***************************************************************************************************
   4:OS_CPU_A.c    **** #define _OS_CPU_A_C
   5:OS_CPU_A.c    **** #include "CONFIG.H"
   6:OS_CPU_A.c    **** 
   7:OS_CPU_A.c    **** extern void * OSTaskStackBottom[OS_MAX_TASKS + 2];	
   8:OS_CPU_A.c    **** void LoadCtx(void);
   9:OS_CPU_A.c    **** void C_CtxSw(void);
  10:OS_CPU_A.c    **** void LinkCtxSw(void);
  11:OS_CPU_A.c    **** 
  12:OS_CPU_A.c    **** 
  13:OS_CPU_A.c    ****  		void OSIntCtxSw(void)
  14:OS_CPU_A.c    **** {
 129               	.LM1:
 130               	/* prologue: frame size=0 */
 131               	/* prologue end (size=0) */
  15:OS_CPU_A.c    **** 	uint8 * cp ;
  16:OS_CPU_A.c    **** 	
  17:OS_CPU_A.c    **** 	SP += 4;								/*  释放两层函数调用所使用的堆栈  					    */
 133               	.LM2:
 134 0000 8DB7      		in r24,93-0x20
 135 0002 9EB7      		in r25,(93)+1-0x20
 136 0004 0496      		adiw r24,4
 137 0006 9EBF      		out (93)+1-0x20,r25
 138 0008 8DBF      		out 93-0x20,r24
  18:OS_CPU_A.c    **** 
  19:OS_CPU_A.c    ****    	if(OSTaskID == OS_MAX_TASKS)
 140               	.LM3:
 141 000a 8091 0000 		lds r24,OSTaskID
 142 000e 8430      		cpi r24,lo8(4)
 143 0010 31F4      		brne .L2
  20:OS_CPU_A.c    **** 	{
  21:OS_CPU_A.c    **** 		SP += 15;
 145               	.LM4:
 146 0012 8DB7      		in r24,93-0x20
 147 0014 9EB7      		in r25,(93)+1-0x20
 148 0016 0F96      		adiw r24,15
 149 0018 9EBF      		out (93)+1-0x20,r25
 150 001a 8DBF      		out 93-0x20,r24
 151 001c 12C0      		rjmp .L3
 152               	.L2:
  22:OS_CPU_A.c    **** 	}
  23:OS_CPU_A.c    **** 	else
  24:OS_CPU_A.c    **** 	{
  25:OS_CPU_A.c    **** 		ExtraPush();						/*	第二部分寄存器堆入栈							    */
 154               	.LM5:
 155               	/* #APP */
 156 001e 2F92      		PUSH R2
 157 0020 3F92      		PUSH R3
 158 0022 4F92      		PUSH R4
 159 0024 5F92      		PUSH R5
 160 0026 6F92      		PUSH R6
 161 0028 7F92      		PUSH R7
 162 002a 8F92      		PUSH R8
 163 002c 9F92      		PUSH R9
 164 002e AF92      		PUSH R10
 165 0030 BF92      		PUSH R11
 166 0032 CF92      		PUSH R12
 167 0034 DF92      		PUSH R13
 168 0036 EF92      		PUSH R14
 169 0038 FF92      		PUSH R15
 170 003a 0F93      		PUSH R16
 171 003c 1F93      		PUSH R17
 172 003e CF93      		PUSH R28
 173 0040 DF93      		PUSH R29
 174               		
 175               	/* #NOAPP */
 176               	.L3:
  26:OS_CPU_A.c    **** 	}
  27:OS_CPU_A.c    **** 
  28:OS_CPU_A.c    **** 	cp = (uint8 *)SP;   
 178               	.LM6:
 179 0042 EDB7      		in r30,93-0x20
 180 0044 FEB7      		in r31,(93)+1-0x20
  29:OS_CPU_A.c    **** 	*cp-- = Os_Enter_Sum ;				    /*  保存关中断计数器								    */
 182               	.LM7:
 183 0046 8091 0000 		lds r24,Os_Enter_Sum
 184 004a 8083      		st Z,r24
  30:OS_CPU_A.c    **** 	*cp-- = (uint8)(uint16)LinkCtxSw;
 186               	.LM8:
 187 004c 80E0      		ldi r24,lo8(pm(LinkCtxSw))
 188 004e 90E0      		ldi r25,hi8(pm(LinkCtxSw))
 189 0050 8293      		st -Z,r24
  31:OS_CPU_A.c    **** 	*cp-- = (uint8)((uint16)LinkCtxSw/256);
 191               	.LM9:
 192 0052 892F      		mov r24,r25
 193 0054 9927      		clr r25
 194 0056 8293      		st -Z,r24
 195 0058 3197      		sbiw r30,1
  32:OS_CPU_A.c    **** 	SP = (uint16)cp;
 197               	.LM10:
 198 005a FEBF      		out (93)+1-0x20,r31
 199 005c EDBF      		out 93-0x20,r30
  33:OS_CPU_A.c    **** 	__asm__ __volatile__("reti");		    /*  模拟中断返回									    */
 201               	.LM11:
 202               	/* #APP */
 203 005e 1895      		reti
 204               	/* #NOAPP */
 205               	/* epilogue: frame size=0 */
 206 0060 0895      		ret
 207               	/* epilogue end (size=1) */
 208               	/* function OSIntCtxSw size 70 (69) */
 213               	.Lscope0:
 215               	.global	LoadCtx
 217               	LoadCtx:
  34:OS_CPU_A.c    **** }
  35:OS_CPU_A.c    **** 		void LinkCtxSw(void)
  36:OS_CPU_A.c    **** {
  37:OS_CPU_A.c    **** 	cli();					  			    /*  为了在执行RETI指令后立即执行CLI指令而构造的特殊函数	 */
  38:OS_CPU_A.c    **** 	C_CtxSw();	
  39:OS_CPU_A.c    **** }
  40:OS_CPU_A.c    **** 
  41:OS_CPU_A.c    **** 		void OSCtxSw(void)
  42:OS_CPU_A.c    **** {
  43:OS_CPU_A.c    **** 	uint8 * cp;
  44:OS_CPU_A.c    **** 
  45:OS_CPU_A.c    **** 	PUSHALL();							   /*  全部寄存器堆入栈  */
  46:OS_CPU_A.c    **** 
  47:OS_CPU_A.c    ****  	cp = (uint8 *)SP;
  48:OS_CPU_A.c    **** 	*cp-- = Os_Enter_Sum ;
  49:OS_CPU_A.c    **** 	SP = (uint16)cp ;
  50:OS_CPU_A.c    **** 
  51:OS_CPU_A.c    **** 	C_CtxSw();
  52:OS_CPU_A.c    **** }
  53:OS_CPU_A.c    **** 
  54:OS_CPU_A.c    **** 
  55:OS_CPU_A.c    **** 		void C_CtxSw(void)
  56:OS_CPU_A.c    **** {
  57:OS_CPU_A.c    **** 	uint8 * cp1;
  58:OS_CPU_A.c    **** 	uint8 * cp2;
  59:OS_CPU_A.c    **** 	uint8 * cpt;
  60:OS_CPU_A.c    **** 	uint8 i ;
  61:OS_CPU_A.c    **** 
  62:OS_CPU_A.c    **** 	SP += 4;
  63:OS_CPU_A.c    **** 											/*  动态堆栈移动前准备 								*/
  64:OS_CPU_A.c    **** 	cp1 = (uint8 *)SP ;
  65:OS_CPU_A.c    **** 	cp2 = (uint8 *)OSTaskStackBottom[OSTaskID+1] ;
  66:OS_CPU_A.c    **** 	cpt = (uint8 *)OSTaskStackBottom[OSNextTaskID+1] ;
  67:OS_CPU_A.c    **** 
  68:OS_CPU_A.c    **** 	if(OSNextTaskID>OSTaskID)
  69:OS_CPU_A.c    **** 	{
  70:OS_CPU_A.c    **** 	   while(cp2 != cpt)				    /*   堆栈移动									    */
  71:OS_CPU_A.c    **** 	   {
  72:OS_CPU_A.c    **** 	   		*cp1-- = *cp2-- ;
  73:OS_CPU_A.c    **** 	   }
  74:OS_CPU_A.c    **** 											/*   修改SP,堆栈控制块  */
  75:OS_CPU_A.c    **** 	   OSTaskID++;
  76:OS_CPU_A.c    **** 	   OSNextTaskID++;
  77:OS_CPU_A.c    **** 	   cpt = (uint8 *)SP - (uint16)(OSTaskStackBottom[OSTaskID]) ;
  78:OS_CPU_A.c    **** 	   SP = (uint16)cp1 ;
  79:OS_CPU_A.c    **** 	   for(i = OSTaskID;i < OSNextTaskID; i++)
  80:OS_CPU_A.c    ****        {
  81:OS_CPU_A.c    **** 			cp1 = (uint8*)OSTaskStackBottom[i];
  82:OS_CPU_A.c    **** 			cp1 += (uint16)cpt;
  83:OS_CPU_A.c    **** 			OSTaskStackBottom[i] = (void*)cp1 ;
  84:OS_CPU_A.c    ****        }
  85:OS_CPU_A.c    **** 	   OSNextTaskID--;
  86:OS_CPU_A.c    **** 	   OSTaskID = OSNextTaskID ;	   
  87:OS_CPU_A.c    **** 	}
  88:OS_CPU_A.c    **** 	else if(OSNextTaskID<OSTaskID)
  89:OS_CPU_A.c    **** 	{
  90:OS_CPU_A.c    **** 		while(cp1 != cpt)
  91:OS_CPU_A.c    **** 		{
  92:OS_CPU_A.c    **** 			*(++cp2) = *(++cp1) ;
  93:OS_CPU_A.c    **** 		}
  94:OS_CPU_A.c    **** 
  95:OS_CPU_A.c    **** 		OSTaskID++;
  96:OS_CPU_A.c    **** 	   	OSNextTaskID++;
  97:OS_CPU_A.c    **** 	   	cpt = (uint8 *)SP - (uint16)OSTaskStackBottom[OSTaskID] ;
  98:OS_CPU_A.c    **** 		SP = (uint16)OSTaskStackBottom[OSNextTaskID] ;
  99:OS_CPU_A.c    **** 		for(i = OSNextTaskID;i < OSTaskID; i++)
 100:OS_CPU_A.c    ****         {
 101:OS_CPU_A.c    **** 			cp1 = (uint8*)OSTaskStackBottom[i];
 102:OS_CPU_A.c    **** 			cp1 -= (uint16)cpt;
 103:OS_CPU_A.c    ****             OSTaskStackBottom[i] = (void*)cp1;
 104:OS_CPU_A.c    ****         }
 105:OS_CPU_A.c    **** 		OSNextTaskID--;
 106:OS_CPU_A.c    ****         OSTaskID = OSNextTaskID;        
 107:OS_CPU_A.c    **** 	}
 108:OS_CPU_A.c    **** 
 109:OS_CPU_A.c    **** 	LoadCtx();
 110:OS_CPU_A.c    **** }
 111:OS_CPU_A.c    **** 
 112:OS_CPU_A.c    **** 		void LoadCtx(void)
 113:OS_CPU_A.c    **** {
 219               	.LM12:
 220               	/* prologue: frame size=0 */
 221               	/* prologue end (size=0) */
 114:OS_CPU_A.c    **** 	uint8 * cp;
 115:OS_CPU_A.c    **** 
 116:OS_CPU_A.c    **** 	SP += 2 ;
 223               	.LM13:
 224 0062 8DB7      		in r24,93-0x20
 225 0064 9EB7      		in r25,(93)+1-0x20
 226 0066 0296      		adiw r24,2
 227 0068 9EBF      		out (93)+1-0x20,r25
 228 006a 8DBF      		out 93-0x20,r24
 117:OS_CPU_A.c    **** 	cp = (uint8 *)SP;
 230               	.LM14:
 231 006c EDB7      		in r30,93-0x20
 232 006e FEB7      		in r31,(93)+1-0x20
 118:OS_CPU_A.c    **** 	Os_Enter_Sum = *(++cp);								/*  恢复关中断计数器							*/
 234               	.LM15:
 235 0070 3196      		adiw r30,1
 236 0072 9081      		ld r25,Z
 237 0074 9093 0000 		sts Os_Enter_Sum,r25
 119:OS_CPU_A.c    **** 	SP = (uint16)cp;
 239               	.LM16:
 240 0078 FEBF      		out (93)+1-0x20,r31
 241 007a EDBF      		out 93-0x20,r30
 120:OS_CPU_A.c    **** 
 121:OS_CPU_A.c    **** 	if(OSTaskID != OS_MAX_TASKS)
 243               	.LM17:
 244 007c 8091 0000 		lds r24,OSTaskID
 245 0080 8430      		cpi r24,lo8(4)
 246 0082 09F4      		brne .+2
 247 0084 22C0      		rjmp .L5
 122:OS_CPU_A.c    **** 	{
 123:OS_CPU_A.c    **** 		POPALL();   									/*  全部寄存器堆出栈						  	*/
 249               	.LM18:
 250               	/* #APP */
 251 0086 DF91      		POP R29
 252 0088 CF91      		POP R28
 253 008a 1F91      		POP R17
 254 008c 0F91      		POP R16
 255 008e FF90      		POP R15
 256 0090 EF90      		POP R14
 257 0092 DF90      		POP R13
 258 0094 CF90      		POP R12
 259 0096 BF90      		POP R11
 260 0098 AF90      		POP R10
 261 009a 9F90      		POP R9
 262 009c 8F90      		POP R8
 263 009e 7F90      		POP R7
 264 00a0 6F90      		POP R6
 265 00a2 5F90      		POP R5
 266 00a4 4F90      		POP R4
 267 00a6 3F90      		POP R3
 268 00a8 2F90      		POP R2
 269 00aa FF91      		POP R31
 270 00ac EF91      		POP R30
 271 00ae BF91      		POP R27
 272 00b0 AF91      		POP R26
 273 00b2 9F91      		POP R25
 274 00b4 8F91      		POP R24
 275 00b6 7F91      		POP R23
 276 00b8 6F91      		POP R22
 277 00ba 5F91      		POP R21
 278 00bc 4F91      		POP R20
 279 00be 3F91      		POP R19
 280 00c0 2F91      		POP R18
 281 00c2 0F90      		POP R0
 282 00c4 0FBE      		OUT 0x3F,R0
 283 00c6 0F90      		POP R0
 284 00c8 1F90      		POP R1
 285               		
 286               	/* #NOAPP */
 287               	.L5:
 124:OS_CPU_A.c    **** 	}
 125:OS_CPU_A.c    **** 
 126:OS_CPU_A.c    **** 	if(Os_Enter_Sum==0)
 289               	.LM19:
 290 00ca 9923      		tst r25
 291 00cc 09F4      		brne .L6
 127:OS_CPU_A.c    **** 	{
 128:OS_CPU_A.c    **** 		sei();
 293               	.LM20:
 294               	/* #APP */
 295 00ce 7894      		sei
 296               	/* #NOAPP */
 297               	.L6:
 129:OS_CPU_A.c    **** 	}
 130:OS_CPU_A.c    **** 	__asm__ __volatile__("ret");
 299               	.LM21:
 300               	/* #APP */

⌨️ 快捷键说明

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