前言

在主程序里面做i++(i=10),在某个中断服务函数里面做i–,会出现主程序刚取出i的值得时候被中断打断,在中断里面做了i—(写回去的值为9),返回到断点后,主程会对i(已经取出的值)做加1操作,然后写回去(最终i=11;).------在主程序里面在对i操作之前先把中断关了,等操作完后再打开中断。
出现以上情况的原因是—打断。在Ucos中不可避免的会出现以上打断问题。因为ucos是以优先级作为调度原则,所以也存在打断问题。所以任务间间交换信息如果用全局变量,就存在以上问题。所以ucos任务间交换信息尽量的不要用全局变量。

Ucosii的任务间通信机制:信号量、互斥信号量、消息邮箱、消息队列、事件标志组

任务控制块:存放当前任务的相关信息(任务函数地址、任务优先级、任务栈、任务状态)

事件控制块:当成功创建一个事件(信号量、互斥信号量、消息邮箱、消息队列、事件标志组)后,系统就分配一段内存空间,这段空间就是事件控制块,存放这该事件的相关信息。

信号量

可以把信号量看成是一个计数器,表示当前资源的占用情况,当释放一个资源时信号量+1,如果占用一个资源,信号量-1。

  1. 要想使用信号量,必须先创建一个信号量,并且可以对这个信号量赋予一个初始值。
  2. 释放信号量,信号量就会+1
  3. 要想得到一个信号量,要先查看信号量是否为0,如果大于0表示当前可以去占用一个信号量,如果为 0表示当前信号量被用光了,可以死等其他任务释放信号量,也可以不等。
    函数原型:OS_EVENT *OSSemCreate(INT16U value);
    函数作用:建立并初始化一个信号量
    参数说明:建立的信号量的初始值,可以取 0 到 65535 之间的任何值。
    返回值:指向成功创建的信号量的事件控制块地址

函数原型:void OSSemPend (OS_EVENT *pevent,
INT32U timeout,
INT8U *perr);
函数作用:申请一个信号量(挂起任务等待信号量)。

函数原型:INT16U OSSemAccept(OS_EVENT *pevent);
函数作用:无等待查看信号量是否为0。

函数原型:INT8U OSSemPost(OS_EVENT *pevent);
函数作用:释放一个信号量,把信号值加 1

函数原型:void OSSemSet(OS_EVENT *pevent,
INT16U cnt,
INT8U *perr);
函数作用:改变当前信号量的计数值

消息邮箱

顾名思义,可以往邮箱里存放消息,这个消息的内容比信号量要更加丰富。
这个邮箱只能存放一则消息。
如果这个邮箱里存在消息没有被读取,然后再往里面存放消息,就会失败。

在消息邮箱里面,如果发送方能力比较强(发送速度快),接受方能力比较弱(接受得慢),那么就会丢失新的消息。

消息队列

消息邮箱只能存放一则消息,而消息队列则可以存放一队(多则)消息,相当于增强了接受方的能力
消息队列存放消息的方式是先进先出

创建一个消息队列:
OS_EVENT *OSQCreate (void **start,INT16U size)
start:指向用户创建一个存储区(数组),这个存储空间(数组)存放的是消息的地址。成功创建了消息队列后,创建的这个存储区(数组)就交由UCOSII去管理。
size:消息内存区的大小

发送一则消息
INT8U OSQPost (OS_EVENT *pevent,void *pmsg);
pmsg:消息的地址
发送多则不同消息需要发送不同的消息地址。

互斥信号量

对于互斥信号量: 二值,要么为0,要么为1
Pend/Accept: 想取得互斥信号量的控制权
Post: 释放互斥信号量的控制权。只有取得互斥信号量的任务post才有效
优先级翻转问题:
低优先级的任务取得了互斥信号量后,高优先的任务也想取得互斥信号量的控制权。这个时候高优先级的任务得不到互斥信号量,并且还会把低优先级的任务的优先级提升到一个设定的优先级(提升到的优先级在创建互斥信号量的时候已经指定,一般设置的优先级比想取得此互斥信号量的任务中最高的优先级还高)。

低优先级的任务和高优先级的任务同时都想要获取同一个互斥信号量,假如低优先级的任务先得到了这个互斥信号量,然后高优先级的任务就需要等待低优先级的任务释放该信号量才能得到。如果在低优先级释放信号量之前被其他不参与竞争这个互斥信号量的中等优先级任务抢走了CPU,就有可能发生低优先级的任务释放不了这个互斥信号量,使得在等待该信号量的高优先级任务真的等到死了。
所以,为了避免这种事情的发生,在低优先级的任务得到了互斥信号量后,高优先级的任务也想去获取而获取不到时,就会把得到该互斥信号量的低优先级任务的优先级提升到一个预定的比较高的优先级。当低优先级任务释放了互斥信号量后,就会把优先级回复到原来的级别。

