首页 > 其他分享 >Cortex-m0临界代码段

Cortex-m0临界代码段

时间:2024-08-24 10:38:03浏览次数:8  
标签:rt 中断 代码段 临界 Cortex 寄存器 interrupt PRIMASK m0

Cortex-m0 临界代码段保护

1. stm32中断

1.1 中断特殊功能寄存器PRIMASK

PRIMASK寄存器用于控制中断的使能和禁止,它只有一个位,即PRIMASK位。当PRIMASK位被设置为1时,所有中断都被禁止,包括NMIHardFault中断。当PRIMASK位被设置为0时,所有中断都被使能。

操作PRIMASK寄存器的方法是使用MSR指令,将1写入PRIMASK位即可禁止中断,将0写入PRIMASK位即可使能中断。要操作中断开关或PRIMASK可以使用以下指令:

//汇编关闭中断

MSR PRIMASK, #1

或使用

CPSID I

//汇编开启中断

MSR PRIMASK, #0

或使用

CPSIE I

1.2 通过开关中断使能寄存器实现临界代码保护

void critical_section(void)
{
    // 关闭中断
    __disable_irq(); //关闭中断 PRIMASK = 1
    {

        // 临界代码段
        // ...
    }
    // 开启中断
    __enable_irq(); //开启中断 PRIMASK = 0
}

这里示例简单的实现了临界代码段的保护,但实际程序在设计是会使用到嵌套中断的情况

1.3 使用中断状态变量保存中断变化(嵌套中断)

void critical_section(void)
{
    // 保存当前中断状态
    uint32_t primask1,primask2;

    primask1 = __get_PRIMASK(); //获取PRIMASK寄存器值
    __disable_irq(); //关闭中断 PRIMASK = 1
    {
        // 临界代码段1
        primask2 = __get_PRIMASK();
        {
            // 临界代码段2
        }
        //恢复中断(primask2接收的变量值为1)
        __set_PRIMASK(primask2);
    }
    // 恢复中断状态
    __set_PRIMASK(primask1); //恢复PRIMASK寄存器值
}

通过接收PRIMASK寄存器值来保存各个临界段的状态,确保每个代码段都会被执行

2 通过定时器来查看关闭中断的实际实现效果

可以通过这篇博文做为参考:STM32定时器中断

3.1 RT_thread临界段保护(基于cortex-m0)

在rt_thread中也是操作PRIMASK寄存器来实现

;/*
; * rt_base_t rt_hw_interrupt_disable();
; */
rt_hw_interrupt_disable    PROC
    EXPORT  rt_hw_interrupt_disable
    MRS     r0, PRIMASK             //读取PRIMASK寄存器值到r0中
    CPSID   I                       //关闭中断响应
    BX      LR                      //程序跳转至LR寄存器 (PC)
    ENDP

;/*
; * void rt_hw_interrupt_enable(rt_base_t level);
; */
rt_hw_interrupt_enable    PROC
    EXPORT  rt_hw_interrupt_enable
    MSR     PRIMASK, r0             //将r0中的值(level)写入PRIMASK寄存器
    BX      LR                      //程序跳转至LR寄存器
    ENDP

RT_thread代码示例

PRIMASK = 0; /* PRIMASK 初始值为 0,表示没有关中断 */ 
rt_base_t level1; 
rt_base_t level2;

/* 临界段代码 */
{
    /* 临界段 1 开始 */
    level1 = rt_hw_interrupt_disable(); /* 关中断,level1=0,PRIMASK=1 */ 
    {
        /* 临界段 2 */
        level2 = rt_hw_interrupt_disable(); /* 关中断,level2=1,PRIMASK=1 */ 
        {

        }
        rt_hw_interrupt_enable(level2); /* 开中断,level2=1,PRIMASK=1 */ 
    }
    /* 临界段 1 结束 */
    rt_hw_interrupt_enable(level1); /* 开中断,level1=0,PRIMASK=0 */ 
}

标签:rt,中断,代码段,临界,Cortex,寄存器,interrupt,PRIMASK,m0
From: https://www.cnblogs.com/shangshang-blocks/p/18299843

相关文章

  • Springboot计算机毕业设计公益捐赠管理系统r9m00
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表捐赠者,领取者,物品分类,物品捐赠,旧物展示,物品退还,物品领取,退还管理,回收管理,回收站,物品需求,在线捐赠,需求展示,在线聊天开题报告内容一、研究背景随着......
  • MSPM0G3057学习记录(二)电机PID闭环控制
    目录一、PID原理讲解  1.比例增益(Proportional): 2.  积分时间(Integral): 3.  微分时间(Derivative):二、PID控制原理图三、位置式PID公式  四、参考代码(一)五、参考代码(二) 一、PID原理讲解          PID(Proportional-Integral-Derivative)闭环控......
  • ARM Cortex-M3中断简介
    目录中断优先级分组三个系统中断优先级配置寄存器SHPR1SHPR2SHPR3三个中断屏蔽寄存器PRIMASKFAULTMASKBASEPRI中断优先级分组ARMCortex-M内核的MCU具有一个用于中断管理的嵌套向量中断控制器(NVIC,全称:Nestedvectoredinterruptcontroller)。ARMCortex-M的NVIC最大可支持......
  • navicat [IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱
    1.情景展示使用navicat连接SQLServer数据库,报错信息如下:[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0)2.解决方案方案1找到Navicat的安装路径,然后找到sqlncli_x64.msi文件并安装,安装成功后重启Navicat重新进行连接,看是否成功。......
  • 在电赛期间,M0G3507芯片出现了锁死并最终烧毁的问题分析
    前言:    在今年的电赛备赛期间,我使用了官方提供的M03507板卡来准备H题。然而,备赛过程中遇到了板卡锁死的问题,导致无法完成题目要求。尽管在电赛期间尝试了多种解锁方法,均未成功。更为严重的是,在尝试解锁的过程中,发生了3V3电源线与GND之间短路,最终导致芯片损坏。通过后......
  • Cortex-M3初探
    目录寄存器组R0-R12:通用寄存器R13:两个堆栈指针SPR14:连接寄存器LRR15:程序计数寄存器PC特殊功能寄存器xPSR寄存器PRIMASK寄存器FAULTMASK寄存器BASEPRI寄存器CONTROL寄存器操作模式与特权级别用户级切换为特权级的流程内建的嵌套向量中断控制器NVIC可嵌套的中断支持向量中断支持......
  • ZMM050N
    /*********BeginProcedureScript************/BEGINvar_out=withaas(selectmandt,matnr,werks,lgort,charg,lfgja,lfmon,sum(clabs+CUMLM)clabsfrom(selectmandt,matnr,werks,lgort,charg,lfgja,lfmon,clabs,cumlmfromSAPABAP1.nsdm_v......
  • 国产!全志科技T507-H工业开发板( 4核ARM Cortex-A5)规格书
    1评估板简介创龙科技TLT507-EVM是一款基于全志科技T507-H处理器设计的4核ARMCortex-A53国产工业评估板,主频高达1.416GHz,由核心板和评估底板组成。核心板CPU、ROM、RAM、电源、晶振等所有器件均采用国产工业级方案,国产化率100%。同时,评估底板大部分元器件亦采用......
  • [附开题]flask框架的校园停车场管理系统的设计与实现61m0e(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及和校园规模的不断扩大,校园内车辆数量急剧增加,停车难问题日益凸显。传统的人工停车场管理模式已难以满足现代校园对高效......
  • MSPM0G3507外设DMA学习笔记
    概述变量的存储正常情况下,变量存储在SRAM中,如果要发送该变量的值到外设,需要调用内核操作,使SRAM中的数据送到外设。此类型操作过多会导致占用CPU高,整体卡顿。DMA控制概述DMA:DirectMemoryAccess专门用于数据传输,解放CPU对于DMA,CPU首先启动传输,然后在传输过程中执行其......