博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于RT-Thread调度器锁
阅读量:2189 次
发布时间:2019-05-02

本文共 1038 字,大约阅读时间需要 3 分钟。

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

调用这个函数后,调度器将被上锁。在系统锁住调度器的期间,系统依然响应中断,如

果中断唤醒了的更高优先级线程,调度器并不会立刻执行它,直到调用解锁调度器函数才尝

试进行下一次调度。

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

当系统退出临界区的时候,系统会计算当前是否有更高优先级的线程就绪,如果有比当

前线程更高优先级的线程就绪,将切换到这个高优先级线程中执行;如果无更高优先级线程

就绪,将继续执行当前任务

 

 

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

2.RTT调度器锁 
  调度器锁,是用于线程同步的一种方式,RT-Thread提供的调度器锁在使用时比较简单,只有上锁(rt_enter_critical)和解锁(rt_exit_critical)两个接口,但结合业务逻辑来说,则需注意,比如上述基本问题。调度器锁与中断锁类似,上锁后只有解锁后其他线程才能获取CPU资源执行;不同的是,调度器锁上锁后如有中断进入,系统仍然可以响应中断,中断锁则是屏蔽了包括中断在内的所有任务响应。根据调度锁特点,在业务应用层使用到调度锁时,需要考虑上锁后处理任务的复杂度和占用CPU资源,长时间占有CPU资源会降低系统的实时性及导致任务翻转(高优先级任务未能及时执行),或者中断响应的任务未能执行。 
3.总结 
1)“成对出现”,与malloc/free、new/delete内存分配类似,保证“成对出现”。调度锁上锁和解锁必须在同一线程内,理论上在线程内其他地方解锁都可以,但良好的习惯应该保证在同一函数内。 
2)可以嵌套使用,但仍要遵守“成对出现”规则,每一次上锁,对应一次解锁,RTT的调度器锁最大嵌套深度是65535。 
3)注意逻辑条件,考虑是否存在某种条件下直接执行函数返回,但并未解锁。 
4)上锁任务占用的CPU资源应该尽可能小,并及时退出。 
5)如出现前面提到类似的现象,可参考本文。

 

转自:

转载地址:http://ncuub.baihongyu.com/

你可能感兴趣的文章
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>
剑指offer 20.顺时针打印矩阵
查看>>
剑指offer 21.包含min函数的栈
查看>>
剑指offer 23.从上往下打印二叉树
查看>>
剑指offer 25.二叉树中和为某一值的路径
查看>>
剑指offer 60. 不用加减乘除做加法
查看>>
Leetcode C++《热题 Hot 100-14》283.移动零
查看>>
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>