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

📄 test.lss

📁 改程序是ucos-ii在meg16上的移植
💻 LSS
📖 第 1 页 / 共 4 页
字号:
	__asm__ __volatile__("LDI  R16,0x00             \n\t");
 18a:	00 e0       	ldi	r16, 0x00	; 0
	/*
		清除中断要求任务切换的标志位,清除正在任务切换标志位,
		表示任务切换已经完成。
	*/
	__asm__ __volatile__("RETI                      \n\t");     /*返回并开中断		*/
 18c:	18 95       	reti
 18e:	08 95       	ret

00000190 <IntSwitch>:
}

/************************************************************************************************************************
函数名称:	IntSwitch
函数原型:	void IntSwitch(void)
函数功能:	从中断退出并进行调度
入口参数:	无
出口参数:	无
有关说明:	当无中断嵌套并且中断中要求进行任务切换时才进行任务切换。
*			因为从中断到运行下一个任务共调用了两次子函数,所以要弹出四个入栈的PC
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void IntSwitch(void)
{
	if((OSCoreState == 0x02) && (OSIntNesting == 0))
 190:	02 30       	cpi	r16, 0x02	; 2
 192:	41 f4       	brne	.+16     	; 0x1a4
 194:	44 20       	and	r4, r4
 196:	31 f4       	brne	.+12     	; 0x1a4
	{
		/*
			进入中断时,已经保存了SREG和R0,R1,R18~R27,R30,R31,
			所以没有必要再保存一次了,直接跳转到Int_OSSched进行下一个调度
		*/
		__asm__ __volatile__("POP  R31                  \n\t");	/*去除因调用子程序而入栈的PC*/
 198:	ff 91       	pop	r31
		__asm__ __volatile__("POP  R31                  \n\t");
 19a:	ff 91       	pop	r31
		__asm__ __volatile__("POP  R31                  \n\t");
 19c:	ff 91       	pop	r31
		__asm__ __volatile__("POP  R31                  \n\t");
 19e:	ff 91       	pop	r31
		__asm__ __volatile__("LDI  R16,0x01             \n\t");
 1a0:	01 e0       	ldi	r16, 0x01	; 1
		/*
			清除中断要求任务切换的标志位,设置正在任务切换标志位 
		*/
		__asm__ __volatile__("RJMP Int_OSSched          \n\t");	/*重新调度					*/
 1a2:	ba cf       	rjmp	.-140    	; 0x118
 1a4:	08 95       	ret
 1a6:	08 95       	ret

000001a8 <OSFindPrioHighRdy>:
	}
}

/************************************************************************************************************************
函数名称:	OSSched
函数原型:	void OSSched(void)
函数功能:	任务调度器,进行任务调度
入口参数:	无
出口参数:	无
有关说明:	只有有更高优先级的任务就绪时才进行一次任务切换,否则不做切换
创建时间:	2007年3月7日
修改时间:	
************************************************************************************************************************/
void OSSched (void)
{
	OSFindPrioHighRdy();						/*找出就绪表中优先级最高的任务*/
	if(OSPrioHighRdy != OSPrioCur)				/*如果不是当前运行的任务,进行任务调度*/
	{
		OS_TASK_SW();							/*调度任务*/
	}
}
/************************************************************************************************************************
函数名称:	OSTaskSuspend
函数原型:	void OSTaskSuspend(Uint_8bit prio)
函数功能:	挂起任务 
入口参数:	prio:任务优先级
出口参数:	无
有关说明:	一个任务可以挂起本身也可以挂起其他任务
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void OSTaskSuspend(Uint_8bit prio)
{
	OS_ENTER_CRITICAL();
	TCB[prio].OSWaitTick=0;
	OSRdyTbl &= ~(0x01<<prio);		/*从任务就绪表上去除标志位	*/
	if(OSPrioCur == prio)			/*当要挂起的任务为当前任务	*/
	{
		OS_EXIT_CRITICAL();
		OSSched();					/*重新调度					*/
		return;
	}
	OS_EXIT_CRITICAL();
}

/************************************************************************************************************************
函数名称:	OSTaskResume
函数原型:	void OSTaskResume(Uint_8bit prio)
函数功能:	恢复任务 可以让被OSTaskSuspend或 OSTimeDly暂停的任务恢复 
入口参数:	prio:任务优先级
出口参数:	无
有关说明:	
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void OSTaskResume(Uint_8bit prio)
{
	OS_ENTER_CRITICAL();
	OSRdyTbl |= 0x01<<prio;			/*从任务就绪表上重置标志位	*/
    TCB[prio].OSWaitTick=0;			/*将时间计时设为0,到时		*/
	if(OSPrioCur > prio)			/*当要当前任务的优先级低于重置位的任务的优先级	*/
	{
		OS_EXIT_CRITICAL();
		OSSched();					/*重新调度					*/
		return;
	}
	OS_EXIT_CRITICAL();
}

/************************************************************************************************************************
函数名称:	OSTimeDly
函数原型:	void OSTimeDly(Uint_16bit ticks)
函数功能:	任务延时 
入口参数:	延时的时间,任务时钟的个数
出口参数:	无
有关说明:	如果延时65535(0xffff)则为无限延时
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void OSTimeDly(Uint_16bit ticks)
{
	if(ticks)                             	/*当延时有效 */
	{
		OS_ENTER_CRITICAL();
		OSRdyTbl &= ~(0x01<<OSPrioCur);	/*把任务从就绪表中去掉*/
		TCB[OSPrioCur].OSWaitTick=ticks;
		OS_EXIT_CRITICAL();
		OSSched();                          /*重新调度	*/
	}
}

/************************************************************************************************************************
函数名称:	OSSemCreat
函数原型:	void OSSemCreat(Uint_8bit Index,Uint_8bit Type)
函数功能:	初始化信号量 
入口参数:	Index:信号量的序号;Type:信号量类型
出口参数:	无
有关说明:	Type为 0 信号量独占型;1 信号量共享型
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void OSSemCreat(Uint_8bit Index,Uint_8bit Type)
{
	Sem[Index].OSEventType=Type;
	Sem[Index].OSTaskPendTbl=0;				/*初始化时任务等待列表为空*/
	Sem[Index].OSEventState=0;				/*信号量无效*/
}

/************************************************************************************************************************
函数名称:	OSTaskSemPend
函数原型:	Uint_8bit OSTaskSemPend(Uint_8bit Index,Uint_16bit Timeout) 
函数功能:	任务等待信号量,挂起 
入口参数:	Index:信号量序号;Timeout:等待时间
出口参数:	无
有关说明:	当Timeout==0xffff时,为无限等待
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
Uint_8bit OSTaskSemPend(Uint_8bit Index,Uint_16bit Timeout)
{
	if(Sem[Index].OSEventState)							/*信号量有效	*/
	{
		if(Sem[Index].OSEventType == 0)				/*如果为独占型	*/
		{
			Sem[Index].OSEventState = 0x00;				/*信号量被独占,不可用*/
		}
	}
	else
	{                              						/*加入信号的任务等待表*/
		OS_ENTER_CRITICAL();
		Sem[Index].OSTaskPendTbl |= 0x01<<OSPrioCur;
		TCB[OSPrioCur].OSWaitTick = Timeout;			/*定义等待超时			*/
		OSRdyTbl &= ~(0x01<<OSPrioCur);				/*从任务就绪表中去除	*/
		OS_EXIT_CRITICAL();
		OSSched();   									/*重新调度				*/
		if(TCB[OSPrioCur].OSWaitTick==0 )				/*超时,未能拿到资源	*/
		{
			return 0;
		}
	}
	return 1;
}

/************************************************************************************************************************
函数名称:	OSSemPost
函数原型:	void OSSemPost(Uint_8bit Index) 
函数功能:	发送一个信号量,可以从任务或中断发送,
*			发送完了信号量之后不进行任务调度,推荐在中断中调用
入口参数:	Index:信号量的序号
出口参数:	无
有关说明:	如果有任务在等待该信号量则将该任务就绪,没有任务等待则仅仅是把信号量置为有效
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void OSSemPost(Uint_8bit Index)
{
	if(Sem[Index].OSEventType)							/*当要求的信号量是共享型	*/
	{
		OS_ENTER_CRITICAL();
		Sem[Index].OSEventState=0x01;					/*使信号量有效				*/
		OSRdyTbl |=Sem [Index].OSTaskPendTbl;			/*使在等待该信号的所有任务就绪*/
		Sem[Index].OSTaskPendTbl=0;						/*清空所有等待该信号的等待任务*/
		OS_EXIT_CRITICAL();
	}
	else 												/*当要求的信号量为独占型	*/
	{
		Uint_8bit i;
		i=0;
		while ((i < OS_TASKS) && (!(Sem[Index].OSTaskPendTbl & (0x01<<i))))
		{
			i++;
			/*
				找出信号量等待列表中任务优先级最高的任务
			*/
		}
		if(i < OS_TASKS)								/*如果有任务需要			*/
		{
			OS_ENTER_CRITICAL();
			Sem[Index].OSTaskPendTbl &= ~(0x01<<i);	/*从等待表中去除			*/
			OSRdyTbl |= 0x01<<i;						/*任务就绪					*/
			OS_EXIT_CRITICAL();
		}
		else											/*没有任务等待该信号量		*/
		{
			Sem[Index].OSEventState = 1;				/*使信号量有效				*/
		}
	}
}

