以下内容转载自安富莱电子: http://forum.armfly.com/forum.php

临界段
代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码
的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。
由于 Cortex-M3/M4 的 RTX 内核库中没有关闭中断的操作,也就是说 RTX 的源码中不存在临界段。
如果源码中有临界段的话,会给系统带来什么问题呢?比如此时某个任务正在调用系统 API 函数,而且此
时中断正好关闭了,也就是进入到了临界区中,这个时候如果有一个紧急的中断事件被触发,这个中断就
不能得到及时执行,必须等到中断开启才可以得到执行,如果关中断时间超过了紧急中断能够容忍的限度,
危害是可想而知的。 像 uCOS-II,uCOS-III 和 FreeRTOS 的源码中都是有临界段的。
除了上面说的操作系统源码所带的临界段以外,用户写应用的时候也有临界段的问题,比如以下两种:
 读取或者修改变量(特别是任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。
 调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。
总之,对于临界段要做到执行时间越短越好,要不会影响系统的实时性。

中断锁
中断锁就是 RTOS 提供的开关中断函数,因为 Cortex-M3/M4 的 RTX 源码中没有关闭中断的操作,
所以也就没有提供开关中断函数。
由于 RTX 没有提供开关中断函数,如果用户自己的应用代码需要开关中断的话怎么办呢?裸机时如何
开关中断的,在使用了 RTX 后仍然使用以前的开关中断函数即可。

任务锁
简单的说,为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制就是任务锁。 实现任
务锁可以通过给调度器加锁或者直接关闭RTOS内核定时器(就是前面一直说的系统滴答定时器)来实现。
 通过给调度器加锁实现
给调度器加锁的话,就无法实现任务切换,高优先级任务也就无法抢占低优先级任务的执行,同时高
优先级任务也是无法向低优先级任务切换的。像 uCOS-II 和 uCOS-III 是采用的这种方法实现任务锁。
特别注意,这种方式只是禁止了调度器工作,并没有关闭任何中断。
 通过关闭 RTOS 内核定时器实现
关闭了 RTOS 内核定时器的话,也就关闭了通过 RTOS 内核定时器中断实现任务切换的功能,因为在
退出定时器中断时需要检测当前需要执行的最高优先级任务,如果有高优先级任务就绪的话需要做任
务切换。 RTX 操作系统是采用的这种方式实现任务锁的。

RTX 任务锁的实现
使用如下 2 个函数可以实现 RTX 任务的开锁和解锁:
 tsk_lock
 tsk_unlock

函数 tsk_lock
函数原型:
void tsk_lock (void);
函数描述:
函数 tsk_lock 用于禁止 RTX 内核定时器中断,因此也就禁止了任务切换。
使用这个函数要注意以下问题:
1. 函数 tsk_lock 不支持嵌套调用。
2. 不允许在中断服务程序中调用 tsk_lock。
3. RTX 内核定时器被关闭期间,RTX 内核任务调度器和需要时间片调度的任务被阻塞。 设置的任务延迟
时间不再工作。 因此,强烈建议关 RTX 内核定时器中断的时间越短越好。

函数 tsk_unlock
函数原型:
void tsk_unlock (void);
函数描述:
函数 tsk_unlock 用于使能 RTX 内核定时器中断,因此也就重新开启任务切换。 注意 tsk_unlock 一定要跟
tsk_lock 配套使用。
使用这个函数要注意以下问题:
1. 函数 tsk_lock 不支持嵌套调用。
2. 不允许在中断服务程序中调用 tsk_lock。

练兵场:

如果多个函数访问同一个函数,比如printf函数,那么就有可能因为阻塞时间问题,引起访问冲突,如下所示:

现在我们加入任务锁,并且不改变任务的上图乱码工程的阻塞时间,再测试:

选取一个任务举例任务锁:

RTX——第11章 临界段,任务锁和中断锁的更多相关文章

  1. Linux——临界段,信号量,互斥锁,自旋锁,原子操作

    一. linux为什么需要临界段,信号量,互斥锁,自旋锁,原子操作? 1.1. linux内核后期版本是支持多核CPU以及抢占式调度.这里就存在一个并发,竞争状态(简称竟态). 1.2. 竞态条件 发 ...

  2. FreeRTOS 调度锁,任务锁和中断锁

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 调度锁调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调度锁关之 ...

  3. JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,

    如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...

  4. RTX临界段,中断锁与任务锁

    临界段         代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断.    ...

  5. FreeRTOS 临界段和开关中断

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断 ...

  6. 【转载】ucos临界段

    其实很简单:     临界段就是不可中断的程序段,比如从UART中读取当前传递回来的值,如果有UART中断,此时这个值又会改变.同样临界段就是保护这类全局变量,如在读取时间节拍时,不应该被时钟更新时钟 ...

  7. 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!

    网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...

  8. 写文章 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!

    网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...

  9. Linux就这个范儿 第11章 独霸网络的蜘蛛神功

    Linux就这个范儿 第11章  独霸网络的蜘蛛神功  第11章 应用层 (Application):网络服务与最终用户的一个接口.协议有:HTTP FTP TFTP SMTP SNMP DNS表示层 ...

随机推荐

  1. java 关于操作Collection的一点说明

    java 中有一个工具类 Collections 其中的一个方法 static <T> boolean replaceAll(List<T> list, T oldVal, T ...

  2. ab,qps,服务器性能压力

    ab,qps,服务器性能压力   作者及来源: 陳聽溪 - 博客园    收藏到→_→:   摘要: ab,qps,服务器性能压力    http://www.makaidong.com/%E5%8D ...

  3. 架构-LAMP特级学习(网站服务器监控)

    1.服务监控(SNMP配合CACTI监控) Apache Web服务监控 MySQL数据库监控 磁盘空间监控 2.流量监控(SNMP配合MRTG监控) 网站流量监控 3.使用SNMP可以获取被监控服务 ...

  4. 更安全的HTTPS

    iOS9把所有的http请求都改为https了:iOS9系统发送的网络请求将统一使用TLS 1.2 SSL.采用TLS 1.2 协议,目的是 强制增强数据访问安全,而且 系统 Foundation 框 ...

  5. 网站跳转到cgi-sys/defaultwebpage.cgi的原因和解决方式

    cpanel遇到这种问题,看了这篇文章老鹰主机域名解析A记录教程–关于cgi-sys/defaultwebpage.cgi后,尝试后     首先ping 域名,结果如下     看到没有ping结果 ...

  6.  RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡

    目录 目录 1.基本概念 1.1.RabbitMQ集群概述 1.2.软件负载均衡器HAProxy 2.RabbitMQ的配置步骤 2.1.安装 Erlang.RabbitMQ 2.2.修改 /etc/ ...

  7. C#基础 - C# 的 常见概念简述

    在上篇文章中,你跟着我写了一个HelloWorld,本篇中,我们来谈谈一些C#程序中的小概念 1.C# 程序结构 一个 C# 程序主要包括以下部分: 命名空间声明(Namespace declarat ...

  8. Linux内核同步 - sleepable RCU的实现

    一.前言 由于曾经在Linux2.6.23上工作了多年,我对这个版本还是非常有感情的(抛开感情因素,本来应该选择longterm的2.6.32版本来分析的,^_^),本文主要就是描述Linux2.6. ...

  9. malloc的内存分配原理

    0 堆内存的在计算机内存中的形式 根据<The C Programming language>推测得到堆内存,图中的Heap区域即为堆内存块(Heap区域的数目不代表计算机堆内存的真实数目 ...

  10. java concurrent之ReentrantLock

    在编码的过程中.有时候我们不得不借助锁同步来保证线程安全.synchronizedkeyword在上一篇博客中已经介绍.自从JDK5開始,加入了还有一种锁机制:ReentrantLock. 二者的差别 ...