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

📄 os_cpu_a.s43

📁 采用C++改写的uCOS-II,目标系统为MSP430系列CPU。
💻 S43
字号:
#include   <msp430x14x.h>

;*******************************************************************************
;                                   保存寄存器宏 
;*******************************************************************************
PUSHALL     MACRO
            push     r4
            push     r5
            push     r6
            push     r7
            push     r8
            push     r9
            push     r10
            push     r11
            push     r12
            push     r13
            push     r14
            push     r15         
            ENDM
POPALL      MACRO
            pop      r15
            pop      r14
            pop      r13
            pop      r12
            pop      r11
            pop      r10
            pop      r9
            pop      r8
            pop      r7
            pop      r6
            pop      r5
            pop      r4          
            ENDM
            
;*********************************************************************************
;                                  公共和外部变量声明
;*********************************************************************************

            EXTERN  OSIntExit
            EXTERN  OSIntNesting

            EXTERN  OSISRStkPtr

            EXTERN  OSPrioCur
            EXTERN  OSPrioHighRdy

            EXTERN  OSRunning

            EXTERN  OSTCBCur
            EXTERN  OSTCBHighRdy

            EXTERN  OSTimeTick
            
            EXTERN  SetQuickTask1_Rdy
            EXTERN  SetQuickTask2_Rdy
            
            PUBLIC  OSCtxSw
            PUBLIC  OSCPURestoreSR
            PUBLIC  OSCPUSaveSR
            PUBLIC  OSIntCtxSw
            PUBLIC  OSStartHighRdy
            PUBLIC  TIMERA_ISR

;*******************************************************************************
;                                 系统开始运行最高任务
;*******************************************************************************

            RSEG    CODE                    ; 程序代码

OSStartHighRdy
            mov.b    #1, &OSRunning         ;设置系统运行标志

            mov.w    SP, &OSISRStkPtr       ;保存中断堆栈(中断堆栈为开始时系统分配堆栈)              

            mov.w    &OSTCBHighRdy, R13     ;装载最高优先级堆栈
            mov.w    @R13, SP

            POPALL                          ;
             
            reti                            ;仿真中断返回
 

;*******************************************************************************
;                                任务级切换程序        
;*******************************************************************************

OSCtxSw
            push      sr                    ; 仿真中断响应,保存状态寄存器
            PUSHALL                         ; 
             
            mov.w     &OSTCBCur, R13        ; 保存当前任务堆栈指针
            mov.w     SP, 0(R13)

            mov.b     &OSPrioHighRdy, R13   ; 刷新当前优先级为最高优先级
            mov.b     R13, &OSPrioCur       ;
                          
            mov.w     &OSTCBHighRdy, R13    ; 设置当前任务为最高优先级任务
            mov.w     R13, &OSTCBCur        ;
                          
            mov.w     @R13, SP              ; 设置堆栈指针到最高优先级堆栈指针
             
            POPALL                          ; 
             
            reti                            ; 仿真中断返回


;*******************************************************************************
;                                中断级切换程序  
;*******************************************************************************

OSIntCtxSw             
            mov.b     &OSPrioHighRdy, R13   ; 刷新当前优先级为最高优先级
            mov.b     R13, &OSPrioCur       ;
                          
            mov.w     &OSTCBHighRdy, R13    ; 设置当前任务为最高优先级任务
            mov.w     R13, &OSTCBCur        ;
                          
            mov.w     @R13, SP              ; 设置堆栈指针到最高优先级堆栈指针
             
            POPALL                          ; 
             
            reti                            ; 中断返回


;*******************************************************************************
;                                  系统定时器
;*******************************************************************************

TIMERA_ISR                                  ; tiumera  ISR
            ADD &TAIV,PC
            RETI
            JMP CCIFG1_ISR
            JMP CCIFG2_ISR
            RETI
            RETI
TAIFG_ISR            
            PUSHALL                         ;

            cmp.b    #0, &OSIntNesting      ; 如果没有中断嵌套,装载中断堆栈
            jne      TMA_ISR_1                           
            mov.w    &OSTCBCur, R13         ; 
            mov.w    SP, 0(R13)
            mov.w    &OSISRStkPtr, SP       ; 
TMA_ISR_1
            inc.b    &OSIntNesting          ; 中断嵌套计数加1

            eint                            ; 允许中断
            call     #OSTimeTick            ; 调用系统Tick程序              
            dint                            ; 不允许中断
            
            call     #OSIntExit             ; 调用中断级调度程序,如果调度成功将不运行下面程序
            
            cmp.b    #0, &OSIntNesting      ; 如果没有中断嵌套,返回到最高优先级任务
            jne      TMA_ISR_2            
            mov.w    &OSTCBHighRdy, R13     ;
            mov.w    @R13, SP                       
TMA_ISR_2               
            POPALL                          ;
            reti                            ; 中断返回
                                           
CCIFG1_ISR
            reti

CCIFG2_ISR
            reti

;*******************************************************************************
;                             临界方式(OS_CRITICAL_METHOD)为3时的防护程序
;*******************************************************************************

OSCPUSaveSR
            DINT
            MOV.W    SR,R12                 ;得到状态寄存器(程序返回值放在R12中)
            RET


OSCPURestoreSR
            MOV.W    R12,SR                 ;恢复状态寄存器(程序参数放在R12中)
            EINT
            RET

;*******************************************************************************
;                                  MSP中断矢量
;*******************************************************************************
            COMMON  INTVEC

            ORG     TIMERA1_VECTOR 
TMA_VEC     DW      TIMERA_ISR                 ; interrupt vector

            END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -