XOS中关中断、恢复中断的汇编实现:

1.系统函数输入输出中定义

;**
;* @brief    EXPORT & IMPORT
;*
; 实现的系统函数
        EXPORT    OSIntDisable                    ; 备份中断状态并关中断
        EXPORT    OSIntRestore                    ; 恢复上次备份的中断状态


2.汇编代码段实现

;**
;* @brief    代码段
;*
        AREA    Routines, CODE

ENTRY

; 关中断并返回初始中断状态,中断屏蔽寄存器PRIMASK仅有一位宽度,置位后,不可屏蔽中断NMI和HardFault不被屏蔽外,屏蔽所有其他中断。
OSIntDisable
        MRS        R0,    PRIMASK                     ;
        CPSID    I                               ; PRIMASK=1
        BX        LR

; 恢复中断状态
OSIntRestore
        MSR        PRIMASK, R0
        BX        LR


3.汇编指令参考以下两个链接:

https://blog.csdn.net/weibo1230123/article/details/84036225

ARM汇编:MRS和MSR指令

ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。

一:下面先来说说状态寄存器

针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器。每个位的含义如下图:


分成了4部分:

1,条件标志位

N(Negative), Z(Zero), C(Carry), V(Verflow)统称为条件标志位。ARM指令可以根据CPSR中的这些条件标志位来选择性的执行。

2,Q标志位

ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位。主要用于指示增强的DSP指令是否发生了溢出。

3,控制位

I, F, T以及M[4:0]统称为控制位。当异常中断发生时,这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

下表示控制位M[4:0]的含义:

4,保留位
 用于将来ARM版本的扩展。

二:状态寄存器访问指令仅有两条:

MRS: 状态寄存器到通用寄存器的传送指令。

MSR: 通用寄存器到状态寄存器的传送指令。

三:MRS指令用法:

四:MSR指令用法:

其中:

<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。

<fields>设置状态寄存器中需要操作的位。状态寄存器的32位可以分为4个8位的域:

f: 指示bits[31 : 24],又名条件标志位域

s: 指示bits[23 : 16],又名状态标志位域

x: 指示bits[15 : 8], 又名扩展位域

c: 指示bits[7 : 0],又名控制位
<immediate>为将要传送到状态寄存器中的立即数,该立即数的计算方式可以去照看<ARM+Architecture+Reference+Manual.pdf>

<Rm>寄存器包含将要传送到状态寄存器中的数据。

指令的操作伪代码:


https://blog.csdn.net/jasenmaodj/article/details/46941605

一. NVIC和系统控制块特性

1. 灵活的中断管理:使能/禁止中断,优先级配置
  2. 硬件嵌套中断支持
  3. 向量化的异常入口
  4. 中断屏蔽
  5. NVIC寄存器的起始地址:0xE000E100, 对其访问必须是每次32bit
  6. SCB的起始地址: 0xE000E010,也是每次32bit访问。
123456

二. 中断使能和清除使能

1. 中断寄存器是可编程的,用于控制中断请求(异常编号16以上)的使能(SETENA)和禁止(CLRENA), 如下所示:
1

2. 使能/禁止 中断的代码:
       1). C代码:
12

*(volatile unsigned long) (0xE000E100) = 0x4 ; //使能#2中断
          *(volatile unsigned long) (0xE000E180) = 0x4 ; //禁止#2中断12

2). 汇编代码:
1

LDR R0, =0xE000E100  ;  //SETEAN寄存器的地址
          MOVS R1, #04         ;  //设置#2中断
          STR R1, [R0]         ;  //使能中断#2123

3). CMSIS标准设备驱动函数: 
1

void NVIC_EnableIRQ(IRQn_Type_IRQn);  //使能中断#IRQn;
           void NVIC_DisableIRQ(IRQn_Type_IRQn); //禁止中断#IRQn;12

三. 中断挂起和清除挂起:

1. 可以通过操作中断挂起(SETPEND)和清除挂起(CLRPEND),这两个寄存器来访问和修改中断挂起状态。
1

2.挂起/清除挂起的代码:
        1). C代码:
12

*(volatile unsigned long)(0xE000E100) = 0x4 ; //使能中断#2
           *(volatile unsigned long)(0xE000E200) = 0x4 ; // 挂起中断#2
           *(volatile unsigned long)(0xE000E280) = 0x4 ; // 清除中断#2的挂起状态123

2). 汇编代码:
1

LDR R0, =0xE000E100   ;  //设置使能中断寄存器地址
           MOVS R1, #0x4         ;  //中断#2
           STR R1, [R0]          ;  //使能#2中断
           LDR R0, =0xE000E200   ;  //设置挂起中断寄存器地址
           MOVS R1, #0x4         ;  //中断#2
           STR R1, [R0]          ;  //挂起#2中断
           LDR R0, =0xE000E280   ;  //设置清除中断挂起寄存器地址
           MOVS R1, #0x4         ;  //中断#2
           STR R1, [R0]          ;  //清除#2的挂起状态123456789

3). CMSIS标准设备驱动函数: 
1

void NVIC_SetPendingIRQ(IRQn_Type_IRQn)  ; //设置一个中断挂起
           void NVIC_ClearPendingIRQ(IRQn_Type_IRQn); //清除中断挂起
           void NVIC_GetPendingIRQ(IRQn_Type_IRQn)  ; //读取中断挂起状态123

四. 中断优先级:(0xE000E400~0xE000E41C)

1. 每个外部中断都有一个对应的中断有先级寄存器,每个优先级都是只有一个字节且只有最高2Bit有效;
2. NVIC支持字传输,所以每次访问都会涉及4个中断优先级寄存器。
12

3. 设置中断优先级代码:(先读一个字,再修改对应字节,最后整个字写回)

1). C代码:
123

unsigned long temp;                           //定义一个临时变量
          temp = *(volatile unsigned long)(0xE000E400); //读取IRP0值
          temp &= (0xFF00FFFF |(0xC0 << 16));           //修改中断#2优先级为0xC0
          *(volatile unsigned long)(0xE000E400) = temp; //设置IPR01234

2). 汇编代码:
1

LDR R0, =0xE000E100   ;  //设置使能中断寄存器地址
           MOVS R1, #0x4         ;  //中断#2
           STR R1, [R0]          ;  //使能#2中断
           LDR R0, =0xE000E200   ;  //设置挂起中断寄存器地址
           MOVS R1, #0x4         ;  //中断#2
           STR R1, [R0]          ;  //挂起#2中断
           LDR R0, =0xE000E280   ;  //设置清除中断挂起寄存器地址
           MOVS R1, #0x4         ;  //中断#2
           STR R1, [R0]          ;  //清除#2的挂起状态123456789

3). CMSIS标准设备驱动函数: 
1

void NVIC_SetPriority(IRQn_Type_IRQn, uint32_t priority)  ; //设置中断优先级
           uint32_t NVIC_GetPriority(IRQn_Type_IRQn);                  //读取中断优先级

这里的priority是0,1,2,3.函数内部会自动移位到对应的优先级最高2位:
           void NVIC_SetPriority(2, 3) ; //设置#2中断的优先级为0xC012345

五. 异常屏蔽寄存器(PRIMASK)

1.对时间敏感的应用,需要用PRIMASK来屏蔽掉除NMI和硬件错误异常以外的其他所有中断和异常。
2.PRIMASK只有1Bit有效,默认为0,为1时起屏蔽作用。
3.操作PRIMASK的代码:
  1). 汇编代码:
1234

MOVS R0, #1      ; 
            MSR  PRIMASK, R0 ; //使用MSR指令设置PRIMASK值12

2). CPS指令:
1

CPSIE  i ;        //清除PRIMASK值
            CPSID  i ;        //设置PRIMASK值12

3). CMSIS标准设备驱动函数:
1

void _enable_irq(void)  ;  //清除PRIMASK值
            void _disable_irq(void) ;  //设置PRIMASK值12

六. 中断输入和挂起行为

1. Cortex-M0允许电平触发和脉冲触发两种方式;
2. 每个外部中断请求都会对应一个挂起状态寄存器,且只有1bit,当开始处理这个异常时,硬件会自动清除挂起状态;
3. 大多数外设都是使用电平触发,当执行中断服务程序并且清除外设中断信号之前,该信号一直为高:
123

4. 使用脉冲触发中断时,至少持续1个时钟周期:
1

七. 中断等待 (中断确认 –> 中断服务处理开始执行)

1. Cortex-M0中断默认等待的时间为16个时钟周期;
2. 中断等待的条件:
    1). 改中断使能并且没有被PRIMASK屏蔽掉;
    2). 存储器系统没有任何等待。

3. IRQLATENCY的8位信号可以控制中断等待:设置为0,则以最快速度响应中断。
123456

八. 系统异常的控制寄存器(SHPR2,SHPR3)

1. Cortex-M0处理器只有SVC、PendSV和SysTick 3个与OS相关的系统异常才具有可编程的 优先级
1

2. 符合CMSIS的设备驱动,可使用如下方式访问:
1

3. 中断控制状态寄存器(ICSR, 0xE000ED04):
    P139, 表9.6
4. 符合CMSIS的设备驱动,可使用 "SCB -> ICRS" 来访问。
123

九. 系统控制寄存器(0xE000E000~0xE000EFFF)

1. SCS包括NVIC、调试控制、SysTick定时器;
2. CPU ID基址寄存器(0xE000ED00),只读,包含处理器ID信息,"SCB -> CPUID" 访问;
3. 应用中断和复位控制寄存器(AIRCR, 0xE000ED0C):
    1). 用于应用程序请求系统复位,识别系统的大小端,以及清除所有的异常活动状态:
1234

2). CMSIS 设备驱动,可以使用 "SCB -> AIRCR" 来访问;
    3). CMSIS 设备驱动, 请求系统复位的函数:
12

Void NVIC_SystemReset(void);1

十. 配置和控制寄存器(CCR, 0xE000ED14)

1. CCR 只读, 决定了栈的双字节对齐设置和非对称访问的处理;
2. CMSIS 设备驱动,可以使用 "SCB -> CCR" 来访问;
--------------------- 
作者:Founder_U 
来源:CSDN 
原文:https://blog.csdn.net/jasenmaodj/article/details/46941605 
版权声明:本文为博主原创文章,转载请附上博文链接!

XOS 详解1: os_s_xxxx.s相关推荐

  1. XOS 源码详解3: os_s_xxxx.s 汇编代码的 LDR指令

    ; PendSV_Handler PendSV_Handler         LDR        R2,    =OSTcbCurr                    ; 不必关中断.嵌套中断 ...

  2. XOS 源码详解2: os_s_xxxx.s 汇编代码的段定义AREA,程序入口ENTRY,程序结尾END.

    代码段定义 EXPORT    __Vectors ;** ;* @brief    中断向量 ;*         AREA    Vectors, CODE ; 系统异常 __Vectors 数据 ...

  3. xos详解5:PendSV_Handler

    ; PendSV_Handler PendSV_Handler         LDR        R2,    =OSTcbCurr                    ; 不必关中断.嵌套中断 ...

  4. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  5. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  6. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  7. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  8. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  9. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

最新文章

  1. tomcat6 配置web管理端访问权限
  2. 有机发光二极管显示器测试方法_有机激光二极管从梦想变为现实
  3. 最全Pycharm教程
  4. php如何解决并发问题,PHP如何解决并发问题
  5. Sql Server临时表中插入标示列
  6. hadoop--HDFS的读写数据流程
  7. django-正向查询与反向查询演练-查询集的三种状态
  8. Mac OS X将CSV格式转换为Excel文档格式,Excel转CSV中文乱码问题
  9. fatal: ‘origin‘ does not appear to be a git repository fatal: Could not read from remote repository.
  10. 网页设计图片向上浮动_CSS实现图片向上浮动
  11. springboot2.4+nettyWebServerApplicationContext@15f51c50 has been closed already问题解决
  12. 海美迪盒子android升级包,海美迪H5固件升级ROM系统刷机包下载_刷机教程
  13. smobiler中实现页面切换_Smobiler如何实现.net一键开发,ios和android跨平台运行
  14. qq四国军旗2.1 beat03 builde017记牌器开发思路(二)
  15. Ubuntu Vmware虚拟机网络配置(一)
  16. FMS视频在线采集系统
  17. 使用showdown将markdown笔记插入到HTML网页
  18. 中国佛学66句震撼世界的禅语(转贴)
  19. HashTab的基本用法
  20. CSS 中iframe标签

热门文章

  1. 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)
  2. Scrum And Teamwork
  3. 浏览器调试时控制台出现:Uncaught SyntaxError: Unexpected identifier
  4. (转)postgresql+postgis空间数据库使用总结
  5. Oracle 日期加减运算
  6. nutz配置druid监控
  7. (转)Bootstrap 之 Metronic 模板的学习之路 - (1)总览
  8. Web Hacking 101 中文版 十三、子域劫持
  9. Hi3519V101 Uboot和Kernel编译
  10. 语音学习笔记(四)【传统声学模型】