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

📄 rtos.s43

📁 一个MSP430单片机的实时操作系统的框架程序
💻 S43
📖 第 1 页 / 共 2 页
字号:
;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 + -