如果高优先级的任务先的到了互斥信号量,而这时候低优先级的任务也想去获取,只能死等。

UCOSII操作系统的任务间通信相关推荐

  1. 任务间通信==ucosii

    文章目录 背景 信号量 消息邮箱 消息队列 背景 在主程序里面做i++(i=10),在某个中断服务函数里面做i–,会出现主程序刚取出i的值得时候被中断打断,在中断里面做了i-(写回去的值为9),返回到 ...

  2. VxWorks中信号量实现任务间通信与同步机制分析

    引 言 多任务内核.任务调度机制.任务间通信和中断处理机制,这些都是VxWorks运行环境的核心.多任务处理和任务间通信是实时操作系统的基石.一个多任务环境允许将一个实时应用构造成一套独立任务的集合, ...

  3. 系统间通信2:通信管理与远程方法调用RMI

    本文引用 : https://yinwj.blog.csdn.net/article/details/49120813 RMI : Remote Method Invocation,远程方法调用 RP ...

  4. 系统间通信1:阻塞与非阻塞式通信A

    版权声明:本文引用https://yinwj.blog.csdn.net/article/details/48274255 从这篇博文开始,我们将进入一个新文章系列.这个文章系列专门整理总结了目前系统 ...

  5. linux线程间通信优点,进程间通信与线程间通信【转】

    一个进程写管道:写入字节数小于PIPE_BUF是原子操作,写操作在管道缓冲区没有及时读走时发生阻塞. 一个进程读管道:读操作在管道缓冲区没有数据时发生阻塞. 以前一直想找个机会总结一下进程和线程的通信 ...

  6. 进程间通信线程间通信

    一.多进程: 首先,先来讲一下fork之后,发生了什么事情. 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进 ...

  7. Java 多线程(六)——进程间通信与线程间通信

    以前一直想找个机会总结一下进程和线程的通信机制,但由于技术和平台的局限性,一直没有找准切入点.由于马上要毕业了,对自己技术的总结和梳理的前提下写了本篇文章,如有错误之处,敬请拍砖和指教. 操作系统的主 ...

  8. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  9. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

最新文章

  1. oracle procedures批量删除带索引条件数据很慢_见微知著,数据库应用设计优化浅谈...
  2. python爬虫能赚钱吗-在校大学生用python当爬虫一个月能赚3000吗?
  3. ubuntu linux 编译 opencv
  4. FastDFS测试图片上传
  5. 5.5的performance_schema
  6. 普通用户使用docker命令
  7. for循环性能优化的几种思路
  8. 笔记本计算机bios设置,笔记本怎么进入bios设置【方法步骤】
  9. 小红花代表什么_《送你一朵小红花》:细品后才知道,结尾处的平行世界代表着什么...
  10. excel删除奇数行或者偶数行
  11. 高考数学必背公式整理[衡水中学高中数学组]
  12. SpringBoot2 学习5集成Thymeleaf
  13. (Emitted value instead of an instance of Error) postcss-viewport-units:
  14. 【教学类-30-01】5以内加法题不重复(一页两份)(包含1以内、2以内、3以内、4以内、5以内加法,抽取最大不重复数量)
  15. Google Chrome 中的高性能网络
  16. ios 自定义键盘的按键音效和震动效果
  17. braintree 整合国外信用卡支付(visa等)
  18. mysql intersect 使用方法_MySQL INTERSECT运算符
  19. summernote 的快速使用,以及解决图片写入数据库问题
  20. java基础48 IO流技术(序列流)

热门文章

  1. 【解决方法】windows 运行 appium 提示 OSError: [WinError 10049] 在其上下文中,该请求的地址无效
  2. B2B2C商城系统开发模式有哪些?
  3. DoS 拒绝服务攻击专题
  4. 史上最全 Appium 自动化测试从入门到框架实战精华学习笔记(二)
  5. 海量案例!生成对抗网络(GAN)的18个绝妙应用
  6. 「NOIP2018模拟赛」 摘果子 - 树形Dp
  7. 电力电子转战数字IC20220819day64——uvm实战1A
  8. 打造千万级流量秒杀第十课 Web 安全:如何解决重放攻击和 XSS 注入?
  9. 网页被篡改怎么防护?
  10. 1688订单API接口