📄 os_time.dt
字号:
/*
*********************************************************************************************************
* 时间延时操作 (n 从 0 到 255)
*
* 功能 : 系统定时程序,如果延时为0,则不进行操作
*
* 入口参数 : a a存放需要定时的OSTick个数,每个OSTick为 4ms
* 4ms*a = delay time
* 例如:
* mov a,@5
* call OSTimeDly
* 则总定时时间为:
* 4ms * 5 = 20ms
* 出口参数 : none
*********************************************************************************************************
*/
OSTimeDly:
mov OSTemp0,a
xor a,@0
jbs psw,z
jmp OSTime_NOT_ZERO
OSTime_ZERO: ; 如果定时时间为0,强制定时一个OSTick
mov a,@1
mov OSTemp0,a
OSTime_NOT_ZERO:
;-----------------------------------
mov a,@DlyCount0 ; 指针指向 DlyCount0
mov r4,a
mov a,OSFlag
and a,@0x07 ; 取出当前任务ID ,这个ID是存放在OSFlag的低3位的。
add r4,a ; DlyCount0+任务ID得到的偏移 = 指向目标 DlyCount
mov a,OSTemp0
mov r0,a
mov a,ShieldQueue
or WaitQueue,a ; 加入等待队列,进入等待状态
coma ShieldQueue
and TaskQueue,a ; 退出任务队列,退出就绪状态
ret
/*
*********************************************************************************************************
* 时间处理的调度操作
*
* 功能 : 根据等待队列(WaitQueue)对相应的任务的延时计时器(DlyCount)进行减操作
* 当减到0时认为任务延时结束,将WaitQueue相应位置0,任务队列(TaskQueue)的
* 相应位置1,让任务重新加入任务队列操作。
*
* 入口参数 : none 每当OSTick刷新(4ms)一次进入一次。OSTick的刷新由系统标志OSFlag的TickReflash
* 位记录。
* 出口参数 : none
*********************************************************************************************************
*/
OSTimeSchedule:
jbs OSFlag,TickReflash ; 每个OSTick进入
ret
bc OSFlag,TickReflash
;-----------------------------------
mov a,@OS_TASK_MAX ; 根据最大任务个数决定循环次数
mov OSTemp0,a
mov a,WaitQueue ; 将两个队列用系统缓存来操作,这样就可以
mov OSTemp1,a ; 可以不用破坏原来的队列的数据了
mov a,@DlyCount0-1 ; 因为下面会多执行一次inc操作,所以这里
mov r4,a ; 指向DlyCount0之前的一个寄存器,可以理解为指针
clr OSTemp2
clr OSTemp3
OSTimeLoop:
rrc OSTemp2 ; 可以理解为蒙板,将相应的队列的位进行置1或0的操作
rrc OSTemp3
bs OSTemp2,7
bc OSTemp3,7
inc r4
bc psw,c
rrc OSTemp1
jbs psw,c
jmp OSTimeLoop_end
dec r0 ; 如果相应的DlyCount为0,则认为延时时间到了
mov a,r0
xor a,@0
jbs psw,z
jmp OSTimeLoop_end
bc OSTemp2,7 ; 在蒙板处做特殊处理,标识出延时到了的任务
bs OSTemp3,7
OSTimeLoop_end:
djz OSTemp0 ; 循环
jmp OSTimeLoop
mov a,OSTemp2 ; 用蒙板跟等待队列和就绪队列操作
and WaitQueue,a ; 将定时完的任务退出等待队列
mov a,OSTemp3
or TaskQueue,a ; 将定时完的任务加入就绪队列
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -