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
#include "../Inc/tt_thread.h" volatile int g_iIRQ_disable_count = ;
volatile bool g_bIRQ_real_disable = ;
tt_sys.h
#ifndef INC_TT_SYS_H__
#define INC_TT_SYS_H__ #ifdef __cplusplus
extern "C" {
#endif extern 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 ");
}
#endif TT_INLINE bool tt_is_irq_disabled (void) //查看 中断屏蔽特殊寄存器的值 中断被屏蔽返回true,中断可用返回false
{
int primask = __get_PRIMASK ();
if ((primask & ) == ) //中断程序状态寄存器第0位置1,表示中断被屏蔽
return false;
else
return true;
} TT_INLINE void tt_enable_irq (void)
{
if (!tt_is_irq_disabled ()) //如果中断可以使用
{
__set_PRIMASK(); //PRIMASK写1,屏蔽中断
#if !defined TT_SYS_NO_PRINTF
printf ("Not call tt_disable_irq before tt_enable_irq\n");
#endif
while (); //错误处理,用死循环提示,我个人认为作者这么处理的原因是程序死掉,开发人员会追到这里,就知道原因了(没有先执行tt_disable_irq函数).
} g_iIRQ_disable_count--;
if (g_iIRQ_disable_count == )
{
if (g_bIRQ_real_disable)
{
__set_PRIMASK();
}
}
} TT_INLINE void tt_disable_irq (void)
{
if (tt_is_irq_disabled ()) //已经disbale过了
{
if (g_iIRQ_disable_count == )
g_bIRQ_real_disable = false;
}
else
{
__set_PRIMASK();
if (g_iIRQ_disable_count == )
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.
TinyThread源码分析之中断的更多相关文章
- linux-2.6.18源码分析笔记---中断
一.中断初始化 中断的一些硬件机制不做过多的描述,只介绍一些和linux实现比较贴近的机制,便于理解代码. 1.1 关于intel和linux几种门的简介 intel提供了4种门:系统门,中断门,陷阱 ...
- linux中断源码分析 - 中断发生(三)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 回顾 上篇文章linux中断源码分析 - 初始化(二)已经描述了中断描述符表和中断描述符数组的初始化,由于在初始 ...
- 鸿蒙内核源码分析(中断管理篇) | 江湖从此不再怕中断 | 百篇博客分析OpenHarmony源码 | v44.02
百篇博客系列篇.本篇为: v44.xx 鸿蒙内核源码分析(中断管理篇) | 江湖从此不再怕中断 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...
- 鸿蒙内核源码分析(中断概念篇) | 海公公的日常工作 | 百篇博客分析OpenHarmony源码 | v43.02
百篇博客系列篇.本篇为: v43.xx 鸿蒙内核源码分析(中断概念篇) | 海公公的日常工作 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪里 ...
- 鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射 | 百篇博客分析OpenHarmony源码 | v42.02
百篇博客系列篇.本篇为: v42.xx 鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...
- u-boot源码分析之C语言段
题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...
- Java并发包源码分析
并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善.现代的PC都有多个CPU或一个CPU中有多个 ...
- MyBatis源码分析(5)——内置DataSource实现
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...
- 【JUC】JDK1.8源码分析之LockSupport(一)
一.前言 最开始打算分析ReentrantLock,但是分析到最后,发现离不开LockSuport的支持,所以,索性就先开始分析LockSupport,因为它是锁中的基础,是一个提供锁机制的工具类,所 ...
随机推荐
- HDU 1394Minimum Inversion Number(线段树)
题目大意是说给你一个数组(N个),没戏可以将其首部的k(k<N)个元素移动至尾部,这样总共会形成N个序列 现在要求这n个序列中逆序对数最少的那一个序列有多少个逆序对 最初的确是没太多思路,就算知 ...
- Lotus 迁移到Exchange 2010 POC 之在Exchange 2007安装Transport Suite!
我们登录到Exchange 2007服务器,下载Transport 组件,下载地址如下,我们由于安装在Exchange 服务器上,所以需要安装64位版本:
- 计算直线的交点数(hdu1466简单的dp)
题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数.比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来 d ...
- WM_QUIT,WM_CLOSE,WM_DESTROY 消息出现顺序及调用方式
http://bbs.ednchina.com/BLOG_ARTICLE_3005455.HTM VC中WM_CLOSE.WM_DESTROY.WM_QUIT消息出现顺序及调用方式 wxleasyla ...
- 配置Outlook Anywhere2010
防火墙只需要开放CAS的443端口,其他硬件防火墙也是如此,不需要开放其他额外端口(80也没有必要开通,如果都使用https的话) 1.CAS:服务器配置-申请证书(内部.外部CAS名称)2.CAS: ...
- arp:地址解析协议(Address Resolution Protocol)(来自维基百科)
地址解析协议(Address Resolution Protocol),其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在I ...
- ProbS CF matlab源代码(二分系统)(原创作品,转载注明出处,谢谢!)
%ProbS clear all;%% 数据读入与预处理 data = load('E:\network_papers\u1.base');test = load('E:\network_papers ...
- 用ASP实现简单的繁简转换
用ASP实现简单的繁简转换 国际化似乎是一个很流行的口号了,一个站点没有英文版至少也要弄个繁体版,毕竟都是汉字,翻译起来不会那么麻烦:P 一般的繁简转换是使用字典,通过GB的内码算出BIG5字符在字典 ...
- PrettyProgressBar
https://github.com/liuguangqiang/PrettyProgressBar
- 如何利用PhoneGap制作地图APP
摘要:百度地图API是一套由javascript编写的地图程序接口,按说它应该运行在浏览器上.现在,只要利用PhoneGap,我们就能开发出移动平台上能使用的APP了! --------------- ...