zoukankan      html  css  js  c++  java
  • 第十三讲--临界区保护

      临界区保护,主要解决共享资源的问题。问题引入:比如一个普通的task中:

    u8 count=0;//语句1
    count++;   //语句2

         同样,在一个中断函数中,count=count+10,本意是希望中断和 task都能实现对count进行增加的操作。而现实有可能是这样的:

      首先count的值为0,在 task中,看起来count++ 只是一个语句,但是其实有好几句汇编指令:

      首先把 count的值赋给R0; ----汇编1

      然后对R0执行加1;------汇编2

      然后再把R0的值赋给 count;----汇编3

      如果在汇编2的时候,语句被中断打断,执行了count=count+10的操作,但是回到汇编3,count还是只被增加了1次,即count为1,不为12。中断中的写入无效,被覆盖了。

      临界区是指访问多个任务共享的一段代码。如果有任务进入临界区,其他任务必须等待他退出。中断也一样。任务在访问临界区的时候,我们把中断屏蔽,等退出临界区后再响应中断。中断标志位是一直有效的,不用担心中断没有被响应,只是推迟响应而已。关中断后,中断抢占任务的问题就得到解决了,同时因为关了中断,pendsv无效,就不会进行任务切换,所以任务和任务之间的资源抢占也解决了。另外临界区保护还有嵌套的问题,如果只是简单粗暴的用开和关来实现,那么就会有下面这个问题。感觉这样也是有问题的,终端嵌套没法用这么简单的方式解决,课程目前只讲到这边,只能先这样了。

    最后这样实现。

     

        uint32_t status = tTaskEnterCritical(); //进入临界区
    
        tTaskExitCritical(status); //退出临界区
  • 相关阅读:
    [Linux] 解决CentOS下Requires: libjson-c.so错误
    磁盘分区就是这么简单,电脑小白都能看懂的磁盘分区教程!
    Linux常见压缩、解压缩
    安装/删除MySQL数据库
    MapReduce与Yarn 的详细工作流程分析
    SQL 增、删、改、查语句
    Apache Kylin 概述
    DHCP服务器配置及测试
    忘记root密码
    记第一次重装系统
  • 原文地址:https://www.cnblogs.com/nasduc/p/8493153.html
Copyright © 2011-2022 走看看