调度器锁rt_enter_critical() & rt_exit_critical()

2023-05-16

一、函数说明

void rt_enter_critical(void); /* 进入临界区*/

调用这个函数后,调度器将被上锁。在系统锁住调度器的期间,系统依然响应中断,如果中断唤醒了的更高优先级线程,调度器并不会立刻执行它,直到调用解锁调度器函数才尝试进行下一次度。

void rt_exit_critical(void); /* 退出临界区*/

当系统退出临界区的时候,系统会计算当前是否有更高优先级的线程就绪,如果有比当前线程更高优先级的线程就绪,将切换到这个高优先级线程中执行;如果无更高优先级线程就绪,将继续执行当前任务。

二、运行方式

调度器锁,是用于线程同步的一种方式,RT-Thread提供的调度器锁在使用时比较简单,只有上锁(rt_enter_critical)和解锁(rt_exit_critical)两个接口,但结合业务逻辑来说,则需注意,比如上述基本问题。调度器锁与中断锁类似,上锁后只有解锁后其他线程才能获取CPU资源执行;不同的是,调度器锁上锁后如有中断进入,系统仍然可以响应中断,中断锁则是屏蔽了包括中断在内的所有任务响应。根据调度锁特点,在业务应用层使用到调度锁时,需要考虑上锁后处理任务的复杂度和占用CPU资源,长时间占有CPU资源会降低系统的实时性及导致任务翻转(高优先级任务未能及时执行),或者中断响应的任务未能执行。

三、使用总结

1)“成对出现”,与malloc/free、new/delete内存分配类似,保证“成对出现”。调度锁上锁和解锁必须在同一线程内,理论上在线程内其他地方解锁都可以,但良好的习惯应该保证在同一函数内。
2)可以嵌套使用,但仍要遵守“成对出现”规则,每一次上锁,对应一次解锁,RTT的调度器锁最大嵌套深度是65535。
3)注意逻辑条件,考虑是否存在某种条件下直接执行函数返回,但并未解锁。
4)上锁任务占用的CPU资源应该尽可能小,并及时退出。

四、注意事项

如出现如下类似的现象,可参考本文。

RT-Thread系统开发,业务应用使用到了RT-Thread的调度器锁,因为使用不慎导致走了一部分弯路。致命的错误是,未有考虑到逻辑的执行与非执行后果,线程上锁后,逻辑条件未满足调度锁未能释放,从而导致其他线程未能获得CPU资源,出现是系统“假死”的现象。由于逻辑条件比较难重现,任务线程也及中断条件也不少,查找问题花费一部分时间。当然,最后还是发现致命的基础问题,就是调度器锁未能及时释放。
 


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调度器锁rt_enter_critical() & rt_exit_critical() 的相关文章

  • 如何从 Python 函数外部停止执行该函数?

    所以我有一个我使用的库 在我的一个函数中 我调用该库中的一个函数 这恰好需要很长时间 现在 同时我有另一个线程在运行 我在其中检查不同的条件 我想要的是 如果满足条件 我想取消库函数的执行 现在我正在检查函数开始时的条件 但是如果在库函数运
  • Python:退出for循环?

    我对 SO 做了一些研究 并且知道有人提出了许多类似的问题 但我无法完全得到答案 不管怎样 我正在尝试构建一个库来使用 塞萨尔数字 技术 加密 字符串 这意味着我必须获取该字符串并将每个字母替换为字母表中 X 位置之外的另一个字母 我希望这
  • JavaScript:输入按键

    早上好 I am using java script in each page to trigger the Enter key press Event inside the textbox It is working fine Now i
  • 我如何检查我的应用程序是否正在运行

    如何检查我的 Android 应用程序是否已在运行以防止重复启动 如何进行 硬退出 以防止我的应用程序在后台运行 双发射 是不可能的 如果您的应用程序已经在运行 并且您尝试启动另一个实例 那么您将恢复第一个启动实例 您可以通过添加来完成活动
  • 等待进程结束异步,然后调用主窗体中的函数

    我正在用 C 编写一个游戏编辑器 我的程序通过启动 notepad exe 进程以 txt 文件打开 如果该进程退出 我想调用主窗体中的函数 以更新文本框 这是我到目前为止正在做的事情 void OpenTextEditor TreeNod
  • 从批处理文件中的java应用程序获取退出代码

    我目前正在努力为我们的一个 java 应用程序创建测试用例 在我的代码中 我的 java 应用程序调用一个批处理文件 该文件又启动一个单独的 java 进程 该进程返回一个我需要从调用 java 应用程序使用的错误代码 我正在执行以下操作来
  • 如何中止 Python 脚本的执行? [复制]

    这个问题在这里已经有答案了 我有一个简单的 Python 脚本 如果满足条件 我想停止执行该脚本 例如 done True if done quit stop exit else do other stuff 本质上 我正在寻找与函数体中的
  • 如何让 python 脚本安全退出?

    这是我有一个必须输入的密码的情况 如果输入错误 脚本将无法继续并自行退出 但我怎样才能告诉脚本安全地退出呢 I tried sys exit 但这会产生回溯错误 并且看起来不是一个非常干净的退出方法 实际上 sys exit 只会抛出一个S
  • 如果退出程序而不执行 fclose() 会发生什么?

    问题 如果我退出程序而不关闭文件会发生什么 是否发生了一些不好的事情 例如 某些操作系统级别的文件描述符数组未释放 两种情况下的答案相同 程序退出 意外崩溃 代码示例 对于程序退出 我的意思是这样的 int main fopen foo t
  • 我们应该在 C++ 中使用 exit 吗?

    根据C 参考 exit正常终止进程 执行常规清理 用于终止程序 正常的程序终止执行以下操作 以相同的顺序 与当前线程关联并具有线程存储的对象 持续时间被破坏 仅限 C 11 具有静态存储的对象 持续时间被破坏 C 并且使用 atexit 注
  • Node.js process.exit() 不会在 createReadStream 打开时退出

    我有一个通过 EAGI 与 Asterisk 通信的程序 Asterisk 打开我的 Node js 应用程序并通过 STDIN 向其发送数据 程序通过 STDOUT 发送 Asterisk 命令 当用户挂断电话时 Node js 进程会收
  • 如何在屏幕会话中执行命令

    我想知道如何在屏幕会话中执行命令 我搜索了一下 发现了这个 screen S nameofscreen X stuff command 当我输入此命令时 命令会在屏幕内输入 但不会执行 所以我的问题是如何使用此命令按 Enter 键 我会做
  • 停止执行另一代码的代码

    我有一个R进行一些数据分析并返回的代码TRUE FALSE 有时 输入数据太大 代码就继续运行 我想要一个脚本来监视我的数据分析代码 如果它没有返回任何内容 比如说600 seconds 然后它会停止正在运行的代码并执行其他操作 就会像按S
  • 什么会导致 Java 在 System.exit() 之后继续运行?

    我有一个 Java 程序 正在通过以下方式启动ProcessBuilder来自另一个 Java 程序 System exit 0 是从子程序调用的 但对于我们的一些用户 在 Windows 上 java exe与子进程关联的进程不会终止 子
  • Python 缩进之谜

    为什么我会收到以下错误 最后print声明不应成为while loop gt gt gt while n gt 0 n n 1 print n print TO A File
  • 有没有办法在php代码中注意到E_NOTICE?

    我有一个 PHP 脚本 需要执行几个小时 有时由于某些原因 例如 执行需要连接到互联网的脚本时出现网络问题等 执行过程会停止一段时间 然后做了错误的事情 当进程走向错误时它总是会导致 E NOTICE 我的问题是 有 任何 方法可以注意到脚
  • 进程退出的问题

    假设我有一个 ID 为 1234 的进程 该进程在我的应用程序运行之前运行 我有这个代码 Process app Process GetProcessById 1234 MessageBox Show app MainWindowTitle
  • 获取 Bash 和 KornShell (ksh) 中命令的退出代码

    我想写这样的代码 command some command safeRunCommand command safeRunCommand cmnd 1 cmnd if 0 then printf Error when executing co
  • exit() 和 abort() 有什么区别?

    在C和C 中 有什么区别exit and abort 我试图在发生错误 不是例外 后结束我的程序 abort http en cppreference com w c program abort退出程序而不调用使用注册的函数atexit h
  • 以编程方式结束/退出粘合作业

    我正在使用 Glue 书签来处理数据 我的工作是每天安排的 但也可以 手动 启动 由于我使用书签 有时胶水作业可以在没有新数据要处理的情况下启动 然后读取的数据帧为空 在这种情况下 我想好好地结束我的工作 因为它没有什么关系 我试过 if

