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

📄 sosos.lst

📁 基于AVR平台的RTOS
💻 LST
📖 第 1 页 / 共 5 页
字号:
   1               		.file	"sosos.c"
   2               		.arch atmega8
   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:
  85               	.global	SososInitIntSp
  87               	SososInitIntSp:
   1:sosos.c       **** /*=========================================================================================
   2:sosos.c       **** 项目名称: 小型开源实时操作系统
   3:sosos.c       **** 软件版本: VER 1.0
   4:sosos.c       **** 目标平台: AVR系列单片机
   5:sosos.c       **** 工具链  : AVR-GCC(V4.1.2) WINAVR-20070525
   6:sosos.c       **** 开发人员: 韩骁
   7:sosos.c       **** 开发时间: 2007-07-05
   8:sosos.c       **** 版权    : GPL(GNU General Public License)
   9:sosos.c       **** 文件名称: sosos.c
  10:sosos.c       **** 文件说明:
  11:sosos.c       **** 小型开源实时操作系统的主c文件
  12:sosos.c       **** 本次测试采用ARMEL公司的MEGA8进行
  13:sosos.c       **** =========================================================================================*/
  14:sosos.c       **** #include <avr/io.h>
  15:sosos.c       **** #include <avr/wdt.h>
  16:sosos.c       **** #include <avr/interrupt.h>
  17:sosos.c       **** 
  18:sosos.c       **** #include "MYBIT.H"
  19:sosos.c       **** #include "sosos.h"
  20:sosos.c       **** 
  21:sosos.c       **** #if SOSOS_TASK_ENALBE == 1
  22:sosos.c       **** void SososInitIntSp(void) __attribute__ ((constructor));//定义中断嵌套堆栈指针
  23:sosos.c       **** void SososInitIntSp(void)
  24:sosos.c       **** //本函数在main()之前运行,将系统堆栈指针保存在r15:r14中
  25:sosos.c       **** {
  88               	(size=0) */
  90               	.LM1:
  91               	/* #APP */
  26:sosos.c       ****   __asm__ __volatile__("PUSH r16 \n\t");
  92               	H r16 
  93               		
  95 0000 0F93      	.LM2:
  96               		IN r14 ,__SP_L__ 
  27:sosos.c       ****   __asm__ __volatile__("IN r14 ,__SP_L__ \n\t");
  97               	tabn	68,0,28,.LM3-SososInitIntSp
  98               	.LM3:
  99 0002 EDB6      		LDI r16 ,3 
 100               		
  28:sosos.c       ****   __asm__ __volatile__("LDI r16 ,3 \n\t");
 101               	abn	68,0,29,.LM4-SososInitIntSp
 102               	.LM4:
 103 0004 03E0      		ADD r14 ,r16 
 104               		
  29:sosos.c       ****   __asm__ __volatile__("ADD r14 ,r16 \n\t");
 105               	abn	68,0,30,.LM5-SososInitIntSp
 106               	.LM5:
 107 0006 E00E      		IN r15 ,__SP_H__ 
 108               		
  30:sosos.c       ****   __asm__ __volatile__("IN r15 ,__SP_H__ \n\t");
 109               	abn	68,0,31,.LM6-SososInitIntSp
 110               	.LM6:
 111 0008 FEB6      		CLR r16 
 112               		
  31:sosos.c       ****   __asm__ __volatile__("CLR r16 \n\t");
 113               	abn	68,0,32,.LM7-SososInitIntSp
 114               	.LM7:
 115 000a 0027      		ADC r15 ,r16 
 116               		
  32:sosos.c       ****   __asm__ __volatile__("ADC r15 ,r16 \n\t");
 117               	abn	68,0,33,.LM8-SososInitIntSp
 118               	.LM8:
 119 000c F01E      		POP r16 
 120               		
  33:sosos.c       ****   __asm__ __volatile__("POP r16 \n\t");
 121               	NOAPP */
 122               	/* epilogue: frame size=0 */
 123 000e 0F91      		ret
 124               	/* epilogue end (size=1) */
 125               	/* function SososInitIntSp size 33 (32) */
 127 0010 0895      	.Lscope0:
 128               		.global __do_global_ctors
 129               		.section .ctors,"a",@progbits
 130               		.word	gs(SososInitIntSp)
 131               		.text
 135               	.global	SOSOS_TASK_STACK_CASE
 137               	SOSOS_TASK_STACK_CASE:
 139               	.LM9:
 140               	/* prologue: frame size=0 */
 141               	/* prologue end (size=0) */
  34:sosos.c       **** }
  35:sosos.c       **** #endif
  36:sosos.c       **** 
  37:sosos.c       **** #if STACK_SIZE_REPORT_ENABLE == 1
  38:sosos.c       **** unsigned int SOSOS_TASK_STACK_CASE(unsigned char pri,unsigned char id)//堆栈情况报告
  39:sosos.c       **** //本函数用于返回指定任务的堆栈占用情况,单位:字节
  40:sosos.c       **** //pri和id是要报告的任务优先级和ID
  41:sosos.c       **** {
 142               	-SOSOS_TASK_STACK_CASE
 143               	.LM10:
 144               		mov r30,r24
 145               		clr r31
  42:sosos.c       ****  unsigned int i;
  43:sosos.c       **** 
  44:sosos.c       ****  for(i=(TCB[pri*SOSOS_MAX_TASK_PER_PRI+id].TASK_STACK_BUTTON-TCB[pri*SOSOS_MAX_TASK_PER_PRI+id].TAS
 146               	 r30
 147               		rol r31
 148 0012 E82F      		add r30,r22
 149 0014 FF27      		adc r31,__zero_reg__
 150 0016 EE0F      		movw r24,r30
 151 0018 FF1F      		ldi r19,3
 152 001a E60F      	1:	lsl r24
 153 001c F11D      		rol r25
 154 001e CF01      		dec r19
 155 0020 33E0      		brne 1b
 156 0022 880F      		lsl r30
 157 0024 991F      		rol r31
 158 0026 3A95      		add r30,r24
 159 0028 01F4      		adc r31,r25
 160 002a EE0F      		subi r30,lo8(-(TCB))
 161 002c FF1F      		sbci r31,hi8(-(TCB))
 162 002e E80F      		ldd r18,Z+2
 163 0030 F91F      		ldd r19,Z+3
 164 0032 E050      		ldd r24,Z+4
 165 0034 F040      		ldd r25,Z+5
 166 0036 2281      		movw r30,r18
 167 0038 3381      		sub r30,r24
 168 003a 8481      		sbc r31,r25
 169 003c 9581      		rjmp .L9
 170 003e F901      	.L5:
 172 0042 F90B      	.LM11:
 173 0044 00C0      		ld r24,Z
 174               		cpi r24,lo8(-86)
  45:sosos.c       ****    if(*((unsigned char *)i)!=INIT_STACK_FILL_BYTES)
 175               	4,.LM12-SOSOS_TASK_STACK_CASE
 176               	.LM12:
 177 0046 8081      		adiw r30,1
 178 0048 8A3A      		cp r30,r18
 179 004a 01F4      		cpc r31,r19
 180               		brlo .L5
 181               	.L6:
 182               		sub r18,r30
 183 004c 3196      		sbc r19,r31
 185 0050 F307      	.LM13:
 186 0052 00F0      		movw r24,r18
 187               		sbiw r24,1
 188 0054 2E1B      	/* epilogue: frame size=0 */
 189 0056 3F0B      		ret
  46:sosos.c       ****      break;
  47:sosos.c       ****    }
  48:sosos.c       **** 
  49:sosos.c       ****  i=TCB[pri*SOSOS_MAX_TASK_PER_PRI+id].TASK_STACK_BUTTON-1-i;
  50:sosos.c       **** 
  51:sosos.c       ****  return i;
  52:sosos.c       **** }
 190               	 (size=1) */
 191               	/* function SOSOS_TASK_STACK_CASE size 38 (37) */
 196               	.Lscope1:
 198               	.global	SososInitOs
 200               	SososInitOs:
 202               	.LM14:
 203               	/* prologue: frame size=0 */
 204               	/* prologue end (size=0) */
 206               	.LM15:
  53:sosos.c       **** #endif
  54:sosos.c       **** 
  55:sosos.c       **** #if SOSOS_TASK_ENALBE == 1
  56:sosos.c       **** void SososInitOs(void)//初始化SOSOS系统
  57:sosos.c       **** //本函数用于初始化SOSOS系统,应在调用任何系统函数前调用一次
  58:sosos.c       **** {
 207               	8,0,63,.LM16-SososInitOs
 208               	.LM16:
 209               		clr r8
  59:sosos.c       **** #if ERROR_DETECT_ENABLE == 1
  60:sosos.c       ****  unsigned char i;
  61:sosos.c       **** 
  62:sosos.c       ****  SOSOS_WAIT_TASK=0;
 211               	7:
 212               		clr r13
  63:sosos.c       ****  SOSOS_TIMESLICE=0;
 214               	18:
 215               		clr r7
  64:sosos.c       ****  SOSOS_INT_NEST=0;
 217               	19:
 218               		ldi r17,lo8(0)
  65:sosos.c       ****  SOSOS_TICKS=0;
 220               	20:
 221               		sts (SOSOS_MUTEX_POINT)+1,__zero_reg__
 222 0064 7724      		sts SOSOS_MUTEX_POINT,__zero_reg__
  66:sosos.c       ****  SOSOS_STATE=0;
 223               	tabn	68,0,72,.LM21-SososInitOs
 224               	.LM21:
 225 0066 10E0      		sts SOSOS_TASK_READY,__zero_reg__
  67:sosos.c       **** #if SOSOS_MUTEX_ENABLE == 1
  68:sosos.c       ****  SOSOS_MUTEX_POINT=0;
 226               	s SOSOS_TASK_READY+1,__zero_reg__
 227               		sts SOSOS_TASK_READY+2,__zero_reg__
 229 006c 1092 0000 	.LM22:
  69:sosos.c       **** #endif
  70:sosos.c       ****  
  71:sosos.c       ****  for(i=0;i<SOSOS_PRI_MAX;i++){
  72:sosos.c       ****    SOSOS_TASK_READY[i]=0;
 230               	 (TCB)+1,__zero_reg__
 231               		sts TCB,__zero_reg__
 232 0070 1092 0000 		sts (TCB+10)+1,__zero_reg__
 233 0074 1092 0000 		sts TCB+10,__zero_reg__
 234 0078 1092 0000 		sts (TCB+20)+1,__zero_reg__
  73:sosos.c       ****    }
  74:sosos.c       ****  for(i=0;i<SOSOS_PRI_MAX*SOSOS_MAX_TASK_PER_PRI;i++){
  75:sosos.c       ****    TCB[i].TASK_STACK_POINT=0;
 235               	TCB+20,__zero_reg__
 236               		sts (TCB+30)+1,__zero_reg__
 237 007c 1092 0000 		sts TCB+30,__zero_reg__
 238 0080 1092 0000 		sts (TCB+40)+1,__zero_reg__
 239 0084 1092 0000 		sts TCB+40,__zero_reg__
 240 0088 1092 0000 		sts (TCB+50)+1,__zero_reg__
 241 008c 1092 0000 		sts TCB+50,__zero_reg__
 242 0090 1092 0000 		ldi r30,lo8(SOSOS_TASK_STACK)
 243 0094 1092 0000 		ldi r31,hi8(SOSOS_TASK_STACK)
 244 0098 1092 0000 		ldi r24,lo8(-86)
 245 009c 1092 0000 	.L11:
 247 00a4 1092 0000 	.LM23:
 248 00a8 1092 0000 		st Z+,r24
 250 00ae F0E0      	.LM24:
 251 00b0 8AEA      		ldi r25,hi8(SOSOS_TASK_STACK+200)
 252               		cpi r30,lo8(SOSOS_TASK_STACK+200)
  76:sosos.c       ****    }
  77:sosos.c       **** #endif
  78:sosos.c       **** #if STACK_SIZE_REPORT_ENABLE == 1
  79:sosos.c       **** unsigned int fill;
  80:sosos.c       ****  for(fill=0;fill<SOSOS_TASK_STACK_SIZE;fill++)
  81:sosos.c       ****    SOSOS_TASK_STACK[fill]=INIT_STACK_FILL_BYTES;
 253               	 .L11
 255 00b2 8193      	.LM25:
 256               		sbiw r30,1
 257               		sts (SOSOS_TASK_STACK_TOP)+1,r31
 258 00b4 90E0      		sts SOSOS_TASK_STACK_TOP,r30
 259 00b6 E030      	/* epilogue: frame size=0 */
 260 00b8 F907      		ret
 261 00ba 01F4      	/* epilogue end (size=1) */
  82:sosos.c       **** #endif
  83:sosos.c       ****  SOSOS_TASK_STACK_TOP=(SOSOS_ADDRESS)SOSOS_TASK_STACK+SOSOS_TASK_STACK_SIZE-1;
 262               	on SososInitOs size 53 (52) */
 264 00bc 3197      	.Lscope2:
 266 00c2 E093 0000 	.global	SososTimer0
 268 00c6 0895      	SososTimer0:
 270               	.LM26:
 271               	/* prologue: frame size=6 */
 272               		push r16
 273               		push r28
 274               		push r29
 275               		in r28,__SP_L__
 276               		in r29,__SP_H__
  84:sosos.c       **** }
  85:sosos.c       **** #endif
  86:sosos.c       **** 
  87:sosos.c       **** #if SOSOS_TASK_ENALBE == 1
  88:sosos.c       **** void SososTimer0(void)//延时和超时处理
  89:sosos.c       **** //本函数在定时器0的中断函数中调用,调用时中断时开着的
  90:sosos.c       **** //用于出来处理时间片轮换和所有的延时操作
  91:sosos.c       **** {
 277               	 __tmp_reg__,__SREG__
 278               		cli
 279               		out __SP_H__,r29
 280 00c8 0F93      		out __SREG__,__tmp_reg__
 281 00ca CF93      		out __SP_L__,r28
 282 00cc DF93      	/* prologue end (size=11) */
 284 00d0 DEB7      	.LM27:
 285 00d2 2697      	/* #APP */
 286 00d4 0FB6      		CLI 
 287 00d6 F894      		
 288 00d8 DEBF      	/* #NOAPP */
 289 00da 0FBE      		mov r18,r9
 291               	.LM28:
  92:sosos.c       ****  unsigned char i,j,tmpi,tmpj;
  93:sosos.c       ****  SOSOS_TCB *point;
  94:sosos.c       **** //超时处理
  95:sosos.c       ****  point=TCB;
  96:sosos.c       ****  tmpi=1;
  97:sosos.c       ****  DISABLE_INTERRUPT();
 292               	i r19,lo8(1)
 293               		ldi r20,lo8(TCB)
 294               		ldi r21,hi8(TCB)
 295 00de F894      		ldi r22,lo8(0)
 296               		ldi r23,hi8(0)
 297               		ldi r24,lo8(SOSOS_TASK_READY)
 298 00e0 292D      		ldi r25,hi8(SOSOS_TASK_READY)
  98:sosos.c       ****  for(i=0;i<SOSOS_PRI_MAX;i++){
  99:sosos.c       ****    if((SOSOS_WAIT_TASK&tmpi)==0){
 100:sosos.c       ****      point=point+SOSOS_MAX_TASK_PER_PRI;//指向下一优先级
 101:sosos.c       ****      tmpi=tmpi<<1;
 102:sosos.c       ****      continue;
 103:sosos.c       ****      }
 104:sosos.c       ****    tmpj=1;
 105:sosos.c       ****    SOSOS_WAIT_TASK=SOSOS_WAIT_TASK&(~tmpi);
 106:sosos.c       ****    for(j=0;j<SOSOS_MAX_TASK_PER_PRI;j++){
 107:sosos.c       ****      if((point->TASK_STATE>=TASK_STATE_DELAY)&&(point->TASK_STATE<TASK_STATE_SEM_TIMEOUT)){
 108:sosos.c       ****        if(point->TASK_TIMEOUT>0){
 109:sosos.c       ****          point->TASK_TIMEOUT--;
 110:sosos.c       ****          if(point->TASK_TIMEOUT==0){
 111:sosos.c       ****            SOSOS_TASK_READY[i]=SOSOS_TASK_READY[i]|tmpj;
 112:sosos.c       ****            if(point->TASK_STATE>TASK_STATE_DELAY)
 113:sosos.c       ****              point->TASK_STATE=point->TASK_STATE+TASK_STATE_TIMEOUT_OFFSET;
 114:sosos.c       ****            else
 115:sosos.c       ****              point->TASK_STATE=TASK_STATE_OK;
 116:sosos.c       **** #if SOSOS_MUTEX_ENABLE == 1
 117:sosos.c       ****            if(SOSOS_RUNNING_INHERIT_PRI>i){
 299               	6,r25
 300               		std Y+5,r24
 301 00e2 062D      	.L17:
 303 00e6 40E0      	.LM29:
 304 00e8 50E0      		mov r24,r18
 305 00ea 60E0      		and r24,r19
 306 00ec 70E0      		breq .L31
 308 00f0 90E0      	.LM30:
 309 00f2 9E83      		mov r24,r19
 310 00f4 8D83      		com r24
 311               		and r18,r24
 312               		movw r26,r20
 313               		std Y+2,__zero_reg__
 314 00f6 822F      		ldi r25,lo8(1)
 315 00f8 8323      		std Y+1,r25
 316 00fa 01F0      		ldd r30,Y+5
 317               		ldd r31,Y+6
 318               		std Y+4,r31
 319 00fc 832F      		std Y+3,r30
 320 00fe 8095      	.L21:
 322 0102 DA01      	.LM31:
 323 0104 1A82      		movw r30,r26
 324 0106 91E0      		ldd r25,Z+6

⌨️ 快捷键说明

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