📄 rtos.s43
字号:
;push.w #延时时间
;call #OS_Time_Dly
;incd.w sp
;本函数共有7行代码
;------------------------------------------------
push.w SR ;模拟中断发生
dint
push.w r10
mov.w Current_Task,r10
mov.w r12,Task_Tick(r10) ;把任务延时的滴嗒数存入
bic.w #OS_TASK_LOCK,Task_Flag ;解开任务锁
br #OS_Sched_endfor01
;------------------------------------------------
PUBLIC
OS_Sched
;功能:任务调度
;本函数共有51行代码
;------------------------------------------------
push.w r10
clr.w r10
OS_Sched_for01
cmp.w #Task_Count*2-1,r10
jge OS_Sched_endfor01
tst.w Task_Tick(r10)
jz OS_Sched_jmp01 ;如果时钟滴嗒数为0,则不对其进行减1
dec.w Task_Tick(r10) ;对时钟滴嗒数进行减1
OS_Sched_jmp01
incd.w r10
jmp OS_Sched_for01
OS_Sched_endfor01
bit.w #OS_TASK_LOCK,Task_Flag ;检查任务锁是否加上
jnz OS_Sched_exit ;如果任务锁被加上,则不进行调度
clr.w r10
OS_Sched_for02
cmp.w #Task_Count*2-1,r10
jge OS_Sched_jmp06
tst.w Task_Tick(r10) ;检查是否有任务就绪
jz OS_Sched_Task_Switch ;有,则跳转到任务切换
incd.w r10
jmp OS_Sched_for02
OS_Sched_jmp06
tst.w free_task_time_tick
jnz ERROR_USER_PROGRAM
OS_Sched_Task_Switch
cmp.w Current_Task,r10 ;比较就绪任务是不是当前运行的任务
jz OS_Sched_exit ;如果是,转向下一处
cmp.w #Task_Count*2,Current_Task
jz OS_Sched_jmp03
push.w r11 ;保存现场
push.w r12
push.w r13
push.w r14
push.w r15
mov.w Current_Task,r11 ;保存当前任务指针
mov.w sp,Task_SP(r11) ;保存当前任务堆栈指针
OS_Sched_jmp02
mov.w r10,Current_Task ;就绪任务指针保存为当前任务指针
cmp.w #Task_Count*2,r10
jz OS_Sched_jmp05
OS_Sched_jmp04
mov.w Task_SP(r10),sp ;堆栈切换
pop.w r15
pop.w r14
pop.w r13
pop.w r12
pop.w r11
OS_Sched_exit
pop.w r10 ;恢复就绪任务现场
reti
ERROR_USER_PROGRAM
#ifdef debug
dint
jmp ERROR_USER_PROGRAM
#else
br 0fffeh ;CPU复位
#endif
OS_Sched_jmp03
mov.w r10,Current_Task ;就绪任务指针保存为当前任务指针
mov.w sp,free_task_stack_point ;保存当前任务堆栈指针
jmp OS_Sched_jmp04
OS_Sched_jmp05
mov.w free_task_stack_point,sp
jmp OS_Sched_exit
;------------------------------------------------
PUBLIC
OS_Free_Task
;空闲任务
;功能:进行CPU空闲计数
;本函数共有3行代码
;------------------------------------------------
OS_Free_Task_jmp01
inc.w Free_Count ;空闲计数累加
bis.w #OS_FREE_FLAG,Task_Flag ;置上空闲任务标志
jmp OS_Free_Task_jmp01
;------------------------------------------------
PUBLIC
OS_Task_Lock
;禁止任务调度
;本函数共2行代码
;------------------------------------------------
bis.w #OS_TASK_LOCK,Task_Flag
ret
;------------------------------------------------
PUBLIC
OS_Task_Unlock
;允许任务调度
;本函数共2行代码
;------------------------------------------------
bic.w #OS_TASK_LOCK,Task_Flag
ret
;------------------------------------------------
PUBLIC
OS_Task_Wakeup
;功能:唤醒指定优先级的任务
;本函数共有7行代码
;push.w #PRI
;call #OS_Task_Wakeup
;incd.w sp
;------------------------------------------------
push.w SR ;模拟中断发生
dint
OS_Task_Wakeup_I
push.w r10
mov.w r12,r10
add.w r10,r10
clr.w Task_Tick(r10)
br #OS_Sched_endfor01
RSEG DATA16_C
Task0_Info:
DW Task0
DW Task0_Stack
DW Task0_Stack_Point
DW Task0_Time_Tick
DW Task0_Stack_Size*2
Task1_Info:
DW Task1
DW Task1_Stack
DW Task1_Stack_Point
DW Task1_Time_Tick
DW Task1_Stack_Size*2
Task2_Info:
DW Task2
DW Task2_Stack
DW Task2_Stack_Point
DW Task2_Time_Tick
DW Task2_Stack_Size*2
Task3_Info:
DW Task3
DW Task3_Stack
DW Task3_Stack_Point
DW Task3_Time_Tick
DW Task3_Stack_Size*2
RSEG DATA16_N
Task0_Stack:
DS Task0_Stack_Size*2
Task1_Stack:
DS Task1_Stack_Size*2
Task2_Stack:
DS Task2_Stack_Size*2
Task3_Stack:
DS Task3_Stack_Size*2
RSEG DATA16_I
Task_SP:
Task0_Stack_Point:
DS 2
Task1_Stack_Point:
DS 2
Task2_Stack_Point:
DS 2
Task3_Stack_Point:
DS 2
Task_Tick:
Task0_Time_Tick:
DS 2
Task1_Time_Tick:
DS 2
Task2_Time_Tick:
DS 2
Task3_Time_Tick:
DS 2
Current_Task: ds 2
Task_Flag: ds 2
Free_Count: ds 2
free_task_stack_point:
ds 2
free_task_time_tick:
ds 2
RSEG DATA16_Z
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
DW 00h
COMMON INTVEC
ds TIMERA0_VECTOR ;时钟中断向量
dw OS_Sched
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -