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

📄 schedule.s

📁 avr单片机ATMega16对三相异步电机的智能控制源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module schedule.c
	.area text(rom, con, rel)
	.dbfile E:\_ING\文档\_STQ\easy-STQ-20080712\schedule.c
	.dbfunc e SCH_Dispatch_Tasks _SCH_Dispatch_Tasks fV
;          Index -> R20
	.even
_SCH_Dispatch_Tasks::
	xcall push_gset1
	.dbline -1
	.dbline 49
; 
; ///////////////////////////////////////////////////////////////
; /**************************************************************
; 
; 	公司名称:	 扬州恒博科技
; 	模块名	:	 点动型STQ执行机构主控程序 
; 	创建人	:	 章俭文                                         
; 	日期	:	 2008/08/19	                                         
; 	功能描述:   完成对本地旋钮和远程开关量的控制功能                                
; 	其它说明:   编译环境为ICCAVR V6.31A                                            
; 	版本	:	 V1.0
; 
; **************************************************************/
; ///////////////////////////////////////////////////////////////
; 
; #define SCHEDULE_GLOBAL
; #include "schedule.h"
; 
; 
; static void SCH_Updata(void);
; 
; 
; // 在任一时刻要求的任务最大数目
; #define SCH_MAX_TASKS (3)
; 
; // 任务队列
; sTask SCH_tasks_G[SCH_MAX_TASKS];
; 
; // 错误代码
; #define ERROR_SCH_TOO_MANY_TASKS (1)
; #define ERROR_SCH_CANNOT_DELETE_TASK (2)
; 
; #define RETURN_NORMAL 0
; #define RETURN_ERROR 1
; 
; 
; 
; 
; /*---------------------------------------------------------*-
;  * 函数名称: SCH_Dispatch_Tasks()
;  * 入	 口: 
;  * 出	 口:
;  * 函数功能: 调度函数,当一个任务()需要运行时,此函数将运行它,
;  * 
;  * 说	 明: 这个函数必须被主循环(重复)调用 
; -*---------------------------------------------------------*/
; 
; void SCH_Dispatch_Tasks(void)
; {
	.dbline 53
; 	unsigned char Index;
; 
; 	// 调度(运行)下一个任务(如果有任务就绪)
; 	for (Index=0; Index<SCH_MAX_TASKS; Index++)
	clr R20
	xjmp L8
L5:
	.dbline 54
; 	{
	.dbline 55
; 		if (SCH_tasks_G[Index].RunMe > 0)
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G+6
	ldi R25,>_SCH_tasks_G+6
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	cp R3,R2
	brsh L9
	.dbline 56
; 		{
	.dbline 58
; 			// 运行任务
; 			(*SCH_tasks_G[Index].pTask)();
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G
	ldi R25,>_SCH_tasks_G
	add R30,R24
	adc R31,R25
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicall
	.dbline 61
; 			
; 			// 复位 / 降低RunMe标志
; 			SCH_tasks_G[Index].RunMe -= 1;
	ldi R24,7
	mul R24,R20
	movw R2,R0
	ldi R24,<_SCH_tasks_G+6
	ldi R25,>_SCH_tasks_G+6
	add R2,R24
	adc R3,R25
	movw R30,R2
	ldd R24,z+0
	subi R24,1
	std z+0,R24
	.dbline 64
; 			
; 			// 如果这个是'单次'任务,将它从队列中删除
; 			if (SCH_tasks_G[Index].Period == 0)
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G+4
	ldi R25,>_SCH_tasks_G+4
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	tst R2
	brne L13
	tst R3
	brne L13
X0:
	.dbline 65
; 			{
	.dbline 66
; 				SCH_Delete_Task(Index);
	mov R16,R20
	xcall _SCH_Delete_Task
	.dbline 67
; 			}
L13:
	.dbline 68
; 		}
L9:
	.dbline 69
L6:
	.dbline 53
	inc R20
L8:
	.dbline 53
	cpi R20,3
	brsh X1
	xjmp L5
X1:
	.dbline -2
L4:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Index 20 c
	.dbend
	.dbfunc e SCH_Add_Task _SCH_Add_Task fc
;          Index -> R20
;         PERIOD -> y+2
;          DELAY -> R18,R19
;      pFunction -> R16,R17
	.even
_SCH_Add_Task::
	xcall push_gset1
	.dbline -1
	.dbline 91
; 	}
; }
; 
; 
; 
; /*---------------------------------------------------------*-
;  * 函数名称: SCH_Add_Task()
;  * 入	 口: (*pFunction)任务指针,(DELAY)到第一次运行间隔时标,
;  * 			 (PERIOD)每次运行的间隔时标
;  *
;  * 出	 口: 返回SCH_MAX_TASKS表示任务队列已满
;  *			 返回(Index)=任务位置
;  *
;  * 函数功能: 用来添加任务到任务队列上,以保证它们在需要的时
;  * 			 候被调用
;  * 
;  * 说	 明: 使任务函数每隔一定间隔或在用户的延迟之后执行.
; -*---------------------------------------------------------*/
; 
; unsigned char SCH_Add_Task(void (*pFunction)(),	// 任务指针
; 							const unsigned int DELAY,	// 延迟Delay个时标后函数将第一次运行
; 							const unsigned int PERIOD)  // 连续的运行之间的间隔(时标)
; {
	.dbline 92
; 	unsigned char Index = 0;	// 首先在队列中找到一个空隙
	clr R20
	xjmp L18
L17:
	.dbline 95
	.dbline 96
	inc R20
	.dbline 97
L18:
	.dbline 94
; 
; 	while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G
	ldi R25,>_SCH_tasks_G
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	tst R2
	brne X2
	tst R3
	breq L20
X2:
	cpi R20,3
	brlo L17
L20:
	.dbline 98
; 	{
; 		Index++;	
; 	}
; 	if (Index == SCH_MAX_TASKS)
	cpi R20,3
	brne L21
	.dbline 99
; 	{
	.dbline 100
; 		return SCH_MAX_TASKS;  // 同时返回错误代码
	ldi R16,3
	xjmp L16
L21:
	.dbline 104
; 	}
; 
; 	// 如果能运行到这里,则说明任务队列中有空间
; 	SCH_tasks_G[Index].pTask = pFunction;
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G
	ldi R25,>_SCH_tasks_G
	add R30,R24
	adc R31,R25
	std z+1,R17
	std z+0,R16
	.dbline 105
; 	SCH_tasks_G[Index].Delay = DELAY;
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G+2
	ldi R25,>_SCH_tasks_G+2
	add R30,R24
	adc R31,R25
	std z+1,R19
	std z+0,R18
	.dbline 106
; 	SCH_tasks_G[Index].Period = PERIOD;
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G+4
	ldi R25,>_SCH_tasks_G+4
	add R30,R24
	adc R31,R25
	ldd R0,y+2
	ldd R1,y+3
	std z+1,R1
	std z+0,R0
	.dbline 107
; 	SCH_tasks_G[Index].RunMe = 0;
	ldi R24,7
	mul R24,R20
	movw R30,R0
	ldi R24,<_SCH_tasks_G+6
	ldi R25,>_SCH_tasks_G+6
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 108
; 	return Index;		// 返回任务的位置(以便以后删除)
	mov R16,R20
	.dbline -2
L16:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Index 20 c
	.dbsym l PERIOD 2 ki
	.dbsym r DELAY 18 ki
	.dbsym r pFunction 16 pfV
	.dbend
	.dbfunc e SCH_Delete_Task _SCH_Delete_Task fc
;    Return_code -> R20
;     TASK_INDEX -> R16
	.even
_SCH_Delete_Task::
	xcall push_gset1
	.dbline -1
	.dbline 127
; 
; }
; 
; 
; 
; /*---------------------------------------------------------*-
;  * 函数名称: SCH_Delete_Task()
;  * 入	 口: TASK_INDEX -任务索引.由SCH_Add_task()提供
;  * 
;  * 出	 口: 返回值: RETURN_ERROR(或)RETURN_NORMAL
;  *		
;  * 函数功能: 从调度器删除任务.
;  * 
;  * 说	 明: 请注意:并不是从存储器中删除相关的函数,仅仅是不再
;  * 			 由调度器调用这个任务.
; -*---------------------------------------------------------*/
; 
; uchar SCH_Delete_Task(const unsigned char TASK_INDEX)
; {
	.dbline 130
; 	uchar Return_code;		//返回错误代码
; 
; 	if (SCH_tasks_G[TASK_INDEX].pTask == 0)
	ldi R24,7
	mul R24,R16
	movw R30,R0
	ldi R24,<_SCH_tasks_G
	ldi R25,>_SCH_tasks_G
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	tst R2
	brne L27
	tst R3
	brne L27
X3:
	.dbline 131
; 	{	
	.dbline 132
; 		Return_code = RETURN_ERROR;	  
	ldi R20,1
	.dbline 133
; 	}
	xjmp L28
L27:
	.dbline 135
; 	else
; 	{
	.dbline 136
; 		Return_code = RETURN_NORMAL;
	clr R20
	.dbline 137
; 	}
L28:
	.dbline 140
; 
; 	// 删除任务
; 	SCH_tasks_G[TASK_INDEX].pTask = 0x00;
	ldi R24,7
	mul R24,R16
	movw R30,R0
	ldi R24,<_SCH_tasks_G
	ldi R25,>_SCH_tasks_G
	add R30,R24
	adc R31,R25
	clr R2
	clr R3
	std z+1,R3
	std z+0,R2
	.dbline 141
; 	SCH_tasks_G[TASK_INDEX].Delay = 0;
	ldi R24,7
	mul R24,R16
	movw R30,R0
	ldi R24,<_SCH_tasks_G+2
	ldi R25,>_SCH_tasks_G+2
	add R30,R24
	adc R31,R25
	std z+1,R3
	std z+0,R2
	.dbline 142
; 	SCH_tasks_G[TASK_INDEX].Period = 0;
	ldi R24,7
	mul R24,R16
	movw R30,R0
	ldi R24,<_SCH_tasks_G+4
	ldi R25,>_SCH_tasks_G+4
	add R30,R24
	adc R31,R25
	std z+1,R3
	std z+0,R2
	.dbline 143
; 	SCH_tasks_G[TASK_INDEX].RunMe = 0;
	ldi R24,7
	mul R24,R16
	movw R30,R0
	ldi R24,<_SCH_tasks_G+6

⌨️ 快捷键说明

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