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

📄 off

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻
📖 第 1 页 / 共 2 页
字号:



ARM Macro Assembler    Page 1 


    1 00000000         ;/****************************************Copyright (c)*
                       *************************************************
    2 00000000         ;**                               Guangzou ZLG-MCU Devel
                       opment Co.,LTD.
    3 00000000         ;**                                      graduate school
                       
    4 00000000         ;**                                 http://www.zlgmcu.co
                       m
    5 00000000         ;**
    6 00000000         ;**--------------File Info------------------------------
                       -------------------------------------------------
    7 00000000         ;** File Name: IRQ.s
    8 00000000         ;** Last modified Date:  2004-06-14
    9 00000000         ;** Last Version: 1.1
   10 00000000         ;** Descriptions: The irq handle that what allow the int
                       errupt nesting. 
   11 00000000         ;**
   12 00000000         ;**-----------------------------------------------------
                       -------------------------------------------------
   13 00000000         ;** Created By: Chenmingji
   14 00000000         ;** Created date:   2004-09-17
   15 00000000         ;** Version: 1.0
   16 00000000         ;** Descriptions: First version
   17 00000000         ;**
   18 00000000         ;**-----------------------------------------------------
                       -------------------------------------------------
   19 00000000         ;** Modified by:
   20 00000000         ;** Modified date:
   21 00000000         ;** Version:
   22 00000000         ;** Descriptions:
   23 00000000         ;**
   24 00000000         ;*******************************************************
                       *************************************************/
   25 00000000         
   26 00000000         
   27 00000000                 INCLUDE ..\..\arm\irq.inc ; Inport the head file
                                                    引入头文件
    1 00000000         ;/****************************************Copyright (c)*
                       *************************************************
    2 00000000         ;**                               广州周立功单片机发展有
                       限公司
    3 00000000         ;**                                     研    究    所
    4 00000000         ;**                                        产品一部 
    5 00000000         ;**
    6 00000000         ;**                                 http://www.zlgmcu.co
                       m
    7 00000000         ;**
    8 00000000         ;**--------------文件信息-------------------------------
                       -------------------------------------------------
    9 00000000         ;**文   件   名: IRQ.inc
   10 00000000         ;**创   建   人: 陈明计
   11 00000000         ;**最后修改日期: 2004年8月27日
   12 00000000         ;**描        述: 定义IRQ汇编接口代码宏
   13 00000000         ;**
   14 00000000         ;**--------------历史版本信息---------------------------
                       -------------------------------------------------
   15 00000000         ;** 创建人: 陈明计
   16 00000000         ;** 版  本: v1.0
   17 00000000         ;** 日 期: 2004年8月27日



ARM Macro Assembler    Page 2 


   18 00000000         ;** 描 述: 原始版本
   19 00000000         ;**
   20 00000000         ;**--------------当前版本修订---------------------------
                       ---------------------------------------------------
   21 00000000         ;** 修改人:
   22 00000000         ;** 日 期:
   23 00000000         ;** 描 述:
   24 00000000         ;**
   25 00000000         ;**-----------------------------------------------------
                       -------------------------------------------------
   26 00000000         ;*******************************************************
                       *************************************************/
   27 00000000         
   28 00000000 00000080 
                       NoInt   EQU     0x80
   29 00000000         
   30 00000000 00000010 
                       USR32Mode
                               EQU     0x10
   31 00000000 00000013 
                       SVC32Mode
                               EQU     0x13
   32 00000000 0000001F 
                       SYS32Mode
                               EQU     0x1f
   33 00000000 00000012 
                       IRQ32Mode
                               EQU     0x12
   34 00000000 00000011 
                       FIQ32Mode
                               EQU     0x11
   35 00000000         
   36 00000000         
   37 00000000         ;引入的外部标号在这声明
   38 00000000                 IMPORT  OSIntCtxSw  ;任务切换函数
   39 00000000                 IMPORT  OSIntExit   ;中断退出函数
   40 00000000                 IMPORT  OSTCBCur
   41 00000000                 IMPORT  OSTCBHighRdy
   42 00000000                 IMPORT  OSIntNesting ;中断嵌套计数器
   43 00000000                 IMPORT  StackUsr
   44 00000000                 IMPORT  OsEnterSum
   45 00000000         
   46 00000000                 CODE32
   47 00000000         
   48 00000000                 AREA    IRQ,CODE,READONLY
   49 00000000         
   50 00000000                 MACRO
   51 00000000         $IRQ_Label
                               HANDLER $IRQ_Exception_Function
   52 00000000         
   53 00000000                 EXPORT  $IRQ_Label  ; 输出的标号
   54 00000000                 IMPORT  $IRQ_Exception_Function ; 引用的外部标号
                                                   
   55 00000000         
   56 00000000         $IRQ_Label
   57 00000000                 SUB     LR, LR, #4  ; 计算返回地址
   58 00000000                 STMFD   SP!, {R0-R3, R12, LR} ; 保存任务环境
   59 00000000                 MRS     R3, SPSR    ; 保存状态
   60 00000000                 STMFD   SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,



ARM Macro Assembler    Page 3 


                                                   LR,注意不能回写
   61 00000000         ; 如果回写的是用户的SP,所以后面要调整SP
   62 00000000                 LDR     R2,  =OSIntNesting ; OSIntNesting++
   63 00000000                 LDRB    R1, [R2]
   64 00000000                 ADD     R1, R1, #1
   65 00000000                 STRB    R1, [R2]
   66 00000000         
   67 00000000                 SUB     SP, SP, #4*3
   68 00000000         
   69 00000000                 MSR     CPSR_c, #(NoInt | SYS32Mode) 
                                                   ; 切换到系统模式
   70 00000000                 CMP     R1, #1
   71 00000000                 LDREQ   SP, =StackUsr
   72 00000000         
   73 00000000                 BL      $IRQ_Exception_Function 
                                                   ; 调用c语言的中断处理程序
   74 00000000         
   75 00000000                 MSR     CPSR_c, #(NoInt | SYS32Mode) 
                                                   ; 切换到系统模式
   76 00000000                 LDR     R2, =OsEnterSum ; OsEnterSum,使OSIntExit
                                                   退出时中断关闭
   77 00000000                 MOV     R1, #1
   78 00000000                 STR     R1, [R2]
   79 00000000         
   80 00000000                 BL      OSIntExit
   81 00000000         
   82 00000000                 LDR     R2, =OsEnterSum ; 因为中断服务程序要退出
                                                   ,所以OsEnterSum=0
   83 00000000                 MOV     R1, #0
   84 00000000                 STR     R1, [R2]
   85 00000000         
   86 00000000                 MSR     CPSR_c, #(NoInt | IRQ32Mode) 
                                                   ; 切换回irq模式
   87 00000000                 LDMFD   SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,
                                                   LR,注意不能回写
   88 00000000         ; 如果回写的是用户的SP,所以后面要调整SP
   89 00000000                 LDR     R0, =OSTCBHighRdy
   90 00000000                 LDR     R0, [R0]
   91 00000000                 LDR     R1, =OSTCBCur
   92 00000000                 LDR     R1, [R1]
   93 00000000                 CMP     R0, R1
   94 00000000         
   95 00000000                 ADD     SP, SP, #4*3 ; 
   96 00000000                 MSR     SPSR_cxsf, R3
   97 00000000                 LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
   98 00000000                 LDR     PC, =OSIntCtxSw ; 进行任务切换
   99 00000000                 MEND
  100 00000000         
  101 00000000                 END
   28 00000000         
   29 00000000                 CODE32
   30 00000000         
   31 00000000                 AREA    IRQ,CODE,READONLY
   32 00000000         
   33 00000000         
   34 00000000         ;/* 以下添加中断句柄,用户根据实际情况改变 */
   35 00000000         ;/* Add interrupt handler here,user could change it as 
                       needed */
   36 00000000         



