宏函数展开为:

 #define  OS_CRITICAL_METHOD   3

 #if OS_CRITICAL_METHOD == 3
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
#endif

OS_CPU_SR_Save() 和 OS_CPU_SR_Restore(cpu_sr) 在os_cpu_a.asm 中,为移植函数:

 OS_CPU_SR_Save                 //PRIMASK缺省值0 中断屏蔽寄存器  =1 关闭所有可屏蔽异常 只剩下NMI和硬fault可以响应
MRS R0, PRIMASK //MRS指令用于将状态寄存器的内容传送到通用寄存器中 读取PRIMASK到R0中,R0为返回值 CPSID I //PRIMASK=1,关中断(NMI和硬fault可以响应
BX LR //返回 BX带状态切换的条状指令 OS_CPU_SR_Restore //读取R0到PRIMASK中,R0为参数 MSR PRIMASK, R0
BX LR

说明:

中断屏蔽寄存器
PRIMASK
这个寄存器只有一个位,置1后,将关闭所有可屏蔽中断的异常,只剩NMI和硬fault,默认值为0;

进入临界区,将关中断前的中断屏蔽状态保存到局部变量中。

退出临界区,将之前保存的中断屏蔽状态恢复到PRIMASK中断屏蔽寄存器中。

【STM32】临界区进入退出宏 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()的更多相关文章

  1. 怎样把UCos-ii_在STM32上的移植

    下载代码 stm32 标准外设库是 stm32 全系列芯片的外设驱动,有了它能够大大加速我们 开发 stm32. 首先从 st 公司的站点下载最新的 stm32 标准外设库,写本文时最新的版本号是 V ...

  2. stm32非操作系统开发和带uCos的开发的区别,及一些解析

    从文件角度来看core_cm4.h和stm32f4xx.h分别从内核寄存器和外设寄存器来定义其地址和结构体,是用c语言访问硬件必须的文件,所以这两个文件不论是否带操作系统,都是必须包含进工程的. re ...

  3. uCos-II移值(一)

    os_cpu.h文件 该文件主要是完成操作系统使用的内部数据类型.常数以及宏的定义,这些都是与处理器平台密切相关的: 第一部分 以下部分定义了系统内部常用的数据类型,为了增加系统的可移植性,系统内核只 ...

  4. 单片机main函数退出后发生什么——以stm32为例

    STM32:main函数退出后发生什么? 我们都在说单片机要运行在无限循环里,不能退出,可退出之后会发生什么? 讨论STM32启动过程的文章数不胜数,可main函数结束之后会发生什么却少有讨论. 几日 ...

  5. ucos中的三种临界区管理机制

    熟悉ucos,或者读过Jean.J.Labrosse写过的ucos书籍的人,一定会知道ucos中著名的临界区管理宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(). 同样 ...

  6. 一步步写STM32 OS【四】OS基本框架

    一.上篇回顾 上一篇文章中,我们完成了两个任务使用PendSV实现了互相切换的功能,下面我们接着其思路往下做.这次我们完成OS基本框架,即实现一个非抢占式(已经调度的进程执行完成,然后根据优先级调度等 ...

  7. 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)

    该篇为“啰里啰嗦版”,另有相应的“精简版”供参考 “不到长城非好汉:不做OS,枉为程序员” OS之于程序员,如同梵蒂冈之于天主教徒,那永远都是块神圣的领土.若今生不能亲历之,实乃憾事! 但是,圣域不是 ...

  8. 宏汇编软件MASM51的使用

    单片机开发可以用手工汇编和机器汇编两种方法.采用手工汇编就是先编写出汇编程序,然后对照单片机汇编表手工将汇编程序翻译成机器码,最后将机器码一个一个地送入开发仿真器的RAM中去进行调试. 由于采用手工汇 ...

  9. STM32关于优先级设定的理解 NVIC_SetPriority()

    Systick模块初始化配置函数(Systick_config)中设定模块中断优先级的函数为: NVIC_SetPriority((SysTick_IRQn, (1<<__NVIC_PRI ...

随机推荐

  1. C++——STL内存清除

    1.vector元素的清除 看代码.在vector中添加若干元素,然后clear() #include<iostream> #include<list> #include< ...

  2. 通过Jmeter 代理功能获取postman请求

    对于初学者在Jmeter 配置 请求其实属于比较麻烦的事情,但是如果在Postman配置就容易多了,所以考虑是否可以把postman的配置直接导入Jmeter,避免初学者上手不易的问题,后来考虑使用J ...

  3. git 远程分支回滚

    git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id ...

  4. vs单独调试dll

    用生成好的exe单独调试dll,右键项目属性->调试->命令->选择exe

  5. 【Dubbo源码学习】负载均衡算法(1)-随机算法

    /** * random load balance. * */public class RandomLoadBalance extends AbstractLoadBalance { public s ...

  6. 京东饭粒捡漏V1.0.7

    20180614 更新 V1.0.71.修改捡漏策略 功能介绍1.京东商城专用,支持饭粒模式下单,自己获得京豆返利 2.捡漏模式:帮助用户监控抢购商品,有库存的时候进行抢单,主要是通过添加商品ID - ...

  7. Linux通配符和关机命令

      通配符 | # 管道符,或者(正则) > # 输出重定向 >> # 输出追加重定向 < # 输入重定向 << # 追加输入重定向 ~ # 当前用户家目录 `` ...

  8. Creating and using a blendspace in c++

    转自:https://forums.unrealengine.com/development-discussion/c-gameplay-programming/104831-creating-and ...

  9. robotframework在3.7下的搭建

    网上看了大多安装RIDE都是在python2的环境下,今天试了下python3的安装,成功了,步骤如下: 1.首先是python3的安装,以及pip这些工具,具体的网上一堆,不再啰嗦 2.安装robo ...

  10. send_keys results in Expected 【object Undefined】undefined to be a string解决方法:更新selenium+geckodriver+firefox

    很久之前在win10上配置的测试环境: python 3.6.1+ selenium 3.3.3+ geckodriver 0.15.0以前run case是正常的,今天去run 同样的case时发现 ...