RTX——第11章 临界段,任务锁和中断锁
以下内容转载自安富莱电子: 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章 临界段,任务锁和中断锁的更多相关文章
- Linux——临界段,信号量,互斥锁,自旋锁,原子操作
一. linux为什么需要临界段,信号量,互斥锁,自旋锁,原子操作? 1.1. linux内核后期版本是支持多核CPU以及抢占式调度.这里就存在一个并发,竞争状态(简称竟态). 1.2. 竞态条件 发 ...
- FreeRTOS 调度锁,任务锁和中断锁
以下转载自安富莱电子: http://forum.armfly.com/forum.php 调度锁调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调度锁关之 ...
- JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,
如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...
- RTX临界段,中断锁与任务锁
临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断. ...
- FreeRTOS 临界段和开关中断
以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断 ...
- 【转载】ucos临界段
其实很简单: 临界段就是不可中断的程序段,比如从UART中读取当前传递回来的值,如果有UART中断,此时这个值又会改变.同样临界段就是保护这类全局变量,如在读取时间节拍时,不应该被时钟更新时钟 ...
- 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!
网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...
- 写文章 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!
网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...
- Linux就这个范儿 第11章 独霸网络的蜘蛛神功
Linux就这个范儿 第11章 独霸网络的蜘蛛神功 第11章 应用层 (Application):网络服务与最终用户的一个接口.协议有:HTTP FTP TFTP SMTP SNMP DNS表示层 ...
随机推荐
- 〖Linux〗Qt5.2.0+gsoap开发Android的NDK程序遇到错误的解决
1. error: cannot convert ‘int*’ to ‘hostent**’ for argument ‘5’ to.. 原因分析: 缺少的宏定义,导致使用了错误的函数原型. 被调用 ...
- Tomcat 配置加密的服务器连接器
先查询API,找到Configuration里面的Connector的HTTP中的SSL(加密连接器) SSL abbr. Security Socket Layer 加密套接字协议层 利用已生成 ...
- 数据库选型之亿级数据量并发访问(MySQL集群)
刘 勇 Email:lyssym@sina.com 简介 针对实际应用中并发访问MySQL的场景,本文采用多线程对MySQL进行并发读取访问,其中以返回用户所需的数据并显示在终端为测试结束节点,即将 ...
- leetcode16 3-Sum
题目链接 给定数组a[](长度不小于3)和一个数字target,要求从a中选取3个数字,让它们的和尽量接近target. 解法:首先对数组a进行排序,其次枚举最外面两层指针,对于第三个指针肯定是从右往 ...
- CocoaPods的ruby问题 Error fetching http://ruby.taobao.org/:
今天安装了一个CocoaPods,在安装淘宝ruby是遇到了问题 bogon:~ zhch$ gem sources -a http://ruby.taobao.org/ Error fetching ...
- WEB网络问题的排查【转】
Browser/Server结构主要是利用了不断成熟的Web浏览器技术:结合浏览器的多种脚本语言和ActiveX技术,用通用浏览器实现原来需要复杂专用软件才能实现的强大功能,同时节约了开发成本.B/S ...
- iOS - UnitTests 单元测试
1.UnitTests 在计算机编程中,单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编 ...
- 继承CListCtrl,然后重载OnLButtonUP消息,发现变成双击才触发???
原文链接: http://bbs.csdn.net/topics/380052636 1楼 因为WM_LBUTTONDOWN事件和NM_CLICK事件是同时发生的,只是后者要等到用户释放鼠标后才算完成 ...
- TDR,阻抗匹配,反射,源端匹配,终端匹配
什么是阻抗 阻抗分三种,电阻.电容.电感,三者阻抗表达式如下: 符号 单位 表达式 备注 电阻 R 欧姆 Ω 电压电流相位相同 电容 C 法拉 F 电压相位落后电流90度 电感 L 亨利 H 电压相位 ...
- php DES加密或者解密
function pkcs5_pad ($text, $blocksize) { //加密时的字节填充,保持和java 一致 $pad = $blocksize - (strlen($text) % ...