RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)
文章目录
- 一、前言
- 怎样防止内存溢出?
- 二、实验目的
- 三、代码
- 3.1、main.h
- 3.2、main.c
- 四、Debug
- 4.1、Debug (printf) Viewer
- 4.2、修改一下程序:线程B不从ringbuffer读取数据,线程A不断往ringbuffer写入数据
一、前言
正如官方介绍所说,共享内存是线程与线程(或ISR)之间通讯的一种基本的模型。而且,当线程与线程之间的通讯使用共享内存时,相比消息队列有更高的通讯效率,更复杂的通讯结构。
有了共享内存之后,并不是说消息队列毫无用处之地了。消息队列使用起来简单,并提供阻塞线程的功能。实际工作上,如果不讲究效率的话,尽量用消息队列吧,它即简单又强大又安全。
虽然,内存池解决了线程安全与内存碎片化的问题,但是并没有解决内存溢出的问题。
在《嵌入式实时操作系统 uc/OS-III 》第17章-存储管理有讲到。
怎样防止内存溢出?
为了解决内存溢出问题,需要使用另外一个强大的数据结构与算法-ringbuffer算法。我认为学习嵌入式软件设计,必须学会如何使用ringbuffer算法。在实际工作中,我到处都用了ringbuffer算法。
ringbuffer算法的介绍可以看博主Mculover666的博文《ringbuffer | 通用FIFO环形缓冲区实现库》 :
其实,上面的ringbuffer算法比较完整且复杂。我一直使用正点原子项目上精简版的ringbuffer算法,暂时没有发现任何问题,大家可以从工程里下载。
STM32工程:
链接:https://pan.baidu.com/s/149P8nuSoXNWenEc479iYIQ
提取码:1hj5
二、实验目的
创建一个内存池,作为线程A与线程B通讯使用的共享内存,线程A每隔1s往共享内存里写入数据,线程B每隔300ms轮询一次共享内存是否有新数据。
三、代码
3.1、main.h
3.2、main.c
四、Debug
4.1、Debug (printf) Viewer
4.2、修改一下程序:线程B不从ringbuffer读取数据,线程A不断往ringbuffer写入数据
线程A的不断写入,且线程B没有读取数据,会不会引起内存溢出??首先将线程B的部分代码备注掉,备注掉这些代码,线程B实际没有什么事情干。
创建ringbuffer的时候,已经往ringbuffer写入一个数据,所以接下来只能写入7个数据。
此时,观察一下ringbuffer对象的数据看看。
写入数据的指针在0x0007的位置(这段共享内存的大小是8,从0x0000开始,实际上0x00007就是第八个位置了。)
在写入数据方面,ringbuffer算法提供了内存满了的提示,防止写入数据引起内存溢出。在读取数据方面,ringbuffer算法提供了没有信息可以读取的提示,防止读取数据引起内存溢出。
RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)相关推荐
- RTX5 | 内存池04 - 共享内存用于线程之间的通讯(阻塞方式)- 使用信号量
文章目录 一.前言 二.实验目的 三.代码 3.1.main.h 3.2.main.c 四.Debug 4.1.System Analyzer 4.2.Debug (printf) Viewer 一. ...
- linux如何创建共享内存,linux实现共享内存同步的四种方法
https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...
- nginx内存池大小快内存_使用直接内存时可以更快
nginx内存池大小快内存 总览 使用直接内存不能保证提高性能. 考虑到它增加了复杂性,除非有充分的理由使用它,否则应避免使用它. 塞尔吉奥·奥利维拉(Sergio Oliveira Jr)的这篇出色 ...
- mmap内存映射、system V共享内存和Posix共享内存
linux内核支持多种共享内存方式,如mmap内存映射,Posix共享内存,以system V共享内存.当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二选择.它能够最大限度的 ...
- linux map内存在哪里分配,brk mmap madvise 内存分配以及共享内存
mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...
- 以通信方式共享内存,不要以共享内存方式通信(2)
继续以"以通信方式共享内存,不要以共享内存方式通信"这句话展开. 从云原生开始. 云原生是面向微服务的架构,而消息传递是微服务交互的媒介,每个工人都接触过关于消息队列的概念,正是消 ...
- 多线程Synchronized锁的使用与线程之间的通讯
多线程Synchronized锁的使用与线程之间的通讯 一.什么是线程安全问题 二.如何解决线程安全问题 三.synchronized锁的基本用法 1.修饰代码块(this锁) 2.修饰实例方法(th ...
- java轮询文件停止线程,java 运行多线程轮询时,外部停止轮询
1,先建一个Map /** * 创建一个Map用于存放线程id对象集合,主要是用于到达岗亭之后扫码付费,如果人工收费就需要关闭线程,key是停车记录Id, */ public static MapMA ...
- python多进程共享内存_python 进程间通信 共享内存
python多进程通信实例分析 python多进程通信实例分析操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那 ...
最新文章
- P1156 垃圾陷阱
- 正在搜索需要的文件_装机必备!分享4个电脑软件,3分钟搞定文件管理难题!...
- 分块试水--CODEVS5037 线段树练习4加强版
- asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式
- 【转】jQuery中的bind(),live(),delegate(),on()事件绑定方式的区别
- Linux常用的分区方案及目录结构
- STM32 - 定时器的设定 - 基础- 02 - Capture/compare channels 和相关设置寄存器 - 和STM32缩写词条解释
- Redmine Gantt 实现 (Show relations in Gantt diagram)
- builder forms oracle 函数如何使用_Oracle EBS 之 Forms开发 一
- fullPage最后一屏自适应
- java宿舍管理系统主要功能_Java学生宿舍管理系统主要内容及特点
- Vivado中异步FIFO IP核的使用与思考
- 小明历险记:规则引擎Drools教程详解
- word转03版本公式变成图片_word2013公式编辑器_Word 2013保存的时候突然发现公式变成图片怎么办?_word文档打字的时候...
- Windows 10出现0x8000ffff错误应该如何解决?
- 使用linaro工具链编译ARM64架构内核
- 计算机桌面分区,明基XL2430T如何使用桌面分区?
- 如何利用网站优化给网站引流做营销
- 【vue】纯前端登录验证码实现记录
- 论文阅读:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation