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

📄 os_time.dt

📁 义隆单片机上实现的任务调度
💻 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 + -