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 - 共享内存用于线程之间的通讯(轮询方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux档案权限655,Linux学习
- 下一篇: STM32H743+CubeMX-串口非