《基于嵌入式实时操作系统的编程技术》笔记清单:第三章任务划分.
《基于嵌入式实时操作系统的编程技术》笔记清单:第四章任务设计.
《基于嵌入式实时操作系统的编程技术》笔记清单:第五章中断服务程序设计.
《基于嵌入式实时操作系统的编程技术》笔记清单:第六章行为同步.
《基于嵌入式实时操作系统的编程技术》笔记清单:第七章资源同步.
《基于嵌入式实时操作系统的编程技术》笔记清单:第八章数据通信.
《基于嵌入式实时操作系统的编程技术》笔记清单:第九章时间管理.
《基于嵌入式实时操作系统的编程技术》笔记清单:第十章采集任务设计.

前言

在实时操作系统的支持下,系统的整体功能是通过各个任务(包括ISR)的协同运行来实现的,这种协同关系包括运行步骤的协同,这种协同操作就是“行为同步”。

本章笔记清单

1. 二值信号量

1)使用范围:生产的产品永远“供不应求”,消费者“总是处于等待状态”。即:生产的速度比消费的速度慢。

2. 计数信号量

1)生产速度可以比消费的速度快,当然也可以慢。它的内部实现的机制是一个计数器,每生产一次,计数+1;每消费一次,计数-1。
2)场合:比如一个步进电机,转一圈需要1分钟。触发一次按键,电机就转一圈。按键相当于生产者,电机相当于消费者。电机消费的速度比按键生产的速度要慢,当然,快与慢取决于你按下的频率。此时,我一次性按10次,则计数信号量累加到10。接着,电机任务收到释放的信号,每转一圈,信号量减1,直到为0,最后挂起。这期间,电机一共花费了10分钟。
3)在ucos-ii中,“信号量”实际上就是“计数信号量”。

3. 事件标志组 (OSFlagCreate )

1)多个任务协同控制一个任务。
2)创建一个事件标志组,实际上是二值信号量组成的表。
3)举例:

假如,完成了功能4,功能5,功能7,功能10。接着,将它们对应的位置都置1,最后,在某个任务中判断这四个功能是否都完成了,完成了就执行下一步。

4. 消息邮箱

1)消息邮箱只能存放一条消息。消息是void类型,意味着,可以存放任意数据类型的消息。
2)使用的前提:生产速度低于消费速度,与二值信号量类似。
3)通常放入“空邮箱”(放入一个空指针(void
)0)表示事件没有消息,用“非空邮箱”(放入一个非空指针(void*)1)表示事件已经发生。也就是说,”消息邮箱可以当作“二值信号量”使用。系统中需要同时使用二值信号量和消息邮箱时,可以只使用消息邮箱一种通信手段,将有关二值信号量的代码全部剪裁掉,达到简化系统的目的。

5. 消息队列

1)可存放多个消息,与计数信号量情况类似。
2)满足条件:生产速度大于消费速度。当然,消费时候需要快速处理邮箱的内容,不然邮箱会存满。
3)消息队列可当作缓冲区。

6. 两个任务之间的单向同步

1)如果控制方优先级低于被控方,控制方发出信号后,被控方立即发生任务切换(因为,释放一个信号时,产生一次调度),瞬间的同步效果好。
2)如果控制方优先级高于被控方,控制方发出信号后,则瞬间同步效果差。被控方实时要求不高,或采用有缓冲功能的通信手段,这是可以接受的。通常采用“尾触发方式”来改善同步效果,即控制方发出信号后,立即调用延时,延时时间打与被控制方任务的处理时间。

7. 两个任务之间的双向同步


1)特点:它使生产者生产速度受到了消费者的反向控制,达到“产销平衡”的理想状态。
2)举例:蜂鸣器任务响一声后,向显示任务发送消息,并等待回答,显示任务得到消息后进行一次更新,再对进行蜂鸣器进行回复。最终效果为,蜂鸣器响一次,显示数字加1。

8. 两个任务以上同步一个任务

1)使用”事件标志组“

1. OSFlagPend(FLAG, 0X03,            //最低两位OS_FLAG_WAIT_SET_ALL  //满足的条件使,最低两位为1+ OS_FLAG_CONSUME,       //获取成功后,清楚标志位0, &err);
//一直挂起,知道FLAG的值为0x03才继续往下执行。2.OSFlagPost(FLAG,0X01,OS_FLAG_SET,&err);
3.OSFlagPost(FLAG,0x02,OS_FLAG_SET,&err); //在其他任务将最低两位置为1,表明当前任务完成了。

9. 多任务相互同步


1)当三个任务都”签到“后,才能从同步点(等待点)往下执行。根据被挂起任务优先级顺序来执行。
2)假如第三个任务是最后的”签到“者,它”签到“后,立马产生调度,寻找最高优先级的任务,此时,第三个任务还没被OSFlagPend挂起。在等待中的高优先级任务执行完被挂起后,第三个任务才有机会执行OSFlagPend, 此时它无需等待就能往下执行。如果最后执行的任务是最高优先级,Post之后就直接往下执行,无需等待。
3)上述方法存在一些问题:①怎么知道最后一个”签到“是哪个任务;②在最后一个任务未清除标志组之前,更高优先级可能执行了多次。
4)针对以上问题,做出了调整:使用”签到“计数器,并且配合一个邮箱。每个任务插入这一段代码,很轻松地解决上述的问题,实现多个任务互相同步。

while(1)
{if(count == total-1) //total是需要同步任务的个数,判断是否到达最后一个{                   //是达到最后一个count = 0;        //清除”签到“计数器OSMboxPostOpt(MyBox, (void*)1, OS_POST_OPT_BROADCAST);  //发送消息同步,进行消息分发,广播}else{                   //不是最后一个count ++;         //”签到“OSMboxPend(Mybox, 0, &err);       //等待同步消息}
}

5)多任务同步,保证在任务情况下,各个任务的有效执行次数都相同,而且等于运行速度最低的任务执行的执行次数。相当于木桶理论。
6)多任务同步方式具有”团队作战“特点,它可用在一个需要多任务配合进行的循环作业。如:在配料系统。



10.题外话

既然大众都活在假象里,那么在世界上要想取得成功,真正的逻辑是什么?

请记住下面这八个字:看清真相,制造幻象。

这就是一切商业/政治/艺术的核心要领,大众从不想要真相,它们只是渴望被理解,被认同。所以千万不要用你认为的真相强加于人,你只需要理解它们目光的狭隘,制造故事和幻想让它们沉迷,你就能大获成功了。
——转自水木然学社公众号文章《99%的人都活在假象里,只能被反复收割!》