ARM Macro Assembler    Page 4 


   37 00000000         ;/*中断*/
   38 00000000         ;/*Interrupt*/
   39 00000000         IRQ_Handler
                               HANDLER IRQ_Exception
   52 00000000         
   53 00000000                 EXPORT  IRQ_Handler ; 输出的标号
   54 00000000                 IMPORT  IRQ_Exception ; 引用的外部标号
   55 00000000         
   56 00000000         IRQ_Handler
   57 00000000 E24EE004        SUB     LR, LR, #4  ; 计算返回地址
   58 00000004 E92D500F        STMFD   SP!, {R0-R3, R12, LR} ; 保存任务环境
   59 00000008 E14F3000        MRS     R3, SPSR    ; 保存状态
   60 0000000C E94D6008        STMFD   SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,
                                                   LR,注意不能回写
   61 00000010         ; 如果回写的是用户的SP,所以后面要调整SP
   62 00000010 E59F20E8        LDR     R2,  =OSIntNesting ; OSIntNesting++
   63 00000014 E5D21000        LDRB    R1, [R2]
   64 00000018 E2811001        ADD     R1, R1, #1
   65 0000001C E5C21000        STRB    R1, [R2]
   66 00000020         
   67 00000020 E24DD00C        SUB     SP, SP, #4*3
   68 00000024         
   69 00000024 E321F09F        MSR     CPSR_c, #(NoInt | SYS32Mode) 
                                                   ; 切换到系统模式
   70 00000028 E3510001        CMP     R1, #1
   71 0000002C 059FD0D0        LDREQ   SP, =StackUsr
   72 00000030         
   73 00000030 EBFFFFFE        BL      IRQ_Exception ; 调用c语言的中断处理程序
   74 00000034         
   75 00000034 E321F09F        MSR     CPSR_c, #(NoInt | SYS32Mode) 
                                                   ; 切换到系统模式
   76 00000038 E59F20C8        LDR     R2, =OsEnterSum ; OsEnterSum,使OSIntExit
                                                   退出时中断关闭
   77 0000003C E3A01001        MOV     R1, #1
   78 00000040 E5821000        STR     R1, [R2]
   79 00000044         
   80 00000044 EBFFFFFE        BL      OSIntExit
   81 00000048         
   82 00000048 E59F20B8        LDR     R2, =OsEnterSum ; 因为中断服务程序要退出
                                                   ,所以OsEnterSum=0
   83 0000004C E3A01000        MOV     R1, #0
   84 00000050 E5821000        STR     R1, [R2]
   85 00000054         
   86 00000054 E321F092        MSR     CPSR_c, #(NoInt | IRQ32Mode) 
                                                   ; 切换回irq模式
   87 00000058 E8DD6008        LDMFD   SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,
                                                   LR,注意不能回写
   88 0000005C         ; 如果回写的是用户的SP,所以后面要调整SP
   89 0000005C E59F00A8        LDR     R0, =OSTCBHighRdy
   90 00000060 E5900000        LDR     R0, [R0]
   91 00000064 E59F10A4        LDR     R1, =OSTCBCur
   92 00000068 E5911000        LDR     R1, [R1]
   93 0000006C E1500001        CMP     R0, R1
   94 00000070         
   95 00000070 E28DD00C        ADD     SP, SP, #4*3 ; 
   96 00000074 E16FF003        MSR     SPSR_cxsf, R3
   97 00000078 08FD900F        LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
   98 0000007C E59FF090        LDR     PC, =OSIntCtxSw ; 进行任务切换
   40 00000080         



ARM Macro Assembler    Page 5 


   41 00000080         
   42 00000080         ;/*定时器0中断*/
   43 00000080         ;/*Time0 Interrupt*/
   44 00000080         Timer0_Handler
                               HANDLER Timer0_Exception
   52 00000080         
   53 00000080                 EXPORT  Timer0_Handler ; 输出的标号
   54 00000080                 IMPORT  Timer0_Exception ; 引用的外部标号
   55 00000080         
   56 00000080         Timer0_Handler
   57 00000080 E24EE004        SUB     LR, LR, #4  ; 计算返回地址
   58 00000084 E92D500F        STMFD   SP!, {R0-R3, R12, LR} ; 保存任务环境
   59 00000088 E14F3000        MRS     R3, SPSR    ; 保存状态
   60 0000008C E94D6008        STMFD   SP, {R3, SP, LR}^ ; 保存用户状态的R3,SP,
                                                   LR,注意不能回写
   61 00000090         ; 如果回写的是用户的SP,所以后面要调整SP
   62 00000090 E59F2068        LDR     R2,  =OSIntNesting ; OSIntNesting++
   63 00000094 E5D21000        LDRB    R1, [R2]
   64 00000098 E2811001        ADD     R1, R1, #1
   65 0000009C E5C21000        STRB    R1, [R2]
   66 000000A0         

⌨️ 快捷键说明

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