目录

临界区:

临界区保护方法:

1.禁用系统调度器

2.禁用中断

临界区示例代码:

临界区:

一次仅只能有一个线程访问的共享资源,可以为一个具体的硬件设备,也可以是一个变量,一个缓冲区,但是,无论软件或硬件,都只能各种线程之间互斥访问。

例如:

rt_uint32_t value=0;

此时全局变量value就是一个共享资源,每个线程中对value访问的代码就是临界区,每次只允许一个线程进入临界区。

void task1(){value++;  //临界区while(value<50){
rt_kpritf("count is %s\n",value);}
}

临界区保护方法:

RT-Thread中提供了多种保护临界区的方法,具体分为以下几类

1.禁用系统调度器                   2.禁用中断

1.禁用系统调度器

将系统线程调度器锁住,直到临界区相关线程执行结束,再将调度器解锁,即可实现对临界区的保护。

void thread_entry(void* parameter)
{while(1){rt_enter_critical();   //将线程调度器上锁,此时线程调度器仅能响应中断/* 以下进入临界区 */. . . ./*临界区执行完成*/rt_exit_critical();  //调度器解锁}
}

注意:仅仅锁住调度器,中断可以响应

2.禁用中断

操作系统的线程调度都是基于中断的,所以禁用中断即可实现阻止线程之间的切换,禁用中断的函数实现如下:

void thread_entry(void* parameter)
{         rt_base_t level;  //创建变量以使用中断关闭和中断开启函数while(1){level = rt_hw_interrupt_disable();  //中断关闭函数/* 以下是临界区*/. . . .rt_hw_interrupt_enable(level);  中断开启函数}
}

注意:使用禁用中断时需要先创建变量,然后将中断关闭函数保存在变量中实现中断关闭,在开启中断时将改变量传入开启函数即可。

临界区示例代码:

#include <rthw.h>
#include <rtthread.h>
#define THREAD_PRIORITY      20
#define THREAD_STACK_SIZE    512
#define THREAD_TIMESLICE     5
/* 同时访问的全局变量 */
static rt_uint32_t cnt;
void thread_entry(void *parameter)
{rt_uint32_t no;rt_uint32_t level;no = (rt_uint32_t) parameter;while (1){/* 关闭中断 */level = rt_hw_interrupt_disable();cnt += no;/* 恢复中断 */rt_hw_interrupt_enable(level);rt_kprintf("protect thread[%d]'s counter is %d\n", no, cnt);rt_thread_mdelay(no * 300);}
}
int main(void)
{rt_thread_t thread;/* 创建thread1线程 */thread = rt_thread_create("thread1", thread_entry, (void *)10,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);if (thread != RT_NULL)rt_thread_startup(thread);/* 创建thread2线程 */thread = rt_thread_create("thread2", thread_entry, (void *)30,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);if (thread != RT_NULL)rt_thread_startup(thread);return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(main, interrupt sample);

现象:串口打印对cnt计算的结果,先加10,再加30,再加10依次循坏。

    如果不加临界区保护,会导致只跑一个线程,不会交替运行 

RT-Thread学习笔记五——临界区与临界区保护相关推荐

  1. Windows事件等待学习笔记(一)—— 临界区自旋锁

    Windows事件等待学习笔记(一)-- 临界区&自旋锁 基础知识 演示代码 案例一 案例二 LOCK 单行代码原子操作 多行代码原子操作 临界区 演示代码 手动实现 自旋锁 分析 KeAcq ...

  2. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

  3. Java之多线程学习笔记五 —— 多线程模拟龟兔赛跑

    Java之多线程学习笔记五 -- 多线程模拟龟兔赛跑 参考教程B站狂神https://www.bilibili.com/video/BV1V4411p7EF package pers.ylw.less ...

  4. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  5. Ethernet/IP 学习笔记五

    Ethernet/IP 学习笔记五 Accessing data within a device using a non-time critical message (an explicit mess ...

  6. 吴恩达《机器学习》学习笔记五——逻辑回归

    吴恩达<机器学习>学习笔记五--逻辑回归 一. 分类(classification) 1.定义 2.阈值 二. 逻辑(logistic)回归假设函数 1.假设的表达式 2.假设表达式的意义 ...

  7. 好程序员教程分析Vue学习笔记五

    好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...

  8. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  9. ROS学习笔记五:理解ROS topics

    ROS学习笔记五:理解ROS topics 本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具. 例子展示 roscore 首先运行roscore系列服务,这是使用R ...

  10. Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )

    Spring Boot 框架学习笔记(五) SpringSecurity安全框架 概述 作用 开发示例: 1. 新建项目 2. 引入依赖 3. 编写`SecurityConfig`类,实现认证,授权, ...

最新文章

  1. 删除coredump内容
  2. 一文搞懂RNN(循环神经网络)
  3. P1912 [NOI2009]诗人小G
  4. 转:如何调用另一个python文件中的代码
  5. 赞扬别人团建评论_赞扬精心设计:基于属性的测试如何帮助我成为更好的开发人员...
  6. 【华为云技术分享】云小课 | 如何通过虚拟私有云保障服务安全
  7. 力算未来丨一张图看懂华为“鲲鹏+昇腾”双引擎
  8. 一步一步搭建oracle 11gR2 rac+dg之环境准备(二)【转】
  9. EasyUI加载树控件自动展开所有目录
  10. visual studio 安装教程
  11. 基于jQuery的uploadify(flash上传文件)控件v1.6.2 bug修正
  12. DOS及BIOS中断调用实验
  13. 【板栗糖GIS】global mapper 如何通过dsm批量制作贴地等高线
  14. 基于WinForm开发的Ribbon界面案例
  15. 产品温度冲击检测 VS 实际使用寿命换算详解
  16. 关于候鸟捕杀——人类愚蠢之至
  17. notepad拼心形_用shell脚本写个心形动画表格
  18. GBase 8c开发接口
  19. 百家号自媒体文章出现哪些因素会不推荐?
  20. 你可和差拨便去那里 视频转换软件

热门文章

  1. DSP TMS320F280049之模拟比较器CMPSS(寄存器版)
  2. 黑衣人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三十四)
  3. 快手直播如何引流?快手直播引流怎么做?快手直播推广如何精准吸粉?​
  4. 046 中值定理之型三(ξ与a,b不可分离;凑微法);型四(ξ η多个中值之case1:找三点 两次拉格朗日)
  5. 男人最喜欢女人说的五句话
  6. 花式索引与np.ix_函数
  7. Kaggle实战:随机森林预测泰坦尼克生存率
  8. 8通道Pt100/Pt1000转RS-485/232,热电阻温度Modbus数据采集模块
  9. 配电房轨道式智能巡视机器人_HT-TSX-600-配电房轨道机器人视频巡检系统
  10. 02 【基础篇-vim编辑器 网络配置 远程登录】