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

📄 os_cpu_a.asm

📁 从Keil C51 的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决 重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于 Ke
💻 ASM
字号:
/*************************************************************************
*                           Point RTOS(51)                               *
*                 The Real-Time Kernel(For Keil c51)                     *
*                                                                        *
*                     (c) Copyright 2005, PenGH                          *
*                         All Rights Reserved                            *
*                                                                        *
*                               V0.9.1                                   *
*                                                                        *
*        File :  OS_CPU_A.ASM                                            *
*      Author :  彭光红                                                  *
*     History :                                                          *
*                2005/08  By PenGH                                       *
*************************************************************************/


/*----------------------------------------------------------------------*/

#include "..\include\OS_CFG.H"

#define SP_ADD_BYTE  2


NAME    OS_CPU_A

?PR?TimeInt0?OS_CPU_A                    SEGMENT CODE
?PR?OSCtxSw?OS_CPU_A                     SEGMENT CODE
?PR?_OSTaskStkInit?OS_CPU_A              SEGMENT CODE 


    EXTRN   CODE (OSMapTbl)
    EXTRN   DATA (OSTaskID)
    EXTRN   DATA (OSNextTaskID)
    EXTRN   DATA (OSTaskStackBotton)
    EXTRN   DATA (OSWaitTick)
    EXTRN   DATA (OSTaskRuning)

    PUBLIC  TimeInt0
    PUBLIC  _OSTaskStkInit
    PUBLIC  OSCtxSw

    PUBLIC  STACK


;*************************************************************************
; 堆栈空间定义

?STACK      SEGMENT   IDATA

        RSEG    ?STACK
STACK:                                          ;堆栈
        DS  1

CSEG AT 000BH
     LJMP TimeInt0

/*定时器中断使用函数*/
RSEG  ?PR?TimeInt0?OS_CPU_A
TimeInt0:
  USING 0
  PUSH  AR2
  PUSH  AR1
  PUSH  AR0
  PUSH  ACC

  MOV   TL0,#0BFH
  MOV   TH0,#0FCH
  MOV   R2,#(OS_MAX_TASKS+1)
  MOV   A,#OSWaitTick
  MOV   R0,A
  MOV   R1,#1
TimeInt0Loop:
  MOV   A,@R0
  JZ    TimeInt00
  DEC   A
  MOV   @R0,A
  JNZ   TimeInt00
  MOV   A,OSTaskRuning
  CLR   C
  ADD   A,R1;
  MOV   OSTaskRuning,A
TimeInt00:
  INC   R0
  MOV   A,R1
  RL    A
  MOV   R1,A
  DJNZ  R2,TimeInt0Loop
TimeInt0Ret:
  POP   ACC
  POP   AR0
  POP   AR1
  POP   AR2
  reti
  


;*************************************************************************
;
;  MODEL NAME  : OSTaskStkInit
;  DESCRIPTION : 任务堆栈初始
;
;*************************************************************************
RSEG  ?PR?_OSTaskStkInit?OS_CPU_A
_OSTaskStkInit:
;    MOV     A,#LOW (OSTaskStackBotton+1)   ;取得任务栈底
;    ADD     A,R3;
;    MOV     R1,A;   //将指针保存到R1;

;    CJNE    R3,#OS_MAX_TASKS,StkInit0
;    SJMP    StkInit2
;StkInit0:
;    MOV     A,#OS_MAX_TASKS
;    CLR     C
;    SUBB    A,R3
;    MOV     R2,A
;
;StkInit1:
;    MOV     A,#SP_ADD_BYTE
;    ADD     A,@R1;
;    MOV     @R1,A
;    INC     R1;
;    DJNZ    R2,StkInit1;
StkInit2:
    MOV     A,SP;
    MOV     R0,A
    CLR     C
    ADD     A,#SP_ADD_BYTE
    MOV     SP,A
    MOV     R1,A
    MOV     R2,#(SP_ADD_BYTE+2)
MovData:
    MOV     A,@R0;
    MOV     @R1,A
    DEC     R1
    DEC     R0
    DJNZ    R2,MovData;

    MOV     A,R6
    MOV     @R1,A
    MOV     A,R7
    DEC     R1
    MOV     @R1,A
    ret

;*************************************************************************
;
;  MODEL NAME  : OSCtxSW
;  DESCRIPTION : 任务切换,放弃CPU并保存环境
;
;*************************************************************************
RSEG  ?PR?OSCtxSw?OS_CPU_A
OSCtxSw:
    CLR     C
    MOV     A,OSNextTaskID
    SUBB    A,OSTaskID
    JC      StkMov0
    LJMP    StkMov1
StkMov0:
    CPL     A
    INC     A
    MOV     R6,A

    MOV     A,#LOW (OSTaskStackBotton+1)  ;取得下个下级任务的堆栈地址
    CLR     C
    ADD     A,OSNextTaskID;
    MOV     R1,A
    MOV     A,@R1
    MOV     R4,A                        ;

    MOV     A,SP
    DEC     A
    MOV     R0,A
    DEC     R0
    
    CLR     C
    SUBB    A,R4
    MOV     R2,A
    MOV     R3,A

    MOV     A,#LOW (OSTaskStackBotton+1)  ;取得当前下级任务的堆栈地址
    CLR     C
    ADD     A,OSTaskID;
    MOV     R1,A
    MOV     A,@R1
    DEC     A
    MOV     R1,A                        ;
    SUBB    A,R0
    MOV     R5,A
ONE:
    MOV     A,@R0
    MOV     @R1,A
    DEC     R0
    DEC     R1
    DJNZ    R2,ONE

    MOV     A,SP
    MOV     R0,A
    CLR     C
    SUBB    A,R3
    MOV     SP,A
;;;;;;;;;;;;;;;;;
    MOV     R1,A

    MOV     A,@R0
    MOV     @R1,A
    DEC     R0
    DeC     R1
    MOV     A,@R0
    MOV     @R1,A
    
;    MOV     R2,#2
;TWO:
;    MOV     A,@R0
;    MOV     @R1,A
;    DEC     R1
;    DEC     R0
;    DJNZ    R2,TWO
;;;;;;;;;;;;;;
    MOV     A,#LOW (OSTaskStackBotton+1)  ;取得下一个任务的下级堆栈地址
    CLR     C
    ADD     A,OSNextTaskID
    MOV     R1,A
MOVStkThree:
    MOV     A,@R1
    CLR     C
    ADD     A,R5
    MOV     @R1,A
    INC     R1
    DJNZ    R6,MOVStkThree
    MOV     OSTaskID,OSNextTaskID
    ret

StkMov1:
    MOV     R6,A
    MOV     A,#LOW (OSTaskStackBotton+1)  ;取得当前任务的下级堆栈地址
    CLR     C
    ADD     A,OSTaskID;
    MOV     R0,A
    MOV     A,@R0
    MOV     R3,A                          ;当前任务的堆栈

    MOV     A,#LOW (OSTaskStackBotton+1)  ;取得下个任务的堆栈地址
    CLR     C
    ADD     A,OSNextTaskID;
    MOV     R1,A
    MOV     A,@R1
    MOV     R4,A                        ;
    
    CLR     C
    SUBB    A,R3
    MOV     R2,A
    MOV     R5,#2

    MOV     A,SP
    MOV     R1,A
    CLR     C
    ADD     A,R2
    MOV     SP,A
    MOV     R0,A
MOVStkFour:               ;向后移动堆栈
    MOV     A,@R1
    MOV     @R0,A
    DEC     R0
    DEC     R1
    DJNZ    R5,MOVStkFour

    MOV     A,R4
    DEC     A
    MOV     R1,A
MOVStkFive:              ;切换堆栈空间
    MOV     A,@R1
    MOV     @R0,A
    DEC     R1
    DEC     R0
    DJNZ    R2,MOVStkFive

    MOV     A,R1
    CLR     C
    SUBB    A,R0
    MOV     R5,A        ;保存更新值即减数

    MOV     A,#LOW (OSTaskStackBotton+1)  ;取得下个任务的堆栈地址
    CLR     C
    ADD     A,OSTaskID;
    MOV     R0,A
MOVStkSix:
    MOV     A,@R0
    CLR     C
    SUBB    A,R5
    MOV     @R0,A
    INC     R0
    DJNZ    R6,MOVStkSix
    MOV     OSTaskID,OSNextTaskID   
    ret

    END

;   The end of file    ;

⌨️ 快捷键说明

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