《基于嵌入式实时操作系统的编程技术》笔记清单:第六章行为同步相关推荐

  1. Linux shell编程学习笔记-----第十六章

    shell 脚本调试技术:trap命令 tee命令 调试钩子  和shell选项.前三者都需要修改shell脚本的源代码,后者不需要. trap 命令用于捕捉信号,shell脚本在执行时,会产生三个所 ...

  2. UNIX环境高级编程 学习笔记 第十六章 网络IPC:套接字

    socket的设计目标之一:同样的接口既可以用于计算机间通信,也可以用于计算机内通信.socket接口可采用许多不同的网络协议进行通信,本章讨论限制在因特网事实上的通信标准:TCP/IP协议栈. 套接 ...

  3. 《VC++深入详解》学习笔记 第十六章 线程同步与异步套接字编程

    (颠簸喜悲幽若尽是无情人) 事件对象成员: 包含(使用计数.事件类型.事件状态) 事件类型: 人工重置的事件对象:得到通知时,等待的所有线程都变为可调度     自动重置的事件对象:得到通知时,等待的 ...

  4. 提高C++性能的编程技术笔记:单线程内存池+测试代码

    频繁地分配和回收内存会严重地降低程序的性能.性能降低的原因在于默认的内存管理是通用的.应用程序可能会以某种特定的方式使用内存,并且为不需要的功能付出性能上的代价.通过开发专用的内存管理器可以解决这个问 ...

  5. Multi-thread提高C++性能的编程技术笔记:单线程内存池+测试代码

    频繁地分配和回收内存会严重地降低程序的性能.性能降低的原因在于默认的内存管理是通用的.应用程序可能会以某种特定的方式使用内存,并且为不需要的功能付出性能上的代价.通过开发专用的内存管理器可以解决这个问 ...

  6. uc os ii与linux,uC/OS-II嵌入式实时操作系统的几大特点

    uC/OS-II嵌入式实时操作系统的几大特点 出处:网络 发布于:2018-09-12 14:46:03 uC/OS-II的特点 1.uC/OS-II是由Labrosse先生编写的一个开放式内核,主要 ...

  7. 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码

    虚函数:在以下几个方面,虚函数可能会造成性能损失:构造函数必须初始化vptr(虚函数表):虚函数是通过指针间接调用的,所以必须先得到指向虚函数表的指针,然后再获得正确的函数偏移量:内联是在编译时决定的 ...

  8. 嵌入式实时操作系统的基本概念

    第一章 嵌入式实时操作系统的基本概念 1.1计算机操作系统 1.计算机是一种功能强大的数字运算装置,由中央微处理器(CPU),存储器,接口及外部设备等物理装置构成,构成计算机的物理装置即硬件系统. 2 ...

  9. 提高C++性能的编程技术笔记:编码优化+测试代码

    缓存:在现代处理器中,缓存经常与处理器中的数据缓存和指令缓存联系在一起.缓存主要用来存储使用频繁而且代价高昂的计算结果,这样就可以避免对这些结果的重复计算.如,循环内对常量表达式求值是一种常见的低性能 ...

最新文章

  1. explode php 报错,PHP函数explode和split的区别
  2. Nginx的安装和多域名配置的实现方法
  3. Myeclipse+mysql出现中文乱码情况
  4. 腾讯郑兴:原生安全+协同防御是政企云安全治理的基石
  5. win7下ffmpeg编译动态链接库整理
  6. 大道五目Flash英文版(Renju Problems)程序分析之禁手判断
  7. EDAS投稿出现问题: notembedded: Upload failed: The font Helvetica is not embedded in the file
  8. 硬盘安装linux_Surface-Laptop3 安装Archlinux折腾小记
  9. 苹果 5G 掉队?!
  10. Python之路【第六篇】:Python运算符
  11. 《移动平台开发实践》第2周作业
  12. masql redis
  13. js constructor 和 instanceof
  14. Linux下分割、合并文件——dd和cat
  15. openmeetings(开源视频会议系统)的详细安装步骤 (windows版)
  16. 轻量级Java EE企业应用实战(第4版) Struts 2+Spring 4+Hibernate整合开发 含CD光盘1
  17. matlab描点连线及坐标轴里外颜色改变
  18. 怎么用python扫描主机_如何调用python-nmap来实现扫描局域网存活主机(代码)
  19. GoFrame+vue的前后端分离开源项目
  20. Linux查询系统上次启动时间last reboot、上线时间uptime

热门文章

  1. 细细品味C#——抽象、接口、委托、反射
  2. 基于matlab的电机故障诊断,基于BP神经网络的电机故障诊断的研究(MATLAB,程序)
  3. html 表头单元格换行,Table组件怎样在单元格长文本不换行情况下正确对应表头与单元格?...
  4. 抵押房怎么办理房产证
  5. 麒麟os或将取代android,国产自研操作系统新希望!华为或自研麒麟OS欲取代Android...
  6. C++ STL(第二十篇:算法-- 排序)
  7. 【HCIA-cloud】【4】服务器虚拟化之存储资源管理:存储资源类型说明、存储配置模式说明【普通、精简、延迟置零】、虚拟机磁盘类型说明、FusionCompute中操作添加存储
  8. 蚂蚁系统案例2【无标题】
  9. 网络编程(wireshare抓数据包及分析、三次握手与四次挥手、数据库sqlite3及操作)笔记-day15
  10. python3爬虫图片_Python3 实现淘女郎照片爬虫