📄 schedule.s
字号:
.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 + -