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

📄 main.lss

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

#if OS_TIME_DLY_EN
//OS Time Delay --- 使任务延时Tdly个时间节拍
void OSTimeDly(INT16U Tdly)               /* Delay Tdly clock tick */
{
	OSTCB[OS_TASK_CrtPrio].OSTimeDly=Tdly+OS_TASK_TimeOut;
	OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_WaitTicks;
	OSSched();
}
#endif

#if OS_TASK_SUSPEND_EN>0
//把正在运行的任务挂起(Suspend a task)。
void OSTaskSuspend(INT8U TaskPrio) 
{
	OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_Rdy;
	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Suspend;
	OSTCB[TaskPrio].OSTimeDly=OS_TASK_TimeOut;
	OSSched();
}
#endif

#if OS_TASK_Resume_EN>0
// 恢复被挂起的任务(resume a task)。
void OSTaskResume(INT8U TaskPrio) 
{
	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Rdy;
}
#endif

//任务调度,把CPU控制权转到优先级最高的处于就绪态的任务。如果没有处于就绪态的任务,就地等待,
void OSSched(void) 
{
	do
	{
		OS_TASK_HighPri=OSPrioHighRdy();
 190:	c4 df       	rcall	.-120    	; 0x11a
 192:	80 93 7c 01 	sts	0x017C, r24
	} while (OS_TASK_HighPri==no_TASK_Rdy);
 196:	8f 3f       	cpi	r24, 0xFF	; 255
 198:	d9 f3       	breq	.-10     	; 0x190
	OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
 19a:	99 27       	eor	r25, r25
 19c:	f9 2f       	mov	r31, r25
 19e:	e8 2f       	mov	r30, r24
 1a0:	ee 0f       	add	r30, r30
 1a2:	ff 1f       	adc	r31, r31
 1a4:	ee 0f       	add	r30, r30
 1a6:	ff 1f       	adc	r31, r31
 1a8:	e8 0f       	add	r30, r24
 1aa:	f9 1f       	adc	r31, r25
 1ac:	ed 59       	subi	r30, 0x9D	; 157
 1ae:	fe 4f       	sbci	r31, 0xFE	; 254
 1b0:	8b ef       	ldi	r24, 0xFB	; 251
 1b2:	82 83       	std	Z+2, r24	; 0x02
	OS_TASK_INT();
 1b4:	72 d0       	rcall	.+228    	; 0x29a
 1b6:	08 95       	ret

000001b8 <OSTimeDly>:
 1b8:	20 91 62 01 	lds	r18, 0x0162
 1bc:	33 27       	eor	r19, r19
 1be:	f3 2f       	mov	r31, r19
 1c0:	e2 2f       	mov	r30, r18
 1c2:	ee 0f       	add	r30, r30
 1c4:	ff 1f       	adc	r31, r31
 1c6:	ee 0f       	add	r30, r30
 1c8:	ff 1f       	adc	r31, r31
 1ca:	e2 0f       	add	r30, r18
 1cc:	f3 1f       	adc	r31, r19
 1ce:	ed 59       	subi	r30, 0x9D	; 157
 1d0:	fe 4f       	sbci	r31, 0xFE	; 254
 1d2:	83 83       	std	Z+3, r24	; 0x03
 1d4:	94 83       	std	Z+4, r25	; 0x04
 1d6:	8a ef       	ldi	r24, 0xFA	; 250
 1d8:	82 83       	std	Z+2, r24	; 0x02
 1da:	da df       	rcall	.-76     	; 0x190
 1dc:	08 95       	ret

000001de <OSTaskSuspend>:
 1de:	90 91 62 01 	lds	r25, 0x0162
 1e2:	29 2f       	mov	r18, r25
 1e4:	33 27       	eor	r19, r19
 1e6:	43 e6       	ldi	r20, 0x63	; 99
 1e8:	51 e0       	ldi	r21, 0x01	; 1
 1ea:	f3 2f       	mov	r31, r19
 1ec:	e2 2f       	mov	r30, r18
 1ee:	ee 0f       	add	r30, r30
 1f0:	ff 1f       	adc	r31, r31
 1f2:	ee 0f       	add	r30, r30
 1f4:	ff 1f       	adc	r31, r31
 1f6:	e2 0f       	add	r30, r18
 1f8:	f3 1f       	adc	r31, r19
 1fa:	e4 0f       	add	r30, r20
 1fc:	f5 1f       	adc	r31, r21
 1fe:	9c ef       	ldi	r25, 0xFC	; 252
 200:	92 83       	std	Z+2, r25	; 0x02
 202:	99 27       	eor	r25, r25
 204:	f9 2f       	mov	r31, r25
 206:	e8 2f       	mov	r30, r24
 208:	ee 0f       	add	r30, r30
 20a:	ff 1f       	adc	r31, r31
 20c:	ee 0f       	add	r30, r30
 20e:	ff 1f       	adc	r31, r31
 210:	e8 0f       	add	r30, r24
 212:	f9 1f       	adc	r31, r25
 214:	e4 0f       	add	r30, r20
 216:	f5 1f       	adc	r31, r21
 218:	8d ef       	ldi	r24, 0xFD	; 253
 21a:	82 83       	std	Z+2, r24	; 0x02
 21c:	13 82       	std	Z+3, r1	; 0x03
 21e:	14 82       	std	Z+4, r1	; 0x04
 220:	b7 df       	rcall	.-146    	; 0x190
 222:	08 95       	ret

00000224 <OSTaskResume>:
 224:	99 27       	eor	r25, r25
 226:	f9 2f       	mov	r31, r25
 228:	e8 2f       	mov	r30, r24
 22a:	ee 0f       	add	r30, r30
 22c:	ff 1f       	adc	r31, r31
 22e:	ee 0f       	add	r30, r30
 230:	ff 1f       	adc	r31, r31
 232:	e8 0f       	add	r30, r24
 234:	f9 1f       	adc	r31, r25
 236:	ed 59       	subi	r30, 0x9D	; 157
 238:	fe 4f       	sbci	r31, 0xFE	; 254
 23a:	8c ef       	ldi	r24, 0xFC	; 252
 23c:	82 83       	std	Z+2, r24	; 0x02
 23e:	08 95       	ret

00000240 <InitOSTimer>:
#define T0_TCNT0 (256 - (T0_RELOAD & 0xff))
//Initial OS Timer for time ticks --- 初始化时间节拍定时器。
void InitOSTimer(void)
{
  TIMSK |= (1<<1);     // set T0IE0
 240:	89 b7       	in	r24, 0x39	; 57
 242:	82 60       	ori	r24, 0x02	; 2
 244:	89 bf       	out	0x39, r24	; 57
  TCCR0  = 0x05;       // CTC0=CK/1024
 246:	85 e0       	ldi	r24, 0x05	; 5
 248:	83 bf       	out	0x33, r24	; 51
  TCNT0  = T0_TCNT0;   // (256 - (T0_RELOAD & 0xff))
 24a:	8a e7       	ldi	r24, 0x7A	; 122
 24c:	82 bf       	out	0x32, r24	; 50
  SREG  |= (1<<7);     // SEI
 24e:	8f b7       	in	r24, 0x3f	; 63
 250:	80 68       	ori	r24, 0x80	; 128
 252:	8f bf       	out	0x3f, r24	; 63
 254:	08 95       	ret

00000256 <OSTaskCreate>:
}

//建立一个任务(Create a Task)。
//Inport :  tFunc --- function address , tStk --- stack bottom , prio --- Priority .
void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio) 
{
 256:	cf 93       	push	r28
 258:	df 93       	push	r29
 25a:	28 2f       	mov	r18, r24
 25c:	39 2f       	mov	r19, r25
 25e:	f7 2f       	mov	r31, r23
 260:	e6 2f       	mov	r30, r22
 262:	84 2f       	mov	r24, r20
 	OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
 264:	99 27       	eor	r25, r25
 266:	b9 2f       	mov	r27, r25
 268:	a8 2f       	mov	r26, r24
 26a:	aa 0f       	add	r26, r26
 26c:	bb 1f       	adc	r27, r27
 26e:	aa 0f       	add	r26, r26
 270:	bb 1f       	adc	r27, r27
 272:	a8 0f       	add	r26, r24
 274:	b9 1f       	adc	r27, r25
 276:	ad 59       	subi	r26, 0x9D	; 157
 278:	be 4f       	sbci	r27, 0xFE	; 254
 27a:	8c ef       	ldi	r24, 0xFC	; 252
 27c:	db 2f       	mov	r29, r27
 27e:	ca 2f       	mov	r28, r26
 280:	8a 83       	std	Y+2, r24	; 0x02
	OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called             */
 282:	3f 97       	sbiw	r30, 0x0f	; 15
 284:	ed 93       	st	X+, r30
 286:	fc 93       	st	X, r31
 288:	3f 96       	adiw	r30, 0x0f	; 15
                          -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   */
 28a:	22 93       	st	-Z, r18
	*--tStk	=  (INT16U const)tFunc / 0x100;  /* Save high byte of task function address  */
 28c:	31 97       	sbiw	r30, 0x01	; 1
 28e:	83 2f       	mov	r24, r19
 290:	99 27       	eor	r25, r25
 292:	80 83       	st	Z, r24
 294:	df 91       	pop	r29
 296:	cf 91       	pop	r28
 298:	08 95       	ret

0000029a <OSCtxSw>:
}

static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.

//context switch interrupt --- 软中断任务切换
void OSCtxSw(void) 
{
//asm("in %0, %1" : "=r" (value) : "I" (PORTD) : );

	asm("PUSH R31");
 29a:	ff 93       	push	r31
	asm("PUSH R30");
 29c:	ef 93       	push	r30
	asm("PUSH R29");	
 29e:	df 93       	push	r29
	asm("PUSH R28");
 2a0:	cf 93       	push	r28
	asm("PUSH R27");
 2a2:	bf 93       	push	r27
	asm("PUSH R26");
 2a4:	af 93       	push	r26

	asm("PUSH R0");
 2a6:	0f 92       	push	r0
	asm("PUSH R1");
 2a8:	1f 92       	push	r1
	asm("PUSH R2");	
 2aa:	2f 92       	push	r2
	asm("PUSH R3");
 2ac:	3f 92       	push	r3
	asm("PUSH R4");
 2ae:	4f 92       	push	r4
	asm("PUSH R5");	
 2b0:	5f 92       	push	r5

	asm("IN R31,0x3d");
 2b2:	fd b7       	in	r31, 0x3d	; 61
	asm("STS SaveSP,R31");
 2b4:	f0 93 60 00 	sts	0x0060, r31
	asm("IN R31,0x3e");	
 2b8:	fe b7       	in	r31, 0x3e	; 62
	asm("STS SaveSP+1,R31");	
 2ba:	f0 93 61 00 	sts	0x0061, r31

	OSTCB[OS_TASK_CrtPrio].OSStkTop = SaveSP; //Save the current task top.
 2be:	80 91 62 01 	lds	r24, 0x0162
 2c2:	99 27       	eor	r25, r25
 2c4:	23 e6       	ldi	r18, 0x63	; 99
 2c6:	31 e0       	ldi	r19, 0x01	; 1
 2c8:	f9 2f       	mov	r31, r25
 2ca:	e8 2f       	mov	r30, r24
 2cc:	ee 0f       	add	r30, r30
 2ce:	ff 1f       	adc	r31, r31
 2d0:	ee 0f       	add	r30, r30
 2d2:	ff 1f       	adc	r31, r31
 2d4:	e8 0f       	add	r30, r24
 2d6:	f9 1f       	adc	r31, r25
 2d8:	e2 0f       	add	r30, r18
 2da:	f3 1f       	adc	r31, r19
 2dc:	80 91 60 00 	lds	r24, 0x0060
 2e0:	90 91 61 00 	lds	r25, 0x0061
 2e4:	80 83       	st	Z, r24
 2e6:	91 83       	std	Z+1, r25	; 0x01

	OS_TASK_CrtPrio=OS_TASK_HighPri;
 2e8:	80 91 7c 01 	lds	r24, 0x017C
 2ec:	80 93 62 01 	sts	0x0162, r24

// Load context from the stack
    SaveSP = OSTCB[OS_TASK_CrtPrio].OSStkTop;	//load the high priority task task top.
 2f0:	99 27       	eor	r25, r25
 2f2:	f9 2f       	mov	r31, r25
 2f4:	e8 2f       	mov	r30, r24
 2f6:	ee 0f       	add	r30, r30
 2f8:	ff 1f       	adc	r31, r31
 2fa:	ee 0f       	add	r30, r30
 2fc:	ff 1f       	adc	r31, r31
 2fe:	e8 0f       	add	r30, r24
 300:	f9 1f       	adc	r31, r25
 302:	e2 0f       	add	r30, r18
 304:	f3 1f       	adc	r31, r19
 306:	80 81       	ld	r24, Z
 308:	91 81       	ldd	r25, Z+1	; 0x01
 30a:	90 93 61 00 	sts	0x0061, r25
 30e:	80 93 60 00 	sts	0x0060, r24

	asm("CLI");					
 312:	f8 94       	cli
	asm("LDS R31,SaveSP"); 
 314:	f0 91 60 00 	lds	r31, 0x0060
	asm("OUT 0x3d,R31");
 318:	fd bf       	out	0x3d, r31	; 61
	asm("LDS R31,SaveSP+1"); 
 31a:	f0 91 61 00 	lds	r31, 0x0061
	asm("OUT 0x3e,R31");
 31e:	fe bf       	out	0x3e, r31	; 62
	asm("SEI");
 320:	78 94       	sei
	
    asm("POP R5");
 322:	5f 90       	pop	r5
    asm("POP R4");
 324:	4f 90       	pop	r4
    asm("POP R3");
 326:	3f 90       	pop	r3
    asm("POP R2");
 328:	2f 90       	pop	r2
    asm("POP R1");
 32a:	1f 90       	pop	r1
    asm("POP R0");
 32c:	0f 90       	pop	r0
		
	asm("POP R26");
 32e:	af 91       	pop	r26
	asm("POP R27");
 330:	bf 91       	pop	r27
    asm("POP R28");
 332:	cf 91       	pop	r28
    asm("POP R29");
 334:	df 91       	pop	r29
    asm("POP R30");
 336:	ef 91       	pop	r30
    asm("POP R31");
 338:	ff 91       	pop	r31
 33a:	08 95       	ret

0000033c <__vector_7>:

}

//OS Time Tick Interrupt,OS 时钟节拍中断.
INTERRUPT(SIG_OVERFLOW0)
{
 33c:	78 94       	sei
 33e:	1f 92       	push	r1
 340:	0f 92       	push	r0
 342:	0f b6       	in	r0, 0x3f	; 63
 344:	0f 92       	push	r0
 346:	11 24       	eor	r1, r1
 348:	2f 93       	push	r18
 34a:	3f 93       	push	r19
 34c:	4f 93       	push	r20
 34e:	5f 93       	push	r21
 350:	6f 93       	push	r22
 352:	7f 93       	push	r23
 354:	8f 93       	push	r24
 356:	9f 93       	push	r25
 358:	af 93       	push	r26
 35a:	bf 93       	push	r27
 35c:	ef 93       	push	r30
 35e:	ff 93       	push	r31
    TCNT0  = T0_TCNT0;   // (256 - (T0_RELOAD & 0xff))
 360:	8a e7       	ldi	r24, 0x7A	; 122
 362:	82 bf       	out	0x32, r24	; 50
#if OS_TICK_HOOK_EN>0
//	AppTickHook();     //Hook file for a time tick --- 用户每个时间节拍的钩子函数

⌨️ 快捷键说明

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