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

📄 main.lss

📁 给出一个简单操作系统在AVR中应用实例
💻 LSS
📖 第 1 页 / 共 2 页
字号:

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000388  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  00000388  0000041c  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          0000011d  00800060  00800060  0000041c  2**0
                  ALLOC
  3 .noinit       00000000  0080017d  0080017d  0000041c  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  0000041c  2**0
                  CONTENTS
  5 .stab         00000d14  00000000  00000000  0000041c  2**2
                  CONTENTS, READONLY, DEBUGGING
  6 .stabstr      000008da  00000000  00000000  00001130  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c c0       	rjmp	.+24     	; 0x1a
   2:	26 c0       	rjmp	.+76     	; 0x50
   4:	25 c0       	rjmp	.+74     	; 0x50
   6:	24 c0       	rjmp	.+72     	; 0x50
   8:	23 c0       	rjmp	.+70     	; 0x50
   a:	22 c0       	rjmp	.+68     	; 0x50
   c:	21 c0       	rjmp	.+66     	; 0x50
   e:	96 c1       	rjmp	.+812    	; 0x33c
  10:	1f c0       	rjmp	.+62     	; 0x50
  12:	1e c0       	rjmp	.+60     	; 0x50
  14:	1d c0       	rjmp	.+58     	; 0x50
  16:	1c c0       	rjmp	.+56     	; 0x50
  18:	1b c0       	rjmp	.+54     	; 0x50

0000001a <__ctors_end>:
  1a:	11 24       	eor	r1, r1
  1c:	1f be       	out	0x3f, r1	; 63
  1e:	cf e5       	ldi	r28, 0x5F	; 95
  20:	d2 e0       	ldi	r29, 0x02	; 2
  22:	de bf       	out	0x3e, r29	; 62
  24:	cd bf       	out	0x3d, r28	; 61

00000026 <__do_copy_data>:
  26:	10 e0       	ldi	r17, 0x00	; 0
  28:	a0 e6       	ldi	r26, 0x60	; 96
  2a:	b0 e0       	ldi	r27, 0x00	; 0
  2c:	e8 e8       	ldi	r30, 0x88	; 136
  2e:	f3 e0       	ldi	r31, 0x03	; 3
  30:	03 c0       	rjmp	.+6      	; 0x38

00000032 <.do_copy_data_loop>:
  32:	c8 95       	lpm
  34:	31 96       	adiw	r30, 0x01	; 1
  36:	0d 92       	st	X+, r0

00000038 <.do_copy_data_start>:
  38:	a0 36       	cpi	r26, 0x60	; 96
  3a:	b1 07       	cpc	r27, r17
  3c:	d1 f7       	brne	.-12     	; 0x32

0000003e <__do_clear_bss>:
  3e:	11 e0       	ldi	r17, 0x01	; 1
  40:	a0 e6       	ldi	r26, 0x60	; 96
  42:	b0 e0       	ldi	r27, 0x00	; 0
  44:	01 c0       	rjmp	.+2      	; 0x48

00000046 <.do_clear_bss_loop>:
  46:	1d 92       	st	X+, r1

00000048 <.do_clear_bss_start>:
  48:	ad 37       	cpi	r26, 0x7D	; 125
  4a:	b1 07       	cpc	r27, r17
  4c:	e1 f7       	brne	.-8      	; 0x46
  4e:	01 c0       	rjmp	.+2      	; 0x52

00000050 <__bad_interrupt>:
  50:	d7 cf       	rjmp	.-82     	; 0x0

00000052 <main>:
#define TaskCPrio	 3                        //声明任务TaskC(void)的优先级。
OS_STK TaskCStk[MAX_STK_SIZE];   //声明任务TaskC(void)的堆栈空间。

int main(void)
{
  52:	cf e5       	ldi	r28, 0x5F	; 95
  54:	d2 e0       	ldi	r29, 0x02	; 2
  56:	de bf       	out	0x3e, r29	; 62
  58:	cd bf       	out	0x3d, r28	; 61
	wdt_disable();
  5a:	88 e1       	ldi	r24, 0x18	; 24
  5c:	90 e0       	ldi	r25, 0x00	; 0
  5e:	20 e0       	ldi	r18, 0x00	; 0
  60:	0f b6       	in	r0, 0x3f	; 63
  62:	f8 94       	cli
  64:	a8 95       	wdr
  66:	81 bd       	out	0x21, r24	; 33
  68:	0f be       	out	0x3f, r0	; 63
  6a:	21 bd       	out	0x21, r18	; 33
	OSInit();               //初始化OS任务控制块(initialization OSTCB)。
  6c:	3e d0       	rcall	.+124    	; 0xea
	OSTaskCreate(TaskA,&TaskAStk[MAX_STK_SIZE-1],TaskAPrio); //建立任务TaskA(void)。
  6e:	41 e0       	ldi	r20, 0x01	; 1
  70:	61 e2       	ldi	r22, 0x21	; 33
  72:	71 e0       	ldi	r23, 0x01	; 1
  74:	88 e5       	ldi	r24, 0x58	; 88
  76:	90 e0       	ldi	r25, 0x00	; 0
  78:	ee d0       	rcall	.+476    	; 0x256
	OSTaskCreate(TaskB,&TaskBStk[MAX_STK_SIZE-1],TaskBPrio); //建立任务TaskB(void)。
  7a:	42 e0       	ldi	r20, 0x02	; 2
  7c:	61 ea       	ldi	r22, 0xA1	; 161
  7e:	70 e0       	ldi	r23, 0x00	; 0
  80:	83 e6       	ldi	r24, 0x63	; 99
  82:	90 e0       	ldi	r25, 0x00	; 0
  84:	e8 d0       	rcall	.+464    	; 0x256
	OSTaskCreate(TaskC,&TaskCStk[MAX_STK_SIZE-1],TaskCPrio); //建立任务TaskC(void)。
  86:	43 e0       	ldi	r20, 0x03	; 3
  88:	61 ee       	ldi	r22, 0xE1	; 225
  8a:	70 e0       	ldi	r23, 0x00	; 0
  8c:	8c e6       	ldi	r24, 0x6C	; 108
  8e:	90 e0       	ldi	r25, 0x00	; 0
  90:	e2 d0       	rcall	.+452    	; 0x256

	INIT_LED_Drv();
  92:	87 b3       	in	r24, 0x17	; 23
  94:	80 6f       	ori	r24, 0xF0	; 240
  96:	87 bb       	out	0x17, r24	; 23
	
	OSStart();                              //起动OS。
  98:	36 d0       	rcall	.+108    	; 0x106
	
	while (1)
	{
		LED1_ON();
  9a:	c4 9a       	sbi	0x18, 4	; 24
		OSTaskResume(TaskAPrio);	
  9c:	81 e0       	ldi	r24, 0x01	; 1
  9e:	c2 d0       	rcall	.+388    	; 0x224
//		OSTaskSuspend(OS_TASK_Me);
		OSTimeDly(1);
  a0:	81 e0       	ldi	r24, 0x01	; 1
  a2:	90 e0       	ldi	r25, 0x00	; 0
  a4:	89 d0       	rcall	.+274    	; 0x1b8
		LED1_OFF();	
  a6:	c4 98       	cbi	0x18, 4	; 24
		OSTimeDly(1);
  a8:	81 e0       	ldi	r24, 0x01	; 1
  aa:	90 e0       	ldi	r25, 0x00	; 0
  ac:	85 d0       	rcall	.+266    	; 0x1b8
  ae:	f5 cf       	rjmp	.-22     	; 0x9a

000000b0 <TaskA>:
	}	
}


void TaskA(void)
{
	while (1)
	{
		OSTaskResume(Task_main_Prio);	
  b0:	80 e0       	ldi	r24, 0x00	; 0
  b2:	b8 d0       	rcall	.+368    	; 0x224
		LED2_ON();	
  b4:	c5 9a       	sbi	0x18, 5	; 24
		OSTimeDly(2);
  b6:	82 e0       	ldi	r24, 0x02	; 2
  b8:	90 e0       	ldi	r25, 0x00	; 0
  ba:	7e d0       	rcall	.+252    	; 0x1b8
		LED2_OFF();	
  bc:	c5 98       	cbi	0x18, 5	; 24
		OSTimeDly(2);
  be:	82 e0       	ldi	r24, 0x02	; 2
  c0:	90 e0       	ldi	r25, 0x00	; 0
  c2:	7a d0       	rcall	.+244    	; 0x1b8
  c4:	f5 cf       	rjmp	.-22     	; 0xb0

000000c6 <TaskB>:
	}
}

void TaskB(void)
{
	while (1)
	{
		LED3_ON();	
  c6:	c6 9a       	sbi	0x18, 6	; 24
		OSTimeDly(3);
  c8:	83 e0       	ldi	r24, 0x03	; 3
  ca:	90 e0       	ldi	r25, 0x00	; 0
  cc:	75 d0       	rcall	.+234    	; 0x1b8
		LED3_OFF();	
  ce:	c6 98       	cbi	0x18, 6	; 24
		OSTimeDly(3);
  d0:	83 e0       	ldi	r24, 0x03	; 3
  d2:	90 e0       	ldi	r25, 0x00	; 0
  d4:	71 d0       	rcall	.+226    	; 0x1b8
  d6:	f7 cf       	rjmp	.-18     	; 0xc6

000000d8 <TaskC>:
	}
}

void TaskC(void)
{
	while (1)
	{
		LED4_ON();	
  d8:	c7 9a       	sbi	0x18, 7	; 24
		OSTimeDly(5);
  da:	85 e0       	ldi	r24, 0x05	; 5
  dc:	90 e0       	ldi	r25, 0x00	; 0
  de:	6c d0       	rcall	.+216    	; 0x1b8
		LED4_OFF();	
  e0:	c7 98       	cbi	0x18, 7	; 24
		OSTimeDly(5);
  e2:	85 e0       	ldi	r24, 0x05	; 5
  e4:	90 e0       	ldi	r25, 0x00	; 0
  e6:	68 d0       	rcall	.+208    	; 0x1b8
  e8:	f7 cf       	rjmp	.-18     	; 0xd8

000000ea <OSInit>:
// initialization OSTCB --- 初始化任务控制块.
void OSInit(void) 
{	INT8U i;
    OS_TCB *pOS_TCB;
	pOS_TCB=OSTCB;
  ea:	e3 e6       	ldi	r30, 0x63	; 99
  ec:	f1 e0       	ldi	r31, 0x01	; 1
  ee:	9f ef       	ldi	r25, 0xFF	; 255
  f0:	84 e0       	ldi	r24, 0x04	; 4
	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	{
		pOS_TCB->OSStkTop=(INT16U)NULL;
  f2:	10 82       	st	Z, r1
  f4:	11 82       	std	Z+1, r1	; 0x01
		pOS_TCB->OSTaskStatus=no_TASK_Rdy;
  f6:	92 83       	std	Z+2, r25	; 0x02
		pOS_TCB->OSTimeDly=0;
  f8:	13 82       	std	Z+3, r1	; 0x03
  fa:	14 82       	std	Z+4, r1	; 0x04
  fc:	81 50       	subi	r24, 0x01	; 1
  fe:	35 96       	adiw	r30, 0x05	; 5
 100:	87 ff       	sbrs	r24, 7
 102:	f7 cf       	rjmp	.-18     	; 0xf2
 104:	08 95       	ret

00000106 <OSStart>:
	}
}

//Start OS --- 启动OS
void OSStart(void) 
{
	Init_OS_Timer();
 106:	9c d0       	rcall	.+312    	; 0x240
	OS_TASK_CrtPrio=Task_main_Prio;
 108:	10 92 62 01 	sts	0x0162, r1
	OS_TASK_HighPri=OS_TASK_CrtPrio;
 10c:	10 92 7c 01 	sts	0x017C, r1
	OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
 110:	8b ef       	ldi	r24, 0xFB	; 251
 112:	80 93 65 01 	sts	0x0165, r24
	OS_INT_ENABLE();
	OS_TASK_INT();
 116:	c1 d0       	rcall	.+386    	; 0x29a
 118:	08 95       	ret

0000011a <OSPrioHighRdy>:
}

//返回优先级最高的处于就绪态任务的优先级,否则返回no_TASK_Rdy。
static INT8U OSPrioHighRdy(void) 
{ INT8U i;
    OS_TCB *pOS_TCB;
	pOS_TCB=OSTCB;
 11a:	e3 e6       	ldi	r30, 0x63	; 99
 11c:	f1 e0       	ldi	r31, 0x01	; 1
	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
 11e:	a0 e0       	ldi	r26, 0x00	; 0
 120:	60 e0       	ldi	r22, 0x00	; 0
 122:	70 e0       	ldi	r23, 0x00	; 0
	{
		if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
 124:	20 e0       	ldi	r18, 0x00	; 0
 126:	30 e0       	ldi	r19, 0x00	; 0
 128:	80 81       	ld	r24, Z
 12a:	91 81       	ldd	r25, Z+1	; 0x01
 12c:	89 2b       	or	r24, r25
 12e:	11 f0       	breq	.+4      	; 0x134
 130:	21 e0       	ldi	r18, 0x01	; 1
 132:	30 e0       	ldi	r19, 0x00	; 0
 134:	40 e0       	ldi	r20, 0x00	; 0
 136:	50 e0       	ldi	r21, 0x00	; 0
 138:	82 81       	ldd	r24, Z+2	; 0x02
 13a:	8c 3f       	cpi	r24, 0xFC	; 252
 13c:	11 f4       	brne	.+4      	; 0x142
 13e:	41 e0       	ldi	r20, 0x01	; 1
 140:	50 e0       	ldi	r21, 0x00	; 0
 142:	24 23       	and	r18, r20
 144:	35 23       	and	r19, r21
 146:	23 2b       	or	r18, r19
 148:	19 f0       	breq	.+6      	; 0x150
 14a:	97 2f       	mov	r25, r23
 14c:	86 2f       	mov	r24, r22
 14e:	08 95       	ret
 150:	af 5f       	subi	r26, 0xFF	; 255
 152:	6f 5f       	subi	r22, 0xFF	; 255
 154:	7f 4f       	sbci	r23, 0xFF	; 255
 156:	35 96       	adiw	r30, 0x05	; 5
 158:	a5 30       	cpi	r26, 0x05	; 5
 15a:	20 f3       	brcs	.-56     	; 0x124
	}
	return no_TASK_Rdy;
 15c:	8f ef       	ldi	r24, 0xFF	; 255
 15e:	90 e0       	ldi	r25, 0x00	; 0
}
 160:	08 95       	ret
 162:	08 95       	ret

00000164 <OSTimeTick>:

//Task OSTimeDly Decrease 1 per Time Tick --- 每个时钟节拍,任务等待延时的时间OSTimeDly减1.
//如果任务的OSTimeDly减到0,把任务设置为准备就绪OS_TASK_Rdy。
void OSTimeTick(void) 
{ INT8U i;
    OS_TCB *pOS_TCB;
	pOS_TCB=OSTCB;
 164:	e3 e6       	ldi	r30, 0x63	; 99
 166:	f1 e0       	ldi	r31, 0x01	; 1
 168:	3c ef       	ldi	r19, 0xFC	; 252
 16a:	24 e0       	ldi	r18, 0x04	; 4
	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	{
		if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut) 
 16c:	83 81       	ldd	r24, Z+3	; 0x03
 16e:	94 81       	ldd	r25, Z+4	; 0x04
 170:	00 97       	sbiw	r24, 0x00	; 0
 172:	31 f0       	breq	.+12     	; 0x180
		{
			if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
 174:	01 97       	sbiw	r24, 0x01	; 1
 176:	83 83       	std	Z+3, r24	; 0x03
 178:	94 83       	std	Z+4, r25	; 0x04
 17a:	89 2b       	or	r24, r25
 17c:	09 f4       	brne	.+2      	; 0x180
 17e:	32 83       	std	Z+2, r19	; 0x02
 180:	21 50       	subi	r18, 0x01	; 1
 182:	35 96       	adiw	r30, 0x05	; 5
 184:	27 ff       	sbrs	r18, 7
 186:	f2 cf       	rjmp	.-28     	; 0x16c
		}
	}
	OS_TASK_HighPri=OSPrioHighRdy();
 188:	c8 df       	rcall	.-112    	; 0x11a
 18a:	80 93 7c 01 	sts	0x017C, r24
 18e:	08 95       	ret

00000190 <OSSched>:

⌨️ 快捷键说明

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