/************************************************************************************************************************
函数名称:	OSTaskSemPost
函数原型:	void OSTaskSemPost(Uint_8bit Index)
函数功能:	从任务发送一个信号量,并进行调度 
入口参数:	Index:信号量的序号
出口参数:	无
有关说明:	在任务中调用
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void OSTaskSemPost(Uint_8bit Index)
{
	OSSemPost(Index);
	OSSched();
}

/************************************************************************************************************************
函数名称:	OSSemClean
函数原型:	void OSSemClean(Uint_8bit Index)
函数功能:	清除一个信号量,只对共享型的有用。 对于独占型的信号量,在任务占用后,就变得不可以用了
入口参数:	Index:信号量的序号
出口参数:	无
有关说明:	
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void OSSemClean(Uint_8bit Index)
{
	Sem[Index].OSEventState = 0;				/*要求的信号量无效*/
}

/************************************************************************************************************************
函数名称:	TCN0Init
函数原型:	void TCN0Init(void)
函数功能:	初始化定时器0
入口参数:	无
出口参数:	无
有关说明:	定时器T0是任务时钟
创建时间:	2007年3月3日
修改时间:	
************************************************************************************************************************/
void TCN0Init(void)
{
	TCCR0 = 0;
	TCCR0 |= (1<<CS02);			/* 256预分频		*/
	TIMSK |= (1<<TOIE0);		/* T0溢出中断允许	*/
	TCNT0 = 100;				/* 置计数起始值		*/
}

/************************************************************************************************************************
函数名称:	OSFindPrioHighRdy
函数原型:	void OSFindPrioHighRdy (void)
函数功能:	找出任务就绪表中的最高优先级的任务
入口参数:	无
出口参数:	无
有关说明:	
创建时间:	2007年3月7日
修改时间:	
************************************************************************************************************************/
void OSFindPrioHighRdy (void)
{
	Uint_8bit OSNextTaskPrio;
	OSNextTaskPrio = 0;
 1a8:	40 e0       	ldi	r20, 0x00	; 0
	while ((OSNextTaskPrio < OS_TASKS) && (!(OSRdyTbl & (0x01<<OSNextTaskPrio))))
	{
		OSNextTaskPrio++;
 1aa:	22 2d       	mov	r18, r2
 1ac:	33 27       	eor	r19, r19
 1ae:	20 fd       	sbrc	r18, 0
 1b0:	0c c0       	rjmp	.+24     	; 0x1ca
 1b2:	4f 5f       	subi	r20, 0xFF	; 255
 1b4:	43 30       	cpi	r20, 0x03	; 3
 1b6:	48 f4       	brcc	.+18     	; 0x1ca
 1b8:	c9 01       	movw	r24, r18
 1ba:	04 2e       	mov	r0, r20
 1bc:	02 c0       	rjmp	.+4      	; 0x1c2
 1be:	95 95       	asr	r25
 1c0:	87 95       	ror	r24
 1c2:	0a 94       	dec	r0
 1c4:	e2 f7       	brpl	.-8      	; 0x1be
 1c6:	80 ff       	sbrs	r24, 0
 1c8:	f4 cf       	rjmp	.-24     	; 0x1b2
		/*
			找出信号量等待列表中任务优先级最高的任务
		*/
	}
	
	OSPrioHighRdy = OSNextTaskPrio;
 1ca:	54 2e       	mov	r5, r20
 1cc:	08 95       	ret

000001ce <OSSched>:
 1ce:	0e 94 d4 00 	call	0x1a8
 1d2:	53 14       	cp	r5, r3
 1d4:	11 f0       	breq	.+4      	; 0x1da
 1d6:	0e 94 79 00 	call	0xf2
 1da:	08 95       	ret
 1dc:	08 95       	ret

000001de <OSTaskSuspend>:
 1de:	48 2f       	mov	r20, r24
 1e0:	0f b6       	in	r0, 0x3f	; 63
 1e2:	0f 92       	push	r0
 1e4:	11 24       	eor	r1, r1
 1e6:	f8 94       	cli
 1e8:	28 2f       	mov	r18, r24
 1ea:	33 27       	eor	r19, r19
 1ec:	f9 01       	movw	r30, r18
 1ee:	ee 0f       	add	r30, r30

⌨️ 快捷键说明

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