📄 schedule.s
字号:
ldi R25,>_SCH_tasks_G+6
add R30,R24
adc R31,R25
std z+0,R2
.dbline 145
;
; return Return_code;
mov R16,R20
.dbline -2
L26:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Return_code 20 c
.dbsym r TASK_INDEX 16 kc
.dbend
.dbfunc s SCH_Updata _SCH_Updata fV
; Index -> R16
.even
_SCH_Updata:
.dbline -1
.dbline 160
; }
;
;
; /*---------------------------------------------------------*-
; * 函数名称: SCH_Update()
; * 入 口:
; * 出 口:
; * 函数功能: 在调度器的中断服务程序中运行
; *
; * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的
; * RunMe标志加1,然后该任务将由调度程序执行.
; -*---------------------------------------------------------*/
;
; static void SCH_Updata(void)
; {
.dbline 162
; unsigned char Index;
; for (Index=0; Index < SCH_MAX_TASKS; Index++)
clr R16
xjmp L36
L33:
.dbline 163
; {
.dbline 165
; // 检测这里是否有任务?
; if (SCH_tasks_G[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 X4
tst R3
brne X7
xjmp L37
X7:
X4:
.dbline 166
; {
.dbline 167
; if (SCH_tasks_G[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
ldd R2,z+0
ldd R3,z+1
tst R2
breq X8
xjmp L39
X8:
tst R3
breq X9
xjmp L39
X9:
X5:
.dbline 168
; {
.dbline 169
; SCH_tasks_G[Index].RunMe += 1; // RunMer标志加1
ldi R24,7
mul R24,R16
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,255 ; addi 1
std z+0,R24
.dbline 170
; if (SCH_tasks_G[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
ldd R2,z+0
ldd R3,z+1
tst R2
brne X6
tst R3
breq L40
X6:
.dbline 171
; {
.dbline 173
; // 调度定期的任务再次运行
; SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
ldi R24,7
mul R24,R16
ldi R24,<_SCH_tasks_G+4
ldi R25,>_SCH_tasks_G+4
movw R30,R0
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldi R24,<_SCH_tasks_G+2
ldi R25,>_SCH_tasks_G+2
movw R30,R0
add R30,R24
adc R31,R25
std z+1,R3
std z+0,R2
.dbline 174
; }
.dbline 175
; }
xjmp L40
L39:
.dbline 177
; else
; {
.dbline 179
; // 还没有准备好运行,延迟减1
; SCH_tasks_G[Index].Delay -= 1;
ldi R24,7
mul R24,R16
movw R2,R0
ldi R24,<_SCH_tasks_G+2
ldi R25,>_SCH_tasks_G+2
add R2,R24
adc R3,R25
movw R30,R2
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
std z+1,R25
std z+0,R24
.dbline 180
; }
L40:
.dbline 181
; }
L37:
.dbline 182
L34:
.dbline 162
inc R16
L36:
.dbline 162
cpi R16,3
brsh X10
xjmp L33
X10:
.dbline -2
L32:
.dbline 0 ; func end
ret
.dbsym r Index 16 c
.dbend
.dbfunc e InitTimer1 _InitTimer1 fV
; i -> R20
.even
_InitTimer1::
xcall push_gset1
.dbline -1
.dbline 195
; }
; }
;
;
; /*---------------------------------------------------------*-
; * 函数名称: SCH_Init_Timer2()
; * 入 口:
; * 出 口:
; * 函数功能: 准备调度器数据结构并且设置定时器以所需的频率中断
; *
; * 说 明: 调度器初始化化函数,必须在使用调度器之前调用它
; -*---------------------------------------------------------*/
; void InitTimer1(void) //8MHz,10ms,64分频
; {
.dbline 198
; uchar i;
;
; for (i=0; i<SCH_MAX_TASKS; i++)
clr R20
xjmp L53
L50:
.dbline 199
.dbline 200
mov R16,R20
xcall _SCH_Delete_Task
.dbline 201
L51:
.dbline 198
inc R20
L53:
.dbline 198
cpi R20,3
brlo L50
.dbline 203
; {
; SCH_Delete_Task(i);
; }
;
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 204
; TCNT1H = 0xFB; //setup
ldi R24,251
out 0x2d,R24
.dbline 205
; TCNT1L = 0x1E;
ldi R24,30
out 0x2c,R24
.dbline 206
; OCR1AH = 0x04;
ldi R24,4
out 0x2b,R24
.dbline 207
; OCR1AL = 0xE2;
ldi R24,226
out 0x2a,R24
.dbline 208
; OCR1BH = 0x04;
ldi R24,4
out 0x29,R24
.dbline 209
; OCR1BL = 0xE2;
ldi R24,226
out 0x28,R24
.dbline 210
; ICR1H = 0x04;
ldi R24,4
out 0x27,R24
.dbline 211
; ICR1L = 0xE2;
ldi R24,226
out 0x26,R24
.dbline 212
; TCCR1A = 0x00;
out 0x2f,R2
.dbline 213
; TCCR1B = 0x03; //start Timer
ldi R24,3
out 0x2e,R24
.dbline -2
L49:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.area vector(rom, abs)
.org 32
jmp _SCH_Update_Server
.area text(rom, con, rel)
.dbfile E:\_ING\文档\_STQ\easy-STQ-20080712\schedule.c
.dbfunc e SCH_Update_Server _SCH_Update_Server fV
.even
_SCH_Update_Server::
xcall push_lset
.dbline -1
.dbline 228
; }
;
;
; /*---------------------------------------------------------*-
; * 函数名称: SCH_Update_Server()
; * 入 口:
; * 出 口:
; * 函数功能: 调度器的中断服务程序
; *
; * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的
; * RunMe标志加1,然后该任务将由调度程序执行.
; -*---------------------------------------------------------*/
; #pragma interrupt_handler SCH_Update_Server:9 //定时器溢出中断
; void SCH_Update_Server(void)
; {
.dbline 229
; TCNT1H = 0xFB; //reload counter value
ldi R24,251
out 0x2d,R24
.dbline 230
; TCNT1L = 0x1E;
ldi R24,30
out 0x2c,R24
.dbline 232
;
; TimeTick++;
lds R24,_TimeTick
subi R24,255 ; addi 1
sts _TimeTick,R24
.dbline 233
; MotorDelayTime++;
lds R24,_MotorDelayTime
lds R25,_MotorDelayTime+1
adiw R24,1
sts _MotorDelayTime+1,R25
sts _MotorDelayTime,R24
.dbline 236
;
;
; if(TimeTick%100 == 0) //1s喂狗
ldi R17,100
lds R16,_TimeTick
xcall mod8u
tst R16
brne L55
.dbline 237
; {
.dbline 238
; if(TimeTick == 200)TimeTick = 0;
lds R24,_TimeTick
cpi R24,200
brne L57
.dbline 238
clr R2
sts _TimeTick,R2
L57:
.dbline 239
; OutWdServer();
xcall _OutWdServer
.dbline 240
; }
L55:
.dbline 243
;
;
; SCH_Updata();
xcall _SCH_Updata
.dbline -2
L54:
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e SCH_Start _SCH_Start fV
.even
_SCH_Start::
.dbline -1
.dbline 259
;
; }
;
;
; /*---------------------------------------------------------*-
; * 函数名称: SCH_Start()
; * 入 口:
; * 出 口:
; * 函数功能: 通过允许中断来启动调度器
; *
; * 说 明: 在添加了所有定期的任务之后调用,从而使任务保持同步.
; * 注意:应该只使能调度器中断
; -*---------------------------------------------------------*/
;
; void SCH_Start(void)
; {
.dbline 260
; SEI();
sei
.dbline -2
L59:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile E:\_ING\文档\_STQ\easy-STQ-20080712\schedule.c
_SCH_tasks_G::
.blkb 21
.dbstruct 0 7 .3
.dbfield 0 pTask pfV
.dbfield 2 Delay i
.dbfield 4 Period i
.dbfield 6 RunMe c
.dbend
.dbsym e SCH_tasks_G _SCH_tasks_G A[21:3]S[.3]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -