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

📄 os_cpu_a.lis

📁 mega16 ucos操作系统
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 0000           ;*******************************************************************************
 0000           ;                                               uC/OS-II
 0000           ;                                         The Real-Time Kernel
 0000           ;
 0000           ;                                       ATmega128  Specific code
 0000           ;                                           ICC AVR Compiler
 0000           ;
 0000           ;
 0000           ; File     : OS_CPU_A.s
 0000           ; By       : Jean J. Labrosse
 0000           ;*******************************************************************************
 0000           
 0001           BIT00   = 0x01
 0002           BIT01   = 0x02
 0004           BIT02   = 0x04
 0008           BIT03   = 0x08
 0010           BIT04   = 0x10
 0020           BIT05   = 0x20
 0040           BIT06   = 0x40
 0080           BIT07   = 0x80
 0000           ;*******************************************************************************
 0000           ;                 I/O PORT ADDRESSES
 0000           ;*******************************************************************************
 0000           
 0000           
 003F           SREG    = 0x3F
 003E           SPH     = 0x3E
 003D           SPL     = 0x3D
 0032           TCNT0   = 0x32
 0000           
 0000           
 0000           ;*******************************************************************************
 0000           ;                MACROS
 0000           ;*******************************************************************************
 0000           
 0000           				; Push registers
 0000                                           .macro PUSHRS
 0000                           ST      -Y,R0   
 0000                           ST      -Y,R1
 0000                           ST      -Y,R2
 0000                           ST      -Y,R3
 0000                           ST      -Y,R4
 0000                           ST      -Y,R5
 0000                           ST      -Y,R6
 0000                           ST      -Y,R7
 0000                           ST      -Y,R8
 0000                           ST      -Y,R9
 0000                           ST      -Y,R10
 0000                           ST      -Y,R11
 0000                           ST      -Y,R12
 0000                           ST      -Y,R13
 0000                           ST      -Y,R14
 0000                           ST      -Y,R15
 0000                           ST      -Y,R16
 0000                           ST      -Y,R17
 0000                           ST      -Y,R18
 0000                           ST      -Y,R19
 0000                           ST      -Y,R20
 0000                           ST      -Y,R21
 0000                           ST      -Y,R22
 0000                           ST      -Y,R23
 0000                           ST      -Y,R24
 0000                           ST      -Y,R25
 0000                           ST      -Y,R26
 0000                           ST      -Y,R27
 0000                           ST      -Y,R30
 0000                           ST      -Y,R31               
 0000                           .macro POPRS                
 0000                           LD      R31,Y+
 0000                           LD      R30,Y+
 0000                           LD      R27,Y+
 0000                           LD      R26,Y+
 0000                           LD      R25,Y+
 0000                           LD      R24,Y+
 0000                           LD      R23,Y+
 0000                           LD      R22,Y+
 0000                           LD      R21,Y+
 0000                           LD      R20,Y+
 0000                           LD      R19,Y+
 0000                           LD      R18,Y+
 0000                           LD      R17,Y+
 0000                           LD      R16,Y+
 0000                           LD      R15,Y+
 0000                           LD      R14,Y+
 0000                           LD      R13,Y+
 0000                           LD      R12,Y+
 0000                           LD      R11,Y+
 0000                           LD      R10,Y+
 0000                           LD      R9,Y+
 0000                           LD      R8,Y+
 0000                           LD      R7,Y+
 0000                           LD      R6,Y+
 0000                           LD      R5,Y+
 0000                           LD      R4,Y+
 0000                           LD      R3,Y+
 0000                           LD      R2,Y+
 0000                           LD      R1,Y+
 0000                           LD      R0,Y+
 0000                           .macro PUSHSP
 0000                           IN      R16,SPH
 0000                           ST      -Y,R16
 0000                           IN      R16,SPL
 0000                           ST      -Y,R16
 0000                           .macro POPSP
 0000                           LD      R16,Y+
 0000                           OUT     SPL,R16
 0000                           LD      R16,Y+
 0000                           OUT     SPH,R16
 0000                                           .macro PUSHSREG
 0000                           IN      R16,SREG
 0000                           ST      -Y,R16
 0000                           .macro POPSREG
 0000                           LD      R16,Y+
 0000                                           CBR     R16,BIT07
 0000                           OUT     SREG,R16
                                .area    text(rel)
                
                ;/*$PAGE*/
                ;********************************************************************************************************
                ;                            DISABLE/ENABLE INTERRUPTS USING OS_CRITICAL_METHOD #3
                ;
                ; Description : These functions are used to disable and enable interrupts using OS_CRITICAL_METHOD #3.
                ;
                ;               OS_CPU_SR  OSCPUSaveSR (void)
                ;                     Get current value of SREG
                ;                     Disable interrupts
                ;                     Return original value of SREG
                ;
                ;               void  OSCPURestoreSR (OS_CPU_SR cpu_sr)
                ;                     Set SREG to cpu_sr
                ;                     Return
                ;********************************************************************************************************
                
 0000           _OS_CPU_SR_Save::
 0000 0FB7                      IN      R16,SREG                    ; Get current state of interrupts disable flag
 0002 F894                      CLI                                 ; Disable interrupts
 0004 0895                      RET                                 ; Return original SREG value in R16
 0006           
 0006           
 0006           _OS_CPU_SR_Restore::
 0006 0FBF                      OUT     SREG,R16                    ; Restore SREG
 0008 0895                      RET                                 ; Return
 000A                                           
 000A           ;*******************************************************************************
 000A           ;               START HIGHEST PRIORITY TASK READY-TO-RUN
 000A           ;
 000A           ; Description : This function is called by OSStart() to start the highest
 000A           ; priority task that was created by your application before calling OSStart().
 000A           ;
 000A           ; Note(s):
 000A           ;       1) The (data)stack frame is assumed to look as follows:
 000A           ;
 000A           ;               OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
 000A           ;                                                                               MSB of (return) stack pointer
 000A           ;                                                                               Flags to load in status register
 000A           ;                                                                               R31
 000A           ;                                                                               R30
 000A           ;                                                                               R7
 000A           ;                                                                               .
 000A           ;                                                                               .
 000A           ;                                                                               .
 000A           ;                                                                               R0  (High memory)
 000A           ;
 000A           ;               where the stack pointer points to the task start address.
 000A           ;
 000A           ;
 000A           ;       2) OSStartHighRdy() MUST:
 000A           ;               a) Call OSTaskSwHook() then,
 000A           ;               b) Set OSRunning to TRUE,
 000A           ;               c) Switch to the highest priority task.
 000A           ;*******************************************************************************
 000A           
 000A           _OSStartHighRdy:: 
 000A 0E940000          CALL    _OSTaskSwHook           ; Invoke user defined context switch hook
 000E 00910000          LDS     R16,_OSRunning          ; Indicate that we are multitasking
 0012 0395              INC     R16                                     
 0014 00930000          STS     _OSRunning,R16          ;
 0018               
 0018 E0910000          LDS     R30,_OSTCBHighRdy       ; Let Z point to TCB of highest priority task
 001C F0910100          LDS     R31,_OSTCBHighRdy+1     ; ready to run
 0020 C191              LD      R28,Z+                          ; Load Y (R29:R28) pointer
 0022 D191              LD      R29,Z+                          ;
 0024              
 0024 0991                      LD      R16,Y+
 0026 0DBF                      OUT     SPL,R16
 0028 0991                      LD      R16,Y+
 002A 0EBF                      OUT     SPH,R16
 002C 0991                      LD      R16,Y+
 002E 0F77                                      CBR     R16,BIT07
 0030 0FBF                      OUT     SREG,R16
 0032 F991                      LD      R31,Y+
 0034 E991                      LD      R30,Y+
 0036 B991                      LD      R27,Y+
 0038 A991                      LD      R26,Y+
 003A 9991                      LD      R25,Y+
 003C 8991                      LD      R24,Y+
 003E 7991                      LD      R23,Y+
 0040 6991                      LD      R22,Y+
 0042 5991                      LD      R21,Y+
 0044 4991                      LD      R20,Y+
 0046 3991                      LD      R19,Y+
 0048 2991                      LD      R18,Y+
 004A 1991                      LD      R17,Y+
 004C 0991                      LD      R16,Y+
 004E F990                      LD      R15,Y+
 0050 E990                      LD      R14,Y+
 0052 D990                      LD      R13,Y+
 0054 C990                      LD      R12,Y+
 0056 B990                      LD      R11,Y+
 0058 A990                      LD      R10,Y+
 005A 9990                      LD      R9,Y+
 005C 8990                      LD      R8,Y+
 005E 7990                      LD      R7,Y+
 0060 6990                      LD      R6,Y+
 0062 5990                      LD      R5,Y+
 0064 4990                      LD      R4,Y+
 0066 3990                      LD      R3,Y+
 0068 2990                      LD      R2,Y+
 006A 1990                      LD      R1,Y+
 006C 0990                      LD      R0,Y+
 006E 1895              RETI                    ; start task
 0070           
 0070           ;*******************************************************************************
 0070           ;                 TASK LEVEL CONTEXT SWITCH
 0070           ;
 0070           ; Description : This function is called when a task makes a higher priority task
 0070           ; ready-to-run.
 0070           ;
 0070           ; Note(s):
 0070           ;       1) Upon entry,
 0070           ;               OSTCBCur     points to the OS_TCB of the task to suspend
 0070           ;               OSTCBHighRdy points to the OS_TCB of the task to resume
 0070           ;
 0070           ;       2) The stack frame of the task to suspend looks as follows:
 0070           ;
 0070           ;               SP      +0 --> LSB of task code address
 0070           ;                       +1     MSB of task code address (High memory)
 0070           ;
 0070           ;       3) The saved context of the task to resume looks as follows:
 0070           ;
 0070           ;               OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
 0070           ;                                     MSB of (return) stack pointer
 0070           ;                                     Flags to load in status register
 0070           ;                                     R31
 0070           ;                                     R30
 0070           ;                                     R7
 0070           ;                                     .
 0070           ;                                     .
 0070           ;                                     .
 0070           ;                                     R0    (High memory)
 0070           ;*******************************************************************************
 0070           
 0070           _OSCtxSw::
 0070 0A92                      ST      -Y,R0   
 0072 1A92                      ST      -Y,R1
 0074 2A92                      ST      -Y,R2
 0076 3A92                      ST      -Y,R3
 0078 4A92                      ST      -Y,R4
 007A 5A92                      ST      -Y,R5

⌨️ 快捷键说明

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