文章目录
- 一、前言
- 怎样防止内存溢出?
- 二、实验目的
- 三、代码
- 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算法提供了没有信息可以读取的提示,防止读取数据引起内存溢出。