📄 schedule.lis
字号:
.module schedule.c
.area text(rom, con, rel)
0000 .dbfile E:\_ING\文档\_STQ\easy-STQ-20080712\schedule.c
0000 .dbfunc e SCH_Dispatch_Tasks _SCH_Dispatch_Tasks fV
0000 ; Index -> R20
.even
0000 _SCH_Dispatch_Tasks::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 49
0004 ;
0004 ; ///////////////////////////////////////////////////////////////
0004 ; /**************************************************************
0004 ;
0004 ; 公司名称: 扬州恒博科技
0004 ; 模块名 : 点动型STQ执行机构主控程序
0004 ; 创建人 : 章俭文
0004 ; 日期 : 2008/08/19
0004 ; 功能描述: 完成对本地旋钮和远程开关量的控制功能
0004 ; 其它说明: 编译环境为ICCAVR V6.31A
0004 ; 版本 : V1.0
0004 ;
0004 ; **************************************************************/
0004 ; ///////////////////////////////////////////////////////////////
0004 ;
0004 ; #define SCHEDULE_GLOBAL
0004 ; #include "schedule.h"
0004 ;
0004 ;
0004 ; static void SCH_Updata(void);
0004 ;
0004 ;
0004 ; // 在任一时刻要求的任务最大数目
0004 ; #define SCH_MAX_TASKS (3)
0004 ;
0004 ; // 任务队列
0004 ; sTask SCH_tasks_G[SCH_MAX_TASKS];
0004 ;
0004 ; // 错误代码
0004 ; #define ERROR_SCH_TOO_MANY_TASKS (1)
0004 ; #define ERROR_SCH_CANNOT_DELETE_TASK (2)
0004 ;
0004 ; #define RETURN_NORMAL 0
0004 ; #define RETURN_ERROR 1
0004 ;
0004 ;
0004 ;
0004 ;
0004 ; /*---------------------------------------------------------*-
0004 ; * 函数名称: SCH_Dispatch_Tasks()
0004 ; * 入 口:
0004 ; * 出 口:
0004 ; * 函数功能: 调度函数,当一个任务()需要运行时,此函数将运行它,
0004 ; *
0004 ; * 说 明: 这个函数必须被主循环(重复)调用
0004 ; -*---------------------------------------------------------*/
0004 ;
0004 ; void SCH_Dispatch_Tasks(void)
0004 ; {
0004 .dbline 53
0004 ; unsigned char Index;
0004 ;
0004 ; // 调度(运行)下一个任务(如果有任务就绪)
0004 ; for (Index=0; Index<SCH_MAX_TASKS; Index++)
0004 4427 clr R20
0006 32C0 xjmp L8
0008 L5:
0008 .dbline 54
0008 ; {
0008 .dbline 55
0008 ; if (SCH_tasks_G[Index].RunMe > 0)
0008 87E0 ldi R24,7
000A 849F mul R24,R20
000C F001 movw R30,R0
000E 80E0 ldi R24,<_SCH_tasks_G+6
0010 90E0 ldi R25,>_SCH_tasks_G+6
0012 E80F add R30,R24
0014 F91F adc R31,R25
0016 2080 ldd R2,z+0
0018 3324 clr R3
001A 3214 cp R3,R2
001C 30F5 brsh L9
001E .dbline 56
001E ; {
001E .dbline 58
001E ; // 运行任务
001E ; (*SCH_tasks_G[Index].pTask)();
001E 87E0 ldi R24,7
0020 849F mul R24,R20
0022 F001 movw R30,R0
0024 80E0 ldi R24,<_SCH_tasks_G
0026 90E0 ldi R25,>_SCH_tasks_G
0028 E80F add R30,R24
002A F91F adc R31,R25
002C A081 ldd R26,z+0
002E B181 ldd R27,z+1
0030 FD01 movw R30,R26
0032 0E940000 xcall xicall
0036 .dbline 61
0036 ;
0036 ; // 复位 / 降低RunMe标志
0036 ; SCH_tasks_G[Index].RunMe -= 1;
0036 87E0 ldi R24,7
0038 849F mul R24,R20
003A 1001 movw R2,R0
003C 80E0 ldi R24,<_SCH_tasks_G+6
003E 90E0 ldi R25,>_SCH_tasks_G+6
0040 280E add R2,R24
0042 391E adc R3,R25
0044 F101 movw R30,R2
0046 8081 ldd R24,z+0
0048 8150 subi R24,1
004A 8083 std z+0,R24
004C .dbline 64
004C ;
004C ; // 如果这个是'单次'任务,将它从队列中删除
004C ; if (SCH_tasks_G[Index].Period == 0)
004C 87E0 ldi R24,7
004E 849F mul R24,R20
0050 F001 movw R30,R0
0052 80E0 ldi R24,<_SCH_tasks_G+4
0054 90E0 ldi R25,>_SCH_tasks_G+4
0056 E80F add R30,R24
0058 F91F adc R31,R25
005A 2080 ldd R2,z+0
005C 3180 ldd R3,z+1
005E 2220 tst R2
0060 21F4 brne L13
0062 3320 tst R3
0064 11F4 brne L13
0066 X0:
0066 .dbline 65
0066 ; {
0066 .dbline 66
0066 ; SCH_Delete_Task(Index);
0066 042F mov R16,R20
0068 49D0 xcall _SCH_Delete_Task
006A .dbline 67
006A ; }
006A L13:
006A .dbline 68
006A ; }
006A L9:
006A .dbline 69
006A L6:
006A .dbline 53
006A 4395 inc R20
006C L8:
006C .dbline 53
006C 4330 cpi R20,3
006E 08F4 brsh X1
0070 CBCF xjmp L5
0072 X1:
0072 .dbline -2
0072 L4:
0072 0E940000 xcall pop_gset1
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbsym r Index 20 c
0078 .dbend
0078 .dbfunc e SCH_Add_Task _SCH_Add_Task fc
0078 ; Index -> R20
0078 ; PERIOD -> y+2
0078 ; DELAY -> R18,R19
0078 ; pFunction -> R16,R17
.even
0078 _SCH_Add_Task::
0078 0E940000 xcall push_gset1
007C .dbline -1
007C .dbline 91
007C ; }
007C ; }
007C ;
007C ;
007C ;
007C ; /*---------------------------------------------------------*-
007C ; * 函数名称: SCH_Add_Task()
007C ; * 入 口: (*pFunction)任务指针,(DELAY)到第一次运行间隔时标,
007C ; * (PERIOD)每次运行的间隔时标
007C ; *
007C ; * 出 口: 返回SCH_MAX_TASKS表示任务队列已满
007C ; * 返回(Index)=任务位置
007C ; *
007C ; * 函数功能: 用来添加任务到任务队列上,以保证它们在需要的时
007C ; * 候被调用
007C ; *
007C ; * 说 明: 使任务函数每隔一定间隔或在用户的延迟之后执行.
007C ; -*---------------------------------------------------------*/
007C ;
007C ; unsigned char SCH_Add_Task(void (*pFunction)(), // 任务指针
007C ; const unsigned int DELAY, // 延迟Delay个时标后函数将第一次运行
007C ; const unsigned int PERIOD) // 连续的运行之间的间隔(时标)
007C ; {
007C .dbline 92
007C ; unsigned char Index = 0; // 首先在队列中找到一个空隙
007C 4427 clr R20
007E 01C0 xjmp L18
0080 L17:
0080 .dbline 95
0080 .dbline 96
0080 4395 inc R20
0082 .dbline 97
0082 L18:
0082 .dbline 94
0082 ;
0082 ; while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
0082 87E0 ldi R24,7
0084 849F mul R24,R20
0086 F001 movw R30,R0
0088 80E0 ldi R24,<_SCH_tasks_G
008A 90E0 ldi R25,>_SCH_tasks_G
008C E80F add R30,R24
008E F91F adc R31,R25
0090 2080 ldd R2,z+0
0092 3180 ldd R3,z+1
0094 2220 tst R2
0096 11F4 brne X2
0098 3320 tst R3
009A 11F0 breq L20
009C X2:
009C 4330 cpi R20,3
009E 80F3 brlo L17
00A0 L20:
00A0 .dbline 98
00A0 ; {
00A0 ; Index++;
00A0 ; }
00A0 ; if (Index == SCH_MAX_TASKS)
00A0 4330 cpi R20,3
00A2 11F4 brne L21
00A4 .dbline 99
00A4 ; {
00A4 .dbline 100
00A4 ; return SCH_MAX_TASKS; // 同时返回错误代码
00A4 03E0 ldi R16,3
00A6 27C0 xjmp L16
00A8 L21:
00A8 .dbline 104
00A8 ; }
00A8 ;
00A8 ; // 如果能运行到这里,则说明任务队列中有空间
00A8 ; SCH_tasks_G[Index].pTask = pFunction;
00A8 87E0 ldi R24,7
00AA 849F mul R24,R20
00AC F001 movw R30,R0
00AE 80E0 ldi R24,<_SCH_tasks_G
00B0 90E0 ldi R25,>_SCH_tasks_G
00B2 E80F add R30,R24
00B4 F91F adc R31,R25
00B6 1183 std z+1,R17
00B8 0083 std z+0,R16
00BA .dbline 105
00BA ; SCH_tasks_G[Index].Delay = DELAY;
00BA 87E0 ldi R24,7
00BC 849F mul R24,R20
00BE F001 movw R30,R0
00C0 80E0 ldi R24,<_SCH_tasks_G+2
00C2 90E0 ldi R25,>_SCH_tasks_G+2
00C4 E80F add R30,R24
00C6 F91F adc R31,R25
00C8 3183 std z+1,R19
00CA 2083 std z+0,R18
00CC .dbline 106
00CC ; SCH_tasks_G[Index].Period = PERIOD;
00CC 87E0 ldi R24,7
00CE 849F mul R24,R20
00D0 F001 movw R30,R0
00D2 80E0 ldi R24,<_SCH_tasks_G+4
00D4 90E0 ldi R25,>_SCH_tasks_G+4
00D6 E80F add R30,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -