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

📄 os_cpu_a.lst

📁 该源码是本人经调试通过的UCOS2操作系统在51单片机上移植好的源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
A51 MACRO ASSEMBLER  OS_CPU_A                                                             09/30/2006 10:50:44 PAGE     1


MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN os_cpu_a.OBJ
ASSEMBLER INVOKED BY: d:\Keil\C51\BIN\A51.EXE os_cpu_a.asm SET(LARGE) DEBUG EP

LOC  OBJ            LINE     SOURCE

                       1     $nomod51 
  00AF                 2     EA BIT 0A8H.7
  0081                 3     SP DATA 081H
  00F0                 4     B DATA 0F0H
  00E0                 5     ACC DATA 0E0H
  0083                 6     DPH DATA 083H
  0082                 7     DPL DATA 082H
  00D0                 8     PSW DATA 0D0H
  008C                 9     TR0 BIT 088H.4
  008C                10     TH0 DATA 08CH
  008A                11     TL0 DATA 08AH
                      12     
                      13     NAME OS_CPU_A ;模块名
                      14     
                      15     ;定义重定位段
                      16     ?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
                      17     ?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
                      18     ?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
                      19     ?PR?OSTickISR?OS_CPU_A SEGMENT CODE
                      20     
                      21     
                      22     
                      23     ;声明引用全局变量和外部子程序
                      24     EXTRN IDATA (OSTCBCur)
                      25     EXTRN IDATA (OSTCBHighRdy)
                      26     EXTRN IDATA (OSRunning)
                      27     EXTRN IDATA (OSPrioCur)
                      28     EXTRN IDATA (OSPrioHighRdy)
                      29     
                      30     ;EXTRN CODE (_?OSTaskSwHook)
                      31     ;EXTRN CODE (_?serial)
                      32     EXTRN CODE (_?OSIntEnter)
                      33     EXTRN CODE (_?OSIntExit)
                      34     EXTRN CODE (_?OSTimeTick) 
                      35     
                      36     ;对外声明4个不可重入函数
                      37     PUBLIC OSStartHighRdy
                      38     PUBLIC OSCtxSw
                      39     PUBLIC OSIntCtxSw
                      40     PUBLIC OSTickISR
                      41     
                      42     ;PUBLIC SerialISR 
                      43     
                      44     ;分配堆栈空间。只关心大小,堆栈起点由keil决定,通过标号可以获得keil分配的SP起点。
                      45     ?STACK SEGMENT IDATA
----                  46     RSEG ?STACK
0000                  47     OSStack:
0000                  48     DS 40H
  FFFF                49     OSStkStart IDATA OSStack-1
                      50     
                      51     ;定义压栈出栈宏
                      52     PUSHALL MACRO
                      53     PUSH PSW
                      54     PUSH ACC
                      55     PUSH B
                      56     PUSH DPL
                      57     PUSH DPH
                      58     MOV A,R0 ;R0-R7入栈
A51 MACRO ASSEMBLER  OS_CPU_A                                                             09/30/2006 10:50:44 PAGE     2

                      59     PUSH ACC
                      60     MOV A,R1
                      61     PUSH ACC
                      62     MOV A,R2
                      63     PUSH ACC
                      64     MOV A,R3
                      65     PUSH ACC
                      66     MOV A,R4
                      67     PUSH ACC
                      68     MOV A,R5
                      69     PUSH ACC
                      70     MOV A,R6
                      71     PUSH ACC
                      72     MOV A,R7
                      73     PUSH ACC
                      74     ;PUSH SP ;不必保存SP,任务切换时由相应程序调整
                      75     ENDM
                      76     
                      77     POPALL MACRO
                      78     ;POP ACC ;不必保存SP,任务切换时由相应程序调整
                      79     POP ACC ;R0-R7出栈
                      80     MOV R7,A
                      81     POP ACC
                      82     MOV R6,A
                      83     POP ACC
                      84     MOV R5,A
                      85     POP ACC
                      86     MOV R4,A
                      87     POP ACC
                      88     MOV R3,A
                      89     POP ACC
                      90     MOV R2,A
                      91     POP ACC
                      92     MOV R1,A
                      93     POP ACC
                      94     MOV R0,A
                      95     POP DPH
                      96     POP DPL
                      97     POP B
                      98     POP ACC
                      99     POP PSW
                     100     ENDM
                     101     
                     102     ;子程序
                     103     ;-------------------------------------------------------------------------
----                 104     RSEG ?PR?OSStartHighRdy?OS_CPU_A
0000                 105     OSStartHighRdy:
                     106     USING 0 ;上电后51自动关中断,此处不必用CLR EA指令,因为到此处还未开中断,本程序退出后,开中
                             断。
                     107     ;LCALL _?OSTaskSwHook
                     108     
0000                 109     OSCtxSw_in:
                     110     
                     111     ;OSTCBCur ===> DPTR 获得当前TCB指针,详见C51.PDF第178页
0000 7800     F      112     MOV R0,#LOW (OSTCBCur) ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据
0002 08              113     INC R0
0003 8683            114     MOV DPH,@R0 ;全局变量OSTCBCur在IDATA中
0005 08              115     INC R0
0006 8682            116     MOV DPL,@R0
                     117     
                     118     ;OSTCBCur->OSTCBStkPtr ===> DPTR 获得用户堆栈指针
0008 A3              119     INC DPTR ;指针占3字节。+0类型+1高8位数据+2低8位数据
0009 E0              120     MOVX A,@DPTR ;.OSTCBStkPtr是void指针
000A F8              121     MOV R0,A
000B A3              122     INC DPTR
000C E0              123     MOVX A,@DPTR
A51 MACRO ASSEMBLER  OS_CPU_A                                                             09/30/2006 10:50:44 PAGE     3

000D F9              124     MOV R1,A
000E 8883            125     MOV DPH,R0
0010 8982            126     MOV DPL,R1
                     127     
                     128     ;*UserStkPtr ===> R5 用户堆栈起始地址内容(即用户堆栈长度放在此处) 详见文档说明 指针用法详见
                             C51.PDF第178页 
0012 E0              129     MOVX A,@DPTR ;用户堆栈中是unsigned char类型数据
0013 FD              130     MOV R5,A ;R5=用户堆栈长度
                     131     
                     132     ;恢复现场堆栈内容
0014 7800     F      133     MOV R0,#OSStkStart
                     134     
0016                 135     restore_stack:
                     136     
0016 A3              137     INC DPTR
0017 08              138     INC R0
0018 E0              139     MOVX A,@DPTR
0019 F6              140     MOV @R0,A
001A DDFA            141     DJNZ R5,restore_stack
                     142     
                     143     ;恢复堆栈指针SP
001C 8881            144     MOV SP,R0
                     145     
                     146     ;OSRunning=TRUE
001E 7800     F      147     MOV R0,#LOW (OSRunning)

⌨️ 快捷键说明

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