IPSR(中断程序状态寄存器),IPSR包含了当前正在执行的中断服务程序编号,用于识别当前中断。
TinyThread源码分析之中断
转载请注明来源:cuixiaolei的技术博客
https://github.com/xhawk18/TinyThread
TinyThread 是基于Cortex-M0的小型的OS.
知识储备:
IPSR(中断程序状态寄存器),IPSR包含了当前正在执行的中断服务程序编号,用于识别当前中断。
Cortex-M0处理器内置中断控制器,并且支持最多32个中断请求(IRQ)和一个不可屏蔽中断(NMI).
PRIMASK置位(写1),开启屏蔽,屏蔽除了NMI和硬件错误(hardfault)外的所有中断。清除此位,关闭屏蔽。
TinyThread中断控制涉及到的文件主要有:tt_sys.h、tt_sys.c
TinyThread中断控制函数API主要有以下两个,它们分别是打开IPSR和关闭IPSR寄存器(中断屏蔽特殊寄存器).
- void tt_enable_irq (void) // 打开中断,PRIMASK清零
- void tt_disable_irq (void) // 关闭中断,PRIMASK置位
tt_sys.c
1 #include "../Inc/tt_thread.h" 2 3 volatile int g_iIRQ_disable_count = 0; 4 volatile bool g_bIRQ_real_disable = 0;
tt_sys.h
#ifndef INC_TT_SYS_H__ #define INC_TT_SYS_H__#ifdef __cplusplus extern "C" { #endifextern volatile int g_iIRQ_disable_count; extern volatile bool g_bIRQ_real_disable;//#define TT_SYS_NO_PRINTF/* Implement in tt_syscall.s */ #if defined __CC_ARM # if __CM0_CMSIS_VERSION < 0x00020000 TT_INLINE bool tt_is_in_irq (void) //__get_IPSR()得到当前 中断程序状态寄存器 的值,此函数用来判断当前是否处在中断状态。 {register uint32_t __regIPSR __asm("ipsr");return(__regIPSR); } # else TT_INLINE bool tt_is_in_irq (void) {return __get_IPSR (); } #endif #elif defined __GNUC__ __attribute__((always_inline )) TT_INLINE bool tt_is_in_irq (void) {uint32_t result;__asm__ volatile ("MRS %0, ipsr" : "=r" (result) );return(result); } #elif defined __ICCARM__ # pragma diag_suppress=Pe940 TT_INLINE bool tt_is_in_irq (void) {__asm(" MRS R0, IPSR "); } #endifTT_INLINE bool tt_is_irq_disabled (void) //查看 中断屏蔽特殊寄存器的值 中断被屏蔽返回true,中断可用返回false {int primask = __get_PRIMASK ();if ((primask & 1) == 0) //中断程序状态寄存器第0位置1,表示中断被屏蔽return false;elsereturn true; }TT_INLINE void tt_enable_irq (void) {if (!tt_is_irq_disabled ()) //如果中断可以使用{__set_PRIMASK(1); //PRIMASK写1,屏蔽中断 #if !defined TT_SYS_NO_PRINTFprintf ("Not call tt_disable_irq before tt_enable_irq\n"); #endifwhile (1); //错误处理,用死循环提示,我个人认为作者这么处理的原因是程序死掉,开发人员会追到这里,就知道原因了(没有先执行tt_disable_irq函数).}g_iIRQ_disable_count--; if (g_iIRQ_disable_count == 0){if (g_bIRQ_real_disable){__set_PRIMASK(0);}} }TT_INLINE void tt_disable_irq (void) {if (tt_is_irq_disabled ()) //已经disbale过了{if (g_iIRQ_disable_count == 0)g_bIRQ_real_disable = false;}else{__set_PRIMASK(1);if (g_iIRQ_disable_count == 0)g_bIRQ_real_disable = true;} g_iIRQ_disable_count++; }
在 void tt_enable_irq (void) 函数中,我们可以知道,在没有先disable irq的情况下,不允许执行此函数. 如果连续执行此函数,报错。
在 void tt_disable_irq (void) 函数中,我们可以知道,虽然可以连续执行tt_disable_irq函数,但是当连续执行此函数后, g_bIRQ_real_disable 的值为 false, 那么当enable irq时是没有其作用的。
所以使用这对函数,一定要成对出现,而且要先disable,然后enable.
IPSR(中断程序状态寄存器),IPSR包含了当前正在执行的中断服务程序编号,用于识别当前中断。相关推荐
- 【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )
一. 中断控制 ( 基于 S3C6410 开发板 ) 1. 关闭中断的两个步骤 (1) 关闭中断步骤 2. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器简介 (2) CPRS 寄存器 中断 ...
- 程序状态寄存器PSR
当前程序状态寄存器(CPSR)在所有处理器模式下都是可访问的,它包括条件标志位,中断标志位,当前处理器模式控制以及其他状态和控制位.每种异常模式都有一个保存程序状态寄存器(SPSR),当异常发生时用于 ...
- ARM的7种工作模式、37个通用寄存器、CPSR程序状态寄存器
一.ARM 采用的是32位架构 1.ARM约定 Byte:8 bits Halfword:16 bits (2 byte) Word:32 bits (4 byte) 2.大部分ARM core 提供 ...
- 基于ARM9程序状态寄存器CPSR
定义:程序状态寄存器: 功能:反映数据运算状态,控制系统模式等: 特点:程序状态寄存器不属于通用寄存器: 关于CPSR的访问,ARM专门为其设立了两条指令: MRS:CPSR到通用寄存器传递数据指令: ...
- ARM Cortex-M3与Cortex-M4中断相关寄存器
NVIC寄存器列表 中断使能寄存器 设置中断挂起和清除中断挂起 中断活跃状态寄存器 中断优先级寄存器 软件触发中断寄存器 中断控制器类型寄存器 SCB寄存器 中断控制和状态寄存器(ICSR).向量表偏 ...
- 15_串口中断通信寄存器即库函数配置编写实例
串口中断通信寄存器即库函数配置编写实例 目录 串口中断通信寄存器即库函数配置编写实例 常用的串口相关寄存器: 波特率计算方法: USART_InitTypeDef结构体详解: 串口配置一般步骤: 调试 ...
- 51单片机中断相关寄存器
52单片机中断级别 中断允许寄存器IE EA--全局中断 ES--串口中断 ET2--定时器2中断 EX1--外部中断1 ET1--定时器1 中断 ...
- stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)
rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...
- php excel中解析显示html代码_骑士cms从任意文件包含到远程代码执行漏洞分析
前言 前些日子,骑士cms 官方公布了一个系统紧急风险漏洞升级通知:骑士cms 6.0.48存在一处任意文件包含漏洞,利用该漏洞对payload文件进行包含,即可造成远程代码执行漏洞.这篇文章将从漏洞 ...
最新文章
- PMCAFF微课堂 | 阿里资深运营揭秘电商运营与纯互联网运营的区别与互通
- ScriptManager同时存在于两个dll中的问题
- WCF netTcpBinding寄宿到IIS7
- 设计模式 之 工厂模式
- spring webflow : 上传单个文件实例
- mysql服务启动失败 Starting MySQL. ERROR! The server quit without updating PID file
- 8001.win10安装ros2-dashing环境搭建
- Python花式编程案例锦集(4)
- 马斯克:2020 年底将完成 L5 级别自动驾驶功能
- C# 概念 委托和事件
- 分布式MySQL数据库中间件 mysqlda
- python检查exe运行是否报错_python打包成exe格式后,在部分机子上没法运行
- lnmp mysql 哪个好_[LNMP]Mysql生产环境配置
- 传输线应用基础,阻抗匹配与谐波控制
- mac系统 查找英文目录
- python 技能系统
- Github新手之路(全过程)(站在前辈的肩膀上的总结)
- 微信小程序的推广方案有哪些
- 【第二章 语言及文法】形式语言与自动机第二章个人总结复习笔记分享!(含文件、持续更新...)
- 中医卫统直报、重点专科、绩效考核病案首页字段汇总-标出差异
热门文章
- [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
- [python]网络编程基础学习笔记(一)客户/服务器网络介绍
- 简单的RPC java实现
- POJ-3469	Dual Core CPU 最小割最大流
- .NET中回发或回调参数无效问题的解决
- Java 中的几种线程池,你之前用对了吗,互联网 面试官 如何面试
- python如何在函数中使用全局变量
- 如何将XML文件导入Excel中
- (转)分布式文件存储FastDFS(六)FastDFS多节点配置
- 使用nginx为ArcGIS Server做反向代理