当前位置: 首页 > news >正文

杭州高端品牌网站建设深圳建设行业网站

杭州高端品牌网站建设,深圳建设行业网站,安徽六安网,wordpress消息推送文章目录 为什么需要互斥访问?使用队列实现互斥访问休眠和唤醒机制环形缓冲区 为什么需要互斥访问? 在裸机中,假设有两个函数(func_A, func_B)都要修改a的值(a),那么将a定义为全局变…

文章目录

    • 为什么需要互斥访问?
    • 使用队列实现互斥访问
      • 休眠和唤醒机制
      • 环形缓冲区


为什么需要互斥访问?

在裸机中,假设有两个函数(func_A, func_B)都要修改a的值(a++),那么将a定义为全局变量a=0,main函数调用func_A();func_B(); 此时a的值为2。因为不存在多任务执行,代码是按照顺序执行的。

在多任务系统中,多个任务在微观上是串行执行,宏观上是并行执行的。 假设两个任务(func_A, func_B)也都要修改a的值(a++),会有什么情况呢?
首先,将修改a的值的代码a++做个拆分:
1、从内存中将a的值读到寄存器R0中;
2、修改寄存器R0的值;
3、将寄存器R0的值写回内存a中。

第一个时间片段执行 func_A,执行完第一步(从内存中将a的值读到寄存器R0中,a=R0=0),任务切换要释放CPU使用权。(任务切换之前会将现场保存下来 R0=0)
第二个时间片段执行 func_B,期间将3个步骤都执行完(a=R0=0;R0=R0+1=0+1=1; R0=a=1)后,任务切换要释放CPU使用权。
第三个时间片段,func_A接着执行,之前先将现场恢复(R0=0),执行后面两个步骤(R0=R0+1=0+1=1; R0=a=1)

在这里插入图片描述
通过上面的两个任务细分执行的过程,会发现当多个任务共用操作一个变量时,会发生异常。为了避免这种异常,引入互斥访问变量的方式。

使用队列实现互斥访问

在这里插入图片描述
当有多个任务操作变a时,为了确保每个任务操作a期间不被其他任务所影响,就调用队列来做隔离,任务B要去读a的值时直接调用队列处理好的数据即可。
队列的任务:1、关闭中断;2、环形缓冲区(操作a的值);3、链表操作;4、打开中断

当任务A调用队列关闭中断后,其他任务不会再被调度执行(相当于逻辑程序),操作完变量a之后,打开中断,此时恢复CPU调度机制。使用队列可以实现互斥访问,避免多个任务同时操作一个变量时造成的异常现象。

RTOS中 调度队列函数接口 :写队列xQueueSend,读队列xQueueReceive

休眠和唤醒机制

任务在读队列的时候会出现两种情况:
第一种情况、读到队列中的值返回;
第二种情况、队列读不到值,将任务休眠

场景:只有两个任务A和任务B,读写a的值
第一个时间片段:任务A 运行,在这个时间段中还没有调用队列修改a的值;
第二个时间片段:任务B运行,读队列,没有得到a的值,将任务B休眠;
第三个时间片段 —— 第五个时间片段:由于任务B处于休眠状态,因此任务A全速运行
第六个时间片段:任务A 写队列修改a的 值,并唤醒任务B
第七个时间片段:任务B 继续执行。
在这里插入图片描述
因此使用队列的方式,不仅能实现互斥访问,还能使用休眠和唤醒机制让CPU更高效的运行。
(注:唤醒任务B,任务B是不会马上执行,要等到下一个tick中断)

写队列的动作:1、修改 Data值;2、唤醒任务wake up
怎么知道唤醒哪个任务呢?队列链表Queue.list,将需要唤醒的任务放在链表里。

读队列的动作:1、有Data值,返回;2、无Data,休眠;
休眠:1、将任务从ReadyList移动到DelayList;2、将任务记录到Queue.list队列链表。

环形缓冲区

在这里插入图片描述
缓冲区本质上就是数组,假设这个缓冲区的长度为8,写缓冲区指针w刚开始在0的位置,每写一个val,指针w位置+(1%8),以此类推,最后的w+(8%8)。这样就形成闭环,也就是环形缓冲区。(读操作也是一样的)

由于链表的大小是有限的,所以当任务写缓冲区的时候发现已经写满了,就会将任务放到Queue.list队列链表中的list for send 链表中
在任务在读缓冲区的值时没有读出来,会将任务放到Queue.list队列链表中的list for receive 链表中

http://www.yayakq.cn/news/808619/

相关文章:

  • 勒流网站建设网银网站模板
  • 德阳市建设局官方网站安全月免费铺货诚招代理商
  • icp网站备案查询用phpcms建网站流程
  • 全国建筑网站北京短视频培训学校
  • 山东聊城网站设计网站备案换主体
  • 新兴县做网站的旅游网站开发背景及意义
  • 网站建设 深圳宝安做电子的外单网站有哪些的
  • 实现网站计划书济宁公司做网站
  • 网站风格设计描述网站查外链
  • 岳池建设局网站推广方案的推广内容怎么写
  • 建设项目招标在什么网站公示二次开发有没有前途
  • 杭州网站建设费用价格金华建设工程网站
  • 福州门户网站冠县网站设计
  • 旅游网站设计方案湖南手机版建站系统哪家好
  • 如何建设wap网站宣传软文模板
  • 天津河东网站建设公司建国电影院地址建国东路11号
  • 网站网络资源建立crm客户管理
  • 网站建设在线如何做网站来做淘宝客
  • 免费logo设计在线生成器钙网wordpress 4.9 优化
  • 乐清建设路小学校园网站淘客网站佣金建设
  • 网站主页不收录餐饮酒店网站建设
  • 米拓cms 网站模板在哪icp备案单位网站
  • 站长工具域名云梦建站
  • 凯里网站建设公司网页设计规范2018
  • 网站建设 内容缺乏wordpress 导出表单
  • 青浦区网站建设费用合肥论坛网
  • 匠人精神网站建设建设一个网站需要哪些员工
  • 兰州市建设厅官方网站国际1688网站
  • 爱站网关键词挖掘创建网站大约多少钱
  • 网站模板使用教程郑州市工程建设信息网