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

📄 os_core.lst

📁 给出一个简单操作系统在AVR中应用实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
   1               		.file	"OS_Core.c"
   2               		.arch at90s8515
   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:
  64               	.global	OSInit
  66               	OSInit:
   1:C:/WinAVR/minOS_WinAVR/OS_Core.c **** /*
   2:C:/WinAVR/minOS_WinAVR/OS_Core.c **** ***************************************************************************************************
   3:C:/WinAVR/minOS_WinAVR/OS_Core.c **** *                                      minOS 0.01v
   4:C:/WinAVR/minOS_WinAVR/OS_Core.c **** *                                The Real-Time OS Kernel
   5:C:/WinAVR/minOS_WinAVR/OS_Core.c **** *                                  All Rights Reserved
   6:C:/WinAVR/minOS_WinAVR/OS_Core.c **** * File : OS_Core.C
   7:C:/WinAVR/minOS_WinAVR/OS_Core.c **** * 作者 : 21icbbs网友 LM7556 ,2004年7月   by : LM7556 , China , 2004-2004 
   8:C:/WinAVR/minOS_WinAVR/OS_Core.c **** *
   9:C:/WinAVR/minOS_WinAVR/OS_Core.c **** ***************************************************************************************************
  10:C:/WinAVR/minOS_WinAVR/OS_Core.c **** */
  11:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 
  12:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 
  13:C:/WinAVR/minOS_WinAVR/OS_Core.c **** #define  OS_GLOBALS
  14:C:/WinAVR/minOS_WinAVR/OS_Core.c **** #include "OS_Includes.h"
  15:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 
  16:C:/WinAVR/minOS_WinAVR/OS_Core.c **** #define NULL 0
  17:C:/WinAVR/minOS_WinAVR/OS_Core.c **** // initialization OSTCB --- 初始化任务控制块.
  18:C:/WinAVR/minOS_WinAVR/OS_Core.c **** void OSInit(void) 
  19:C:/WinAVR/minOS_WinAVR/OS_Core.c **** {	INT8U i;
  68               	.LM1:
  69               	/* prologue: frame size=0 */
  70               	/* prologue end (size=0) */
  20:C:/WinAVR/minOS_WinAVR/OS_Core.c ****     OS_TCB *pOS_TCB;
  21:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	pOS_TCB=OSTCB;
  72               	.LM2:
  73 0000 E0E0      		ldi r30,lo8(OSTCB)
  74 0002 F0E0      		ldi r31,hi8(OSTCB)
  75 0004 9FEF      		ldi r25,lo8(-1)
  76 0006 84E0      		ldi r24,lo8(4)
  77               	.L5:
  22:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
  23:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	{
  24:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 		pOS_TCB->OSStkTop=(INT16U)NULL;
  79               	.LM3:
  80 0008 1082      		st Z,__zero_reg__
  81 000a 1182      		std Z+1,__zero_reg__
  25:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 		pOS_TCB->OSTaskStatus=no_TASK_Rdy;
  83               	.LM4:
  84 000c 9283      		std Z+2,r25
  26:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 		pOS_TCB->OSTimeDly=0;
  86               	.LM5:
  87 000e 1382      		std Z+3,__zero_reg__
  88 0010 1482      		std Z+4,__zero_reg__
  90               	.LM6:
  91 0012 8150      		subi r24,lo8(-(-1))
  92 0014 3596      		adiw r30,5
  93 0016 87FF      		sbrs r24,7
  94 0018 F7CF      		rjmp .L5
  95               	/* epilogue: frame size=0 */
  96 001a 0895      		ret
  97               	/* epilogue end (size=1) */
  98               	/* function OSInit size 14 (13) */
 103               	.global	OSStart
 105               	OSStart:
  27:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	}
  28:C:/WinAVR/minOS_WinAVR/OS_Core.c **** }
  29:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 
  30:C:/WinAVR/minOS_WinAVR/OS_Core.c **** //Start OS --- 启动OS
  31:C:/WinAVR/minOS_WinAVR/OS_Core.c **** void OSStart(void) 
  32:C:/WinAVR/minOS_WinAVR/OS_Core.c **** {
 107               	.LM7:
 108               	/* prologue: frame size=0 */
 109               	/* prologue end (size=0) */
  33:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	Init_OS_Timer();
 111               	.LM8:
 112 001c 00D0      		rcall InitOSTimer
  34:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	OS_TASK_CrtPrio=Task_main_Prio;
 114               	.LM9:
 115 001e 1092 0000 		sts OS_TASK_CrtPrio,__zero_reg__
  35:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	OS_TASK_HighPri=OS_TASK_CrtPrio;
 117               	.LM10:
 118 0022 1092 0000 		sts OS_TASK_HighPri,__zero_reg__
  36:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
 120               	.LM11:
 121 0026 8BEF      		ldi r24,lo8(-5)
 122 0028 8093 0000 		sts OSTCB+2,r24
  37:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	OS_INT_ENABLE();
  38:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	OS_TASK_INT();
 124               	.LM12:
 125 002c 00D0      		rcall OSCtxSw
 126               	/* epilogue: frame size=0 */
 127 002e 0895      		ret
 128               	/* epilogue end (size=1) */
 129               	/* function OSStart size 10 (9) */
 133               	OSPrioHighRdy:
  39:C:/WinAVR/minOS_WinAVR/OS_Core.c **** }
  40:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 
  41:C:/WinAVR/minOS_WinAVR/OS_Core.c **** //返回优先级最高的处于就绪态任务的优先级,否则返回no_TASK_Rdy。
  42:C:/WinAVR/minOS_WinAVR/OS_Core.c **** static INT8U OSPrioHighRdy(void) 
  43:C:/WinAVR/minOS_WinAVR/OS_Core.c **** { INT8U i;
 135               	.LM13:
 136               	/* prologue: frame size=0 */
 137               	/* prologue end (size=0) */
  44:C:/WinAVR/minOS_WinAVR/OS_Core.c ****     OS_TCB *pOS_TCB;
  45:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	pOS_TCB=OSTCB;
 139               	.LM14:
 140 0030 E0E0      		ldi r30,lo8(OSTCB)
 141 0032 F0E0      		ldi r31,hi8(OSTCB)
  46:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
 143               	.LM15:
 144 0034 A0E0      		ldi r26,lo8(0)
 145 0036 60E0      		ldi r22,lo8(0)
 146 0038 70E0      		ldi r23,hi8(0)
 147               	.L16:
  47:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	{
  48:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 		if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
 149               	.LM16:
 150 003a 20E0      		ldi r18,lo8(0)
 151 003c 30E0      		ldi r19,hi8(0)
 152 003e 8081      		ld r24,Z
 153 0040 9181      		ldd r25,Z+1
 154 0042 892B      		or r24,r25
 155 0044 11F0      		breq .L14
 156 0046 21E0      		ldi r18,lo8(1)
 157 0048 30E0      		ldi r19,hi8(1)
 158               	.L14:
 159 004a 40E0      		ldi r20,lo8(0)
 160 004c 50E0      		ldi r21,hi8(0)
 161 004e 8281      		ldd r24,Z+2
 162 0050 8C3F      		cpi r24,lo8(-4)
 163 0052 11F4      		brne .L15
 164 0054 41E0      		ldi r20,lo8(1)
 165 0056 50E0      		ldi r21,hi8(1)
 166               	.L15:
 167 0058 2423      		and r18,r20
 168 005a 3523      		and r19,r21
 169 005c 232B      		or r18,r19
 170 005e 19F0      		breq .L12
 171 0060 972F      		mov r25,r23
 172 0062 862F      		mov r24,r22
 173 0064 0895      		ret
 174               	.L12:
 176               	.LM17:
 177 0066 AF5F      		subi r26,lo8(-(1))
 178 0068 6F5F      		subi r22,lo8(-(1))
 179 006a 7F4F      		sbci r23,hi8(-(1))
 180 006c 3596      		adiw r30,5
 181 006e A530      		cpi r26,lo8(5)
 182 0070 20F3      		brlo .L16
  49:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	}
  50:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	return no_TASK_Rdy;
 184               	.LM18:
 185 0072 8FEF      		ldi r24,lo8(255)
 186 0074 90E0      		ldi r25,hi8(255)
  51:C:/WinAVR/minOS_WinAVR/OS_Core.c **** }
 188               	.LM19:
 189 0076 0895      		ret
 190               	/* epilogue: frame size=0 */
 191 0078 0895      		ret
 192               	/* epilogue end (size=1) */
 193               	/* function OSPrioHighRdy size 37 (36) */
 198               	.global	OSTimeTick
 200               	OSTimeTick:
  52:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 
  53:C:/WinAVR/minOS_WinAVR/OS_Core.c **** //Task OSTimeDly Decrease 1 per Time Tick --- 每个时钟节拍,任务等待延时的时间OSTimeDly减1.
  54:C:/WinAVR/minOS_WinAVR/OS_Core.c **** //如果任务的OSTimeDly减到0,把任务设置为准备就绪OS_TASK_Rdy。
  55:C:/WinAVR/minOS_WinAVR/OS_Core.c **** void OSTimeTick(void) 
  56:C:/WinAVR/minOS_WinAVR/OS_Core.c **** { INT8U i;
 202               	.LM20:
 203               	/* prologue: frame size=0 */
 204               	/* prologue end (size=0) */
  57:C:/WinAVR/minOS_WinAVR/OS_Core.c ****     OS_TCB *pOS_TCB;
  58:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	pOS_TCB=OSTCB;
 206               	.LM21:
 207 007a E0E0      		ldi r30,lo8(OSTCB)
 208 007c F0E0      		ldi r31,hi8(OSTCB)
 209 007e 3CEF      		ldi r19,lo8(-4)
 210 0080 24E0      		ldi r18,lo8(4)
 211               	.L25:
  59:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
  60:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	{
  61:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 		if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut) 
 213               	.LM22:
 214 0082 8381      		ldd r24,Z+3
 215 0084 9481      		ldd r25,Z+4
 216 0086 0097      		sbiw r24,0
 217 0088 31F0      		breq .L22
  62:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 		{
  63:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 			if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
 219               	.LM23:
 220 008a 0197      		sbiw r24,1
 221 008c 8383      		std Z+3,r24
 222 008e 9483      		std Z+4,r25
 223 0090 892B      		or r24,r25
 224 0092 09F4      		brne .L22
 225 0094 3283      		std Z+2,r19
 226               	.L22:
 228               	.LM24:
 229 0096 2150      		subi r18,lo8(-(-1))
 230 0098 3596      		adiw r30,5
 231 009a 27FF      		sbrs r18,7
 232 009c F2CF      		rjmp .L25
  64:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 		}
  65:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	}
  66:C:/WinAVR/minOS_WinAVR/OS_Core.c **** 	OS_TASK_HighPri=OSPrioHighRdy();
 234               	.LM25:
 235 009e C8DF      		rcall OSPrioHighRdy

⌨️ 快捷键说明

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