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包含了当前正在执行的中断服务程序编号,用于识别当前中断。相关推荐

  1. 【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )

    一. 中断控制 ( 基于 S3C6410 开发板 ) 1. 关闭中断的两个步骤 (1) 关闭中断步骤 2. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器简介 (2) CPRS 寄存器 中断 ...

  2. 程序状态寄存器PSR

    当前程序状态寄存器(CPSR)在所有处理器模式下都是可访问的,它包括条件标志位,中断标志位,当前处理器模式控制以及其他状态和控制位.每种异常模式都有一个保存程序状态寄存器(SPSR),当异常发生时用于 ...

  3. ARM的7种工作模式、37个通用寄存器、CPSR程序状态寄存器

    一.ARM 采用的是32位架构 1.ARM约定 Byte:8 bits Halfword:16 bits (2 byte) Word:32 bits (4 byte) 2.大部分ARM core 提供 ...

  4. 基于ARM9程序状态寄存器CPSR

    定义:程序状态寄存器: 功能:反映数据运算状态,控制系统模式等: 特点:程序状态寄存器不属于通用寄存器: 关于CPSR的访问,ARM专门为其设立了两条指令: MRS:CPSR到通用寄存器传递数据指令: ...

  5. ARM Cortex-M3与Cortex-M4中断相关寄存器

    NVIC寄存器列表 中断使能寄存器 设置中断挂起和清除中断挂起 中断活跃状态寄存器 中断优先级寄存器 软件触发中断寄存器 中断控制器类型寄存器 SCB寄存器 中断控制和状态寄存器(ICSR).向量表偏 ...

  6. 15_串口中断通信寄存器即库函数配置编写实例

    串口中断通信寄存器即库函数配置编写实例 目录 串口中断通信寄存器即库函数配置编写实例 常用的串口相关寄存器: 波特率计算方法: USART_InitTypeDef结构体详解: 串口配置一般步骤: 调试 ...

  7. 51单片机中断相关寄存器

    52单片机中断级别 中断允许寄存器IE EA--全局中断                ES--串口中断 ET2--定时器2中断         EX1--外部中断1 ET1--定时器1 中断     ...

  8. stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)

    rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...

  9. php excel中解析显示html代码_骑士cms从任意文件包含到远程代码执行漏洞分析

    前言 前些日子,骑士cms 官方公布了一个系统紧急风险漏洞升级通知:骑士cms 6.0.48存在一处任意文件包含漏洞,利用该漏洞对payload文件进行包含,即可造成远程代码执行漏洞.这篇文章将从漏洞 ...

最新文章

  1. PMCAFF微课堂 | 阿里资深运营揭秘电商运营与纯互联网运营的区别与互通
  2. ScriptManager同时存在于两个dll中的问题
  3. WCF netTcpBinding寄宿到IIS7
  4. 设计模式 之 工厂模式
  5. spring webflow : 上传单个文件实例
  6. mysql服务启动失败 Starting MySQL. ERROR! The server quit without updating PID file
  7. 8001.win10安装ros2-dashing环境搭建
  8. Python花式编程案例锦集(4)
  9. 马斯克:2020 年底将完成 L5 级别自动驾驶功能
  10. C# 概念 委托和事件
  11. 分布式MySQL数据库中间件 mysqlda
  12. python检查exe运行是否报错_python打包成exe格式后,在部分机子上没法运行
  13. lnmp mysql 哪个好_[LNMP]Mysql生产环境配置
  14. 传输线应用基础,阻抗匹配与谐波控制
  15. mac系统 查找英文目录
  16. python 技能系统
  17. Github新手之路(全过程)(站在前辈的肩膀上的总结)
  18. 微信小程序的推广方案有哪些
  19. 【第二章 语言及文法】形式语言与自动机第二章个人总结复习笔记分享!(含文件、持续更新...)
  20. 中医卫统直报、重点专科、绩效考核病案首页字段汇总-标出差异

热门文章

  1. [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
  2. [python]网络编程基础学习笔记(一)客户/服务器网络介绍
  3. 简单的RPC java实现
  4. POJ-3469 Dual Core CPU 最小割最大流
  5. .NET中回发或回调参数无效问题的解决
  6. Java 中的几种线程池,你之前用对了吗,互联网 面试官 如何面试
  7. python如何在函数中使用全局变量
  8. 如何将XML文件导入Excel中
  9. (转)分布式文件存储FastDFS(六)FastDFS多节点配置
  10. 使用nginx为ArcGIS Server做反向代理