随机推荐

  • xrdp_mm_process_login_response:login failed

    题外话 xff1a 被这个问题困扰了一个多钟 xff0c 百度搜索真的真的不如谷歌搜索 xff0c 最后是使用谷歌搜索一下子就找到适合自己的right answer xff01 问题描述 xff1a win10下远程桌面连接ubuntu服务
  • 使用SQl创建表单。查询,增加,修改删除,数据。

    使用SQl创建表单 查询 xff0c 增加 xff0c 修改删除 xff0c 数据 打开SQl数据库 右键数据库新建数据库 弹出新建数据库 xff0c 给数据库命名 左侧可以找到刚刚创建的数据库 选择刚刚创建滴数据库 xff0c 右键 表
  • Linux远程控制之VNC (server ,viewer)安装教程 || chkconfig

    VNC 可以实现对另外的计算机的操作 xff1a A xff1a 可以访问另一个计算机 xff0c 采用命令终端 或者窗口界面 B xff1a 可以远程控制另一个计算机 xff0c 两台同步显示操作 首先 xff0c 没有readme所说的
  • POJ 滑动窗口(优先队列的应用)

    数据结构与算法A 第三章 栈与队列 练习题 滑动窗口 思路 对于最大最小值分别维护一个优先队列 xff08 保存元素下标 xff09 以最小值为例 每次遇到一个新元素 xff0c 从队尾插入 插入时删去队列中比该值大的元素 xff08 因为
  • 数据结构:单链表头插法、尾插法、按值查找、按位查找、按位插入、删除、表长函数实现

    这里写目录标题 数据结构定义初始化头结点判断链表是否为空带头结点的按位序插入头插法尾插法按值查找 xff0c 返回节点按位查找 xff0c 返回节点将新节点插入到第i个位置删除第i个节点遍历输出求链表长度主函数测试各个功能完整代码 数据结构
  • Debian操作系统安装

    xff08 本文描述操作系统为debian 8 2 0 64位操作系统 以下使用debian代替debian 8 2 0 64位操作系统 xff09 下载 首先需要下载ubuntu操作系统iso映像文件 ubuntu kylin官网 下载W
  • linux文件属性、文件权限管理和stat函数

    1 linux中各种文件类型 1 1 普通文件 xff08 xff09 regular file 文本文件 xff1a 文件中的内容都是由文本构成的 xff0c 文本指的是ASCII码 xff0c Unicode码 xff0c utf8码等
  • argc和argv,参数个数和参数值

    argc xff1a argument count 参数个数 argv xff1a argument value 参数值 C C 43 43 语言中的main函数 xff0c 经常带有参数argc xff0c argv xff0c 如下 x
  • short转换为char,提取单字节

    本文描述 xff1a 将两个字节长度的wdVersion xff0c 分别提取出低字节和高字节的值 xff0c 此方法可以用于不同类型不同长度的单字节提取 xff01 xff08 注释种的位操作的方法也可以 xff0c 先 移位 后 位与
  • 常用内存操作函数

    常用内存操作函数 常用内存操作函数1 设置内存数据2 复制内存数据3 移动内存数据4 比较内存数据5 对齐分配内存6 释放对齐分配的内存 总结 常用内存操作函数 内存操作是C语言的基础 xff0c 常用的内存操作函数大致可以分成如下6类 1
  • RT-Thread临界段之rt_hw_interrupt_enable和rt_hw_interrupt_disable

    一 PRIMASK PRIMSK 61 1 关闭中断 PRIMSK 61 10 打开中断 二 void rt hw interrupt enable rt base t level 有参数 xff0c 无返回值 该功能将设置指定的中断状态
  • 信号量使用之:线程间同步与互斥,线程与中断同步,资源计数

    一 线程与线程的同步 互斥 xff08 锁 xff09 生产者与消费者问题本质是 xff1a 解决线程间互斥关系和同步关系问题 由于缓冲区是临界资源 xff0c 它一个时刻只允许一个生产者放入消息 xff0c 或者一个消费者从中取出消息 x
  • 互斥量之:与信号量区别;死锁;优先级翻转;递归锁

    一 互斥量 xff08 一 xff09 互斥量的定义 互斥量的状态只有两种 xff0c 开锁或闭锁 xff08 两种状态值 xff09 当有线程持有它后 xff0c 互斥量将处于闭锁状态 xff0c 由这个线程获得它的所有权 相反 xff0
  • 线程同步之事件集event

    一 事件集 一个事件集中包含 32 个事件 xff08 一个 32 bit 无符号整型数 xff09 xff0c 特定线程只等待 接收它关注的事件 可以是一个线程等待多个事件的到来 xff08 线程 1 2 均等待多个事件 xff0c 事件
  • 电源引脚VDD、VSS、VDDA、VSSA、VREF+、VREF-、VBAT

    总体电源框图 一 名词解释 名称说明备注VCC电路的供电正电压一般表示模拟信号电源GND电路的供电负电压 xff1f 表示模拟信号地VDD芯片的工作正电压表示数字信号电源VSS芯片的工作负电压表示数字电源地VDDA芯片的工作正电压 模拟 V
  • iOS 系统自带地图 基本实现

    CLLocationManager 首先 xff0c 来讲一下CLLocationManager 因为 xff0c 有人明天要用到 xff0c 临时写的 那么怎么使用呢 xff1f 首先需要定义一个CLLocationManager的属性
  • norflash和nandflash;SRAM和SDRAM

    一 常见存储类型 典型应用名称描述MCU片内flashnorflash nor flash数据线和地址线分开 xff0c 可以实现ram一样的随机寻址功能 xff0c 可以读取任何一个字节 但是擦除仍要按块 页 擦除 因为按照字节寻址 xf
  • 断言ASSERT使用详解

    一 assert的定义 原以为assert 仅仅是个报错函数 xff0c 事实上 xff0c 它居然是个宏 xff0c 并且作用并非 34 报错 34 在经过对其进行一定了解之后 xff0c 对其作用及用法有了一定的了解 xff0c ass
  • 快速排序qsort函数用法

    一 qsort函数简介 排序方法有很多种 xff1a 选择排序 xff0c 冒泡排序 xff0c 归并排序 xff0c 快速排序等 看名字都知道快速排序是目前公认的一种比较好的排序算法 因为他速度很快 xff0c 所以系统也在库里实现这个算
  • 调度器锁rt_enter_critical() & rt_exit_critical()

    一 函数说明 void rt enter critical void 进入临界区 调用这个函数后 xff0c 调度器将被上锁 在系统锁住调度器的期间 xff0c 系统依然响应中断 xff0c 如果中断唤醒了的更高优先级线程 xff0c 调度