• 第十三讲--临界区保护


      临界区保护,主要解决共享资源的问题。问题引入:比如一个普通的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); //退出临界区
  • 相关阅读:
    老友记实战,17上
    老友记实战,9下
    老友记实战,5下
    公共样式base.css
    单选框radio总结(获取值、设置默认选中值、样式)
    js tab切换
    HTTP状态码100、200、300、400、500、600的含义
    微信小程序事件绑定
    微信小程序获取手机验证码
    js滚动到指定位置导航栏固定顶部
  • 原文地址:https://www.cnblogs.com/nasduc/p/8493153.html
Copyright © 2020-2023